Код для интерпретируемых языков переинтерпретируется каждый раз, когда достигается строка? - PullRequest
2 голосов
/ 28 мая 2009

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 28 мая 2009

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

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

3 голосов
/ 28 мая 2009

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

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

2 голосов
/ 28 мая 2009

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

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

2 голосов
/ 28 мая 2009

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

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

2 голосов
/ 28 мая 2009

Ответ на ваш вопрос, как знают все консультанты, звучит так: «Это зависит».

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

Оригинальные версии 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

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

Конечно, если вы зайдете так далеко, вы обнаружите, что думаете: «Ну и дела, почему бы не использовать реальные коды операций?»

...