Czy Google Closure to prawdziwy kompilator?

19

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?

James Allardice
źródło
2
Założę się, że JS to wynik jest właściwym podzbiorem wszystkich legalnych JS; w tym sensie jego językiem wyjściowym jest „inny” język.
AakashM,

Odpowiedzi:

23

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

  • Nazwij to Google Closure Foogle i wprowadź do leksykonu zupełnie nowe, bez znaczenia, słowo.
  • Nazwij go Google Closure Minoptivalidator, który jest bardziej intencyjny, ale trudniejszy do zapamiętania.
  • Nazwij go Kompilatorem zamknięcia Google, który jest bardzo bliski prawdy.

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”?

pdr
źródło
Chodziło o to, aby naprawdę zobaczyć, co ludzie postrzegają jako „kompilator”. Jak stwierdził 0A0D, to tylko semantyka, ale właśnie zastanawiałem się, dlaczego Google czuł potrzebę wyjaśnienia, że ​​to „prawdziwy kompilator”. +1 za „Minoptivalidator”!
James Allardice,
@JamesAllardice: Znowu, ponieważ jeśli możesz przekonać ludzi, że jest to kompilator, definicja kompilatora rozciąga się na uwzględnienie go. W tym przypadku jest to naprawdę uczciwe. Jeśli zdefiniujesz nowe słowo, które oddziela je od kompilatora linią półmatyczną, twój produkt zostanie sklasyfikowany jako „prawie, ale nie całkiem”.
pdr
1
Nie wiem, lubię „Google Foogle” :-)
GrandmasterB,
9
Głosuję za Minoptival. Brzmi jak dinozaur. Wszyscy lubią dinozaury, prawda?
Izkata,
2
@Izkata: Jeśli jest coś, czego nauczyła nas historia ewolucji, jest to, że JavaScript nie będzie zawarty. JavaScript uwalnia się, rozszerza się na nowe terytoria i przebija się przez bariery boleśnie, a może nawet niebezpiecznie.
pdr
9

Na tej podstawie powiedziałbym, że Google Closure nie jest kompilatorem.

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 ):

2) (Informatyka) - program, który tłumaczy inny program napisany w języku wysokiego poziomu na język maszynowy, aby można go było wykonać.

2) (Elektronika i informatyka / Informatyka) program komputerowy, za pomocą którego język programowania wysokiego poziomu, taki jak COBOL lub FORTRAN, jest konwertowany na język maszynowy, na który może reagować komputer.

Program komputerowy skojarzony z niektórymi językami programowania, który konwertuje instrukcje napisane w tych językach na kod maszynowy, który może być później wykonany bezpośrednio przez komputer.

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.

Stephen C.
źródło
2
+1, jak na ironię, JS jest zarówno „językiem maszynowym” dla sieci, jak i „językiem programowania wysokiego poziomu”.
K.Steff,
3
+1 i plus dla „zakłada, że ​​Wikipedia jest autorytatywna w tym punkcie”. Zbyt wielu ludzi ślepo akceptuje to, co się tam dzieje.
Marjan Venema,
6

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.

Javier
źródło
1
Dzięki, to ciekawa odpowiedź. Myślę, że twoje wyjaśnienie może zaoferować lepszą definicję „kompilatora” niż Wikipedia i różne słowniki cytowane przez innych.
James Allardice,
Cóż, podoba mi się ta odpowiedź i głosowałem za nią w pewnym momencie, ale chciałbym zauważyć, że można całkowicie skompilować (w tradycyjnym sensie językowym wysokiego poziomu do języka maszynowego) bez budowania AST. Zobacz na przykład: Zbudujmy kompilator . Teraz z pewnością jest prawdą, że kompilator z samouczka Crenshaw jest dość prymitywny, ale nie sądzę, aby ktokolwiek oskarżył go, że nie jest kompilatorem.
dmckee,
Nie przeczytałem tego odniesienia, ale zgodziłbym się, że wyraźna AST nie jest absolutnie konieczna do kompilacji. Jednak w większości przypadków istnieje równoważna struktura, jawna w danych lub niejawna w wykonaniu (może stos wywołań (lub jego ewolucja w czasie) odzwierciedla analizę składni). Chodzi mi przede wszystkim o to, że kompilacja nie jest manipulacją tekstem, ale generowaniem kodu na podstawie analizy jakiegoś kodu źródłowego.
Javier
4

Moim zdaniem to semantyka. W tradycyjnym znaczeniu nie jest to kompilator. Jednak w tym samym linku Wikipedii jest napisane

Kompilator prawdopodobnie wykona wiele lub wszystkie z następujących operacji: analiza leksykalna, przetwarzanie wstępne, parsowanie, analiza semantyczna (tłumaczenie sterowane składnią), generowanie kodu i optymalizacja kodu.

Zamknięcie wykonuje niektóre lub wszystkie z tych operacji.

Nieco dalej w artykule w Wikipedii

Jednak w praktyce rzadko jest coś o języku, który wymaga wyłącznie kompilacji lub interpretacji, chociaż możliwe jest zaprojektowanie języków, które polegają na ponownej interpretacji w czasie wykonywania.

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 .

Brian
źródło
To tylko semantyka, masz rację. Chodziło o to, aby zobaczyć, jak ludzie postrzegają „kompilator” jako. Nadal nie sądzę, że Kompilator Zamknięcia jest „prawdziwym kompilatorem”, ale wykonuje wiele podobnych działań.
James Allardice,
3

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”.

Alan
źródło