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