Является ли PHP интерпретировать код так же, как JavaScript? После некоторых исследований я понял, что программы JavaScript выполняются в так называемом «двухпроходном» чтении. Первый запуск получает определения синтаксиса и функции программы. («Парсы», так сказать, данные), а второй запуск – хорошо – выполняет данные. Работает ли PHP так же? Если нет, то как PHP интерпретирует код?
Каковы общие функции интерпретатора PHP?
То, что вы описали в вопросе, является очень крошечным аспектом работы интерпретатора.
PHP действительно делает это: вы можете сказать, потому что правильно иметь вызов функции выше в коде, чем фактическое определение вызываемой функции.
<?php myFunction(); //this is only valid here before the function itself because of two-pass parsing. function myFunction() { ..... } myFunction(); //in a single-pass system, the function call would have to be here, after the function itself. ?>
Если у вас был только один проход, вы могли бы только вызвать функцию после того, как была определена функция. Некоторые языки работают так (C и Pascal – хорошие примеры). Эти языки требуют использования файлов заголовков, если вы хотите записать вызов функции раньше в коде, чем определенная функция.
Разница заключается в том, что эти языки скомпилированы, а это значит, что код выполняется только после того, как все было встроено в исполняемый файл. Однопроходный подход с заголовочными файлами не будет работать в интерпретируемой среде, потому что, хотя заголовок может позволить компилятору принять вызов функции как действительный, интерпретатор все равно будет терпеть неудачу, потому что у него просто не будет доступной функции для вызова.
По этой причине почти любой интерпретируемый язык будет использовать этот двухпроходный механизм.
Однако, как я уже сказал, это всего лишь небольшая часть общего дизайна интерпретатора.
Большинство языков программирования работают таким образом, возможно, для пакетных файлов. Исходный код анализируется в токенах и создается синтаксическое дерево, которое затем оценивается . Это три отдельных шага, и их намного проще сохранить. Если вы хотите объединить их вместе, чтобы код был выполнен во время его анализа, это означает, что анализатор должен будет читать достаточно, чтобы получить один полный блок того, что является исполняемым, а затем передать его во время выполнения, что затем необходимо передать управление парсеру. Гораздо проще делать все поодиночке.