Для такого коду A = A + B
, який може скласти одну або дві інструкції на машині, кожна з яких виконує певну кількість циклів. Жоден перекладач не може зробити те ж саме в такій кількості циклів з простої причини.
Інтерпретатор також виконує власний набір інструкцій (називайте їх байтовими кодами, p-кодами, проміжною мовою тощо). Кожен раз, коли він бачить байт-код типу ADD, він повинен якось шукати його і розгалужуватися на код, який робить додавання.
Наступний раз він бачить, він повинен повторити , що пошук, якщо він не має способу запам'ятати попередній пошук. Якщо у нього є спосіб запам'ятати попередній пошук, це вже не те, що ми називаємо "інтерпретатором", а скоріше заздалегідь створений компілятор або JITter.
З іншого боку...
Для коду, наприклад callSomeFunction( ... some args ...)
, скільки циклів витрачено між введенням цього коду та його залишенням? Все залежить від того, що відбувається всередині callSomeFunction
. Це може бути декілька, і це можуть бути трильйони, навіть якщо callSomeFunction
вона сама складена. Якщо це багато, немає сенсу обговорювати вартість інтерпретації цього рядка коду - гроші є в іншому місці.
Пам'ятайте, що інтерпретовані мови мають власне значення, наприклад, їх складати не потрібно. ("Компіляція" поверхневого синтаксису до байтових кодів займає тривіальний час. Наприклад, візьміть R або MATLAB.)
Також є гнучкість, необхідна для інтелектуальних рівнів програмування. У « Товаристві розуму Мінського» , розділ 6.4 B -Мережі, є програми A, які мають справу зі світом, і є B-програми, які займаються програмами A, і можуть бути подальші рівні. Програми, які записують та керують іншими програмами, можна простіше робити в інтерпретаційних системах.
У Lisp ви можете написати, (+ A B)
щоб додати A і B, але як тільки це буде написано, у вас є лише вибір, запустити його чи ні. Ви також можете написати, (eval (list '+ 'A 'B))
що будує програму, а потім виконати її. Це може побудувати щось інше.
Тема програми - інша програма . Це простіше писати інтерпретованою мовою (хоча, як зазначає Йорг, новіші версії Lisp, хоча вони є eval
, складаються на ходу, тому вони не мають покарання швидкості інтерпретації).