Podnoszenie w JavaScript === Kompilacja?

9

Na niedawnej rozmowie o pracę natknąłem się na interesującą perspektywę.

Podnoszenie w Javascripcie polega na przenoszeniu deklaracji zmiennych i deklaracji funkcji na górze skryptu. Czy tę fazę możemy nazwać kompilacją ?

Zdaję sobie sprawę z tego, że interpreter JavaScript ma 2 przejścia nad skryptem wejściowym, przy czym w pierwszym przejściu wykonuje podnoszenie, a podczas drugiego faktycznie wykonuje skrypt. Wiedząc, że Javascript jest językiem interpretowanym, to pytanie trochę mnie pomieszało.

Rahul Desai
źródło

Odpowiedzi:

18

Nie. Podnoszenie nie jest kompilacją.

Podnoszenie to koncepcja, która została stworzona przez programistów w celu wyjaśnienia, co dzieje się podczas kompilacji, gdy zmienne i deklaracje funkcji są przenoszone na szczyt ich zakresu.

Kompilacja ma miejsce, gdy kod JavaScript jest zamieniany w inną reprezentację (zwykle jakiś kod wykonywalny), który ma być wykonany teraz lub później. Silnik V8 przeglądarki Chrome w rzeczywistości ma dwa kompilatory; jeden do tworzenia szybkiego i brudnego kodu wykonywalnego teraz, drugi do tworzenia zoptymalizowanego kodu później.

Języki programowania nie są zdefiniowane jako języki „skompilowane” lub „zinterpretowane”. Języki są raczej interpretowane lub kompilowane w razie potrzeby.

Dalsza lektura
Podnoszenie w JavaScript
Jak działa silnik V8

Robert Harvey
źródło
1
Artykuł w Wikipedii na temat języków interpretowanych jest również pomocny w rozróżnieniu „interpretowany” vs. „skompilowany”: en.wikipedia.org/wiki/Interpreted_language
Jeśli dobrze to rozumiem, Hoisting nie konwertuje skryptu na kod do odczytu maszynowego, więc nie jest to kompilacja . Czy mam rację? :)
Rahul Desai
Przeczytaj ponownie drugi akapit mojej odpowiedzi.
Robert Harvey
1
W mojej niedawnej rozmowie z tym wywiadem na ten temat podał mi odniesienie do kursu Advanced JS na FrontendMasters.com, gdzie Kyle Simpson wyjaśnia, że ​​jest to kompilacja, w tym sensie, że jeśli porównamy to do skryptów Bash, na przykład, to nie wiedziałby, czego się spodziewać na linii nr 4, gdy jest ona na linii nr 3. Jednak w przypadku kompilatora JS zobaczył to, co jest na linii nr 4 wcześniej podczas podnoszenia. Po prostu nie jest konwertowany na kod binarny w przeciwieństwie do innych języków. JavaScript jest kompilowany przy każdym uruchomieniu.
Rahul Desai,