Да, да. Это очередной вопрос о разнице между компилятором и интерпретатором ЯП.
Только ответы, которые обычно даются меня не удовлетворяют.
Обычно говорят, компилятор переводит код на каком либо ЯП в исполняемый и уже при выполнении код сразу выполняется непосредственно процессором. В случае интерпретатора, в процессе выполнения программы специальная программа интерпретатор считывает исходный код программы построчно и выполняет его. Шаг за шагом. При этом говорится, что мол компиляторы не так-то просто еще написать.
Собственно вопрос вот в чем. Если в итоге программа выполняется, то какая в сущности разница выполняется сразу машинный код, или сначала интерпретатор что-то делает с исходным кодом, а уже потом выполняет его - в итоге-то процессор выполняет такие же инструкции машинные. Какая тогда разница? Явно же не в том, что компилятор сохраняет машинный код в файл заранее, а интерпрететор нет)
Ну допустим я понимаю, что при интерпретации программы с if-ами какая-то часть никогда может быть и не выполнена, а следовательно не переведена в машинный код. Но, опять же, наверное не в этом проблема, что сложно перевести все if-ы в машинный код заранее, то есть скомпилировать код.
Короче, в чем еще отличия и сложности реализации компилятора в отличии от интерпретатора?
Ответ
Отличий два:
Интерпретатор не занимается генерацией машинного кода. Вместо этого он вызывает для каждой интерпретируемой команды специальную функцию (являющуюся частью кода интерпретатора), которая и делают всю работу.
Компилятор же (как обычный, так и JIT) сначала генерирует машинный код, который затем скармливается процессору для непосредственного исполнения.
Компилятор делает всю работу единожды (при сборке программы), а интерпретатор — каждый раз при чтении очередной инструкции. То есть при компилировании накладные расходы выполнения меньше, а следовательно, выше скорость работы конечного кода.
Теперь касательно сложности реализации компилятора. Интерпретатор просто берёт и выполняет очередное выражение программы; а как выполнит — тут же забывает про него (разумеется, предварительно сохранив результат). Компилятор же вынужден мыслить более глобально: тут и оптимизации, и межмодульный импорт/экспорт сущностей (ведь программа может состоять из множества файлов исходных кодов). В придачу, компилятор должен придерживаться определённых соглашений и стандартов для взаимодействия с другими инструментами (компоновщиком, к примеру); интерпретатор же является «вещью в себе», делающей всю работу самостоятельно.
Комментариев нет:
Отправить комментарий