Для такого кода A = A + B
, который может компилироваться до одной или двух машинных инструкций, каждая из которых занимает определенное количество циклов. Ни один переводчик не может сделать то же самое в этом количестве циклов по простой причине.
Интерпретатор также выполняет собственный набор команд (назовите их байт-кодами, p-кодами, промежуточным языком и т. Д.). Каждый раз, когда он видит байт-код, такой как ADD, он должен каким-то образом искать его и переходить к коду, который выполняет сложение.
В следующий раз, когда он его увидит, ему придется повторить этот поиск, если только у него не будет способа вспомнить предыдущий поиск. Если у него есть способ запомнить предыдущий поиск, это уже не то, что мы называем «интерпретатором», а скорее компилятор «точно в срок» или JITter.
С другой стороны...
Для кода, например callSomeFunction( ... some args ...)
, сколько циклов тратится между вводом этого кода и выходом из него? Все зависит от того, что происходит внутри callSomeFunction
. Это может быть несколько, и это может быть триллионы, даже если callSomeFunction
он сам скомпилирован. Если это много, нет смысла обсуждать стоимость интерпретации этой строки кода - деньги находятся в другом месте.
Помните, что интерпретируемые языки имеют свою ценность, например, нет необходимости их компилировать. («Компиляция» поверхностного синтаксиса в байтовые коды занимает тривиальное время. Возьмем, например, R или MATLAB.)
Кроме того, для интеллектуальных уровней программирования необходима гибкость. В Обществе разума Мински , глава 6.4 B- Brain, есть программы A, которые имеют дело с миром, и есть программы B, которые имеют дело с программами A, и могут быть другие уровни. Программы, которые пишут и управляют другими программами, легче выполнять в интерпретирующих системах.
В Лиспе вы можете написать, (+ A B)
чтобы добавить A и B, но как только он будет записан, у вас есть только выбор: запустить его или нет. Вы также можете написать, (eval (list '+ 'A 'B))
которая создает программу, а затем выполняет ее. Это может создать что-то другое.
Предметом программы является другая программа . Это легче писать на интерпретируемом языке (хотя, как указывает Йорг, более новые версии Lisp, хотя и имеют eval
, компилируют на лету, поэтому они не имеют потери скорости интерпретации).