переинтерпретируется ли код для интерпретируемых языков каждый раз, когда достигается строка?

StackOverflow https://stackoverflow.com/questions/922692

  •  06-09-2019
  •  | 
  •  

Вопрос

предположим, что для программы не генерируется байт-код, как в Ruby, Perl или PHP, в этом случае строка 1 ниже интерпретируется повторно каждый раз, когда выполнение снова достигает строки 1?

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}

то есть, если цикл выполняется 100 000 раз, то эта строка будет переинтерпретирована 100 000 раз?

и если это так, то создание байт-кода помогает не только при первоначальном запуске программы, но и во время выполнения?(потому что код не нуждается в повторной интерпретации снова)

Это было полезно?

Решение

Как правило, он преобразуется в байтовый код, и этот байтовый код затем выполняется.

Но в случае PHP, например, байт-код восстанавливается при каждом запросе / просмотре страницы.Если только вы не установите байт-код (или код операции, как его часто называют в случае PHP) кэша, такого как XCache, APC или eAccelerator.

Другие советы

Для последних языков, включая perl, код предварительно компилируется перед выполнением.Таким образом, большая часть аналитической работы выполняется только один раз.

Это не относится к оболочкам, которые интерпретируют каждую строку каждый раз, когда они их выполняют.

Если интерпретатор разумен, он, надеюсь, проверит, были ли изменены $countArrayMoviesData или $countNewlyAddedMoviesData во время цикла, и если это не так, то сумму можно было бы вычислить и сохранить.

Если значения обновляются внутри цикла, то, по всей вероятности, даже для байт-кода потребуется выполнить операцию добавления, что не сделает ее более эффективной.

Очень, очень немногие переводчики будут это делать.Примером может служить устаревший, больше не используемый интерпретатор Hypertalk для Hypercard, где вы могли бы программно переписать текст вашего кода (это просто строка!).

Даже интерпретаторы, которые не создают байтовый код, сначала проанализируют ваш код, так как это сложно сделать построчно и гораздо проще сделать все сразу.Таким образом, действительно простой интерпретатор в основном будет иметь дерево с узлом для цикла "where" с двумя дочерними элементами:одно выражение "меньше, чем" для условного выражения и один блок для тела цикла.

Ответ на ваш вопрос, как известно всем консультантам, таков: "это зависит".

Вы правы, в некоторых интерпретируемых языках эта строка может быть переосмыслена каждый раз.Я подозреваю, что большинство оболочек справляются с этим примерно таким образом.

Оригинальные версии Basic также делали это таким образом.

Большинство современных переводчиков будут по крайней мере обозначьте язык, чтобы текст не нужно было каждый раз повторно сканировать.То есть БАЗОВАЯ программа, подобная

 00010 LET A=42
 00020 DO WHILE A > 0
 00025    LET A = A - 1
 00030 ENDDO

преобразовал бы его, по крайней мере, в небольшие токены для ключевых слов и адреса для переменной, что-то вроде

 LET    $0003, 42
 LABEL  00020 
 LETEST A, 0
 IFTRUEGOTO   00030
 SUB    $0005, $0003, 1
 GOTO   00020
 LABEL  00030

где каждое слово в верхнем регистре в переводе внутренне является одним целым числом.Таким образом, для его перевода выполняется один проход лексического анализа, за которым интерпретатор может просто интерпретировать значения токенов.

Конечно, как только вы заходите так далеко, вы ловите себя на мысли: "Ну и дела, почему бы не использовать настоящие коды операций?"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top