Подъем в Javascript === Компиляция?

9

Я наткнулся на интересную точку зрения на недавнем собеседовании.

Подъем в Javascript - это перемещение объявлений переменных и функций вверху скрипта. Можем ли мы назвать этот этап компиляцией ?

Мне известно о том, что интерпретатор Javascript имеет 2 прохода над входным скриптом, где на первом проходе он выполняет подъем, а на втором проходе он фактически выполняет скрипт. Зная, что Javascript - это интерпретируемый язык, этот вопрос меня немного смутил.

Рахул Десаи
источник

Ответы:

18

Нет. Подъем не является сборником.

Подъем - это концепция, созданная разработчиками для объяснения того, что происходит во время компиляции, когда переменные и объявления функций перемещаются в верхнюю часть их содержащей области.

Компиляция - это то, что происходит, когда ваш код Javascript превращается в какое-то другое представление (обычно это какой-то исполняемый код), которое должно выполняться либо сейчас, либо позже. Движок Chrome V8 Javascript на самом деле имеет два компилятора; один для создания быстрого и грязного исполняемого кода сейчас, другой для создания оптимизированного кода позже.

Языки программирования не определяются как «скомпилированные» или «интерпретируемые» языки. Скорее, языки интерпретируются или компилируются по мере необходимости.

Дальнейшее чтение
Подъем в Javascript
Как работает двигатель V8

Роберт Харви
источник
1
Статья в Википедии об интерпретируемых языках также полезна для различия между «интерпретированным» и «скомпилированным»: en.wikipedia.org/wiki/Interpreted_language
Если я правильно понимаю, Hoisting не конвертирует скрипт в машиночитаемый код, поэтому это не компиляция . Я прав? :)
Рахул Десаи
Прочтите второй абзац моего ответа еще раз.
Роберт Харви
1
В моем недавнем разговоре с этим интервьюером на эту тему он дал мне ссылку на курс Advanced JS на FrontendMasters.com, где Кайл Симпсон объясняет, что это компиляция, в том смысле, что если мы сравним это, например, со сценариями Bash, не будет знать, чего ожидать в строке № 4, пока она находится в строке № 3. Однако в случае компилятора JS он видел, что находится в строке № 4 ранее во время прохода подъема. Просто он не конвертируется в двоичный код в отличие от других языков. Javascript компилируется при каждом запуске.
Рахул Десаи