Что значит интерпретируемый или компилируемый язык
Что проверяют
Понимаете ли, что происходит с вашим кодом между сохранением файла и выполнением в браузере, и не застряли ли вы на представлении «JavaScript читается построчно». Вопрос базовый, но по ответу видно уровень.
Как отвечать
Компилируемый подход это заранее перевести исходник в машинный код целиком, интерпретируемый это выполнять программу другой программой по ходу чтения. Первая поправка: это свойство не языка, а реализации, стандарт JavaScript про способ выполнения не говорит ничего.
Как на самом деле работает движок в браузере:
- парсер строит синтаксическое дерево, дальше код превращается в байткод;
- байткод выполняет интерпретатор, попутно собирая статистику по типам;
- горячие функции оптимизирующий компилятор переводит в машинный код прямо во время работы;
- если предположение о типах нарушилось, происходит деоптимизация и возврат к байткоду.
Поэтому фраза «JavaScript медленный, потому что интерпретируемый» неверна: горячий цикл считается машинным кодом.
Второй слой, важный на фронтенде, это сборка. TypeScript, Babel и JSX выполняют транспиляцию, то есть перевод в другой исходный код, а не компиляцию в машинный. WebAssembly наоборот, заранее скомпилированный бинарный модуль, который получают из C, Rust или Go и подключают к странице.
Где спотыкаются
Говорят, что интерпретатор выполняет код построчно. Движок разбирает файл целиком: подъём объявлений и SyntaxError, который валит весь файл до первой выполненной строки, это прямое доказательство обратного.
Второе: «TypeScript компилируется, значит работает быстрее». Типы стираются, в браузер уезжает тот же JavaScript, выигрыш только в ошибках, найденных до запуска.
Третье: приписывают компиляции все ранние проверки. Часть ошибок движок ловит на разборе, а строгие проверки в C++ и Java это заслуга статической типизации, а не самого факта компиляции.