Ответ на ваш вопрос, как знают все консультанты, звучит так: «Это зависит».
Вы правы, в некоторых интерпретируемых языках эта строка может интерпретироваться каждый раз. Я подозреваю, что большинство снарядов справляются с этим примерно так.
Оригинальные версии 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
где каждое слово в верхнем регистре в переводе является внутренним целым числом. Таким образом, существует один проход лексического анализа для его перевода, после чего интерпретатор может просто интерпретировать значения токена.
Конечно, если вы зайдете так далеко, вы обнаружите, что думаете: «Ну и дела, почему бы не использовать реальные коды операций?»