To pytanie jest inspirowane debatą w komentarzach do tego pytania dotyczącego przepełnienia stosu . Dokumentacja Google Closure Compiler zawiera następujące informacje (wyróżnienie dodane):
Kompilator zamknięcia to narzędzie do szybszego pobierania i uruchamiania JavaScript. To prawdziwy kompilator dla JavaScript. Zamiast kompilować z języka źródłowego na kod maszynowy, kompiluje z JavaScript do lepszego JavaScript.
Jednak Wikipedia daje następujące definicja „kompilator”:
Kompilator to program komputerowy (lub zestaw programów), który przekształca kod źródłowy napisany w języku programowania (języku źródłowym) na inny język komputerowy ... Przepisywanie języków to zwykle program, który tłumaczy formę wyrażeń bez zmiany język.
Na tej podstawie powiedziałbym, że Google Closure nie jest kompilatorem. Ale fakt, że Google wyraźnie stwierdza, że w rzeczywistości jest „prawdziwym kompilatorem”, zastanawia mnie, czy jest coś więcej. Czy Google Closure to naprawdę kompilator JavaScript?
źródło
Odpowiedzi:
Kompilator zamknięcia jest urządzeniem wielofunkcyjnym , optymalizatorem i walidatorem . Ten rodzaj umieszcza go w swojej własnej kategorii, ponieważ masz rację, że kompilator powinien przynajmniej wziąć coś, co nie będzie działać w jego obecnej formie i przekształcić go w coś, co będzie (weź TypeScript na przykład oparty na ECMAScript).
Ale czy obwiniasz Google za rozciąganie terminologii? Jak jeszcze mieli to nazywać? Google Minifier? Nie, to coś więcej, a są ich setki. Optymalizator Google? To o wiele więcej. Google Validator? Nie, to też znacznie więcej.
Więc wybór jest
Robi wszystko, czego można oczekiwać od kompilatora, z jedynie różnicą semantyczną. I ostatecznie wszystkie słowa są do pewnego stopnia określone przez ich użycie. Jeśli więc Google może przekonać ludzi do nazywania tego kompilatorem, definicja kompilatora nieznacznie się zmienia. Na pewno nie w jakikolwiek sposób, który spowoduje problem.
Lub, wracając do wcześniejszego przykładu, czy możesz znaleźć coś znaczącego w TypeScript, który pozwala nazwać go „prawdziwym kompilatorem”, podczas gdy Kompilator Google Closure powinien być ograniczony do „prawie kompilatora”?
źródło
Minoptival
. Brzmi jak dinozaur. Wszyscy lubią dinozaury, prawda?No tak ... ale to zakłada, że Wikipedia jest autorytatywna w tej kwestii.
I w przeciwieństwie do definicji Wikipedii, rozważ niektóre definicje słownikowe (z http://www.thefreedictionary.com/compiler ):
To prawda, że wszystkie te definicje są nieco staromodne, ale ilustruje to, że nie ma „jednego prawdziwego znaczenia” ... i rzeczywiście znaczenia terminów takich jak „kompilator” zmieniają się z czasem. (I IMO jest w porządku, ponieważ tak naprawdę nie potrzebujemy dokładnej definicji dla tego przypadku.)
Debata, czy kompilator Zamknięcia jest „prawdziwym kompilatorem”, czy nie (IMO) nie jest owocną działalnością. Bardziej przydatne byłoby zrozumienie, co ludzie Google rozumieją przez „prawdziwy kompilator” ... w tym kontekście.
źródło
Myślę, że powodem, dla którego można go nazwać „prawdziwym kompilatorem”, jest to, że tworzy on z programów pełne AST (abstrakcyjne drzewo semantyczne) i używa go do generowania nowego tekstu.
Fakt, że zarówno oryginalny, jak i wynikowy tekst są poprawnymi skryptami JavaScript, jest zwykłym przypadkiem.
Jest to ważne, ponieważ istnieje wiele narzędzi, które wykonują tylko manipulacje tekstem w kodzie (minizatory, prettifier itp.), Ale nie obsługują AST, a tym bardziej nie generują kodu. Nawet jeśli narzędzia te są coraz bardziej wydajne, nie są tego samego rodzaju oprogramowaniem, a ograniczenia są różne.
źródło
Moim zdaniem to semantyka. W tradycyjnym znaczeniu nie jest to kompilator. Jednak w tym samym linku Wikipedii jest napisane
Zamknięcie wykonuje niektóre lub wszystkie z tych operacji.
Nieco dalej w artykule w Wikipedii
Biorąc to pod uwagę, wydaje mi się, że łatwiej było nazwać go „ Kompilatorem zamknięcia ” niż „Optymalizatorem zamknięcia”, ponieważ tak naprawdę to po prostu optymalizacja JavaScript dla przeglądarek, niekonieczne tłumaczenie go na inny język lub kod bajtowy.
Kompilator zamknięcia jako rzeczownik to non-sequitur .
źródło
Po pierwsze, usuńmy to z kompilatora typu źródło-źródło. Nie można powiedzieć, że coś nie jest kompilatorem, ponieważ wynik końcowy nie jest kodem niższego poziomu.
Chociaż poprawne jest, że Kompilator Zamknięcia generuje AST i ma frazę generowania kodu, wiele minimalizatorów JavaScript już to robi i prawdopodobnie nie nazwałbym ich też kompilatorami.
Tym, co naprawdę wyróżnia Closure Compiler, jest zastosowanie wielu dobrze znanych technik kompilatora do wykrywania i optymalizacji błędów. Oto kilka przykładów:
System typów:
Kompilator zamknięcia definiuje system typów z adnotacjami. Wykorzystuje techniki wnioskowania typu, których używa wiele kompilatorów do sprawdzania programu pod kątem błędów.
Optymalizacje międzyproceduralne
Kompilator zamknięcia buduje wykresy wywołań, aby zmienić nazwę i usunąć martwy kod na całym poziomie programu.
Optymalizacje wewnątrzprocesowe
Kompilator zamknięcia optymalizuje Javascript, stosując różne analizy kontroli przepływu, a także analizę przepływu danych. Klasyczne techniki kompilatora, takie jak: Inlining, Register Allocation, Live Variable Analysis .. i wiele innych są wykorzystywane do wyciskania ostatniego bajtu z wyjściowego Javascript.
System modułowy
Mniej znana część kompilatora zamykania, której można użyć do podzielenia kodu na osobne pobieranie, co skraca czas uruchamiania. Wykorzystuje również wiele algorytmów graficznych. Coś jest również bardzo powszechne w „tradycyjnych” kompilatorach.
Wszystkie te kompilatory i techniki analizy statycznej wyróżniają kompilator Closure spośród innych minimalizatorów Javascript. Odejmując fakt, że docelowy język wejściowy i wyjściowy jest taki sam, nie rozumiem, dlaczego nie jest klasyfikowany jako „prawdziwy kompilator”.
źródło