Скомпилирован или интерпретирован PHP?
Ответы:
PHP - это интерпретируемый язык. Бинарный файл, который позволяет вам интерпретировать PHP, компилируется, но то, что вы пишете, интерпретируется.
Вы можете увидеть больше на странице Википедии для интерпретируемых языков
И то и другое. PHP компилируется до промежуточного байт-кода, который затем интерпретируется механизмом выполнения.
Задача компилятора PHP - проанализировать ваш PHP-код и преобразовать его в форму, подходящую для механизма выполнения. Среди его задач:
В зависимости от настроек PHP этот шаг обычно выполняется только один раз, при первом вызове скрипта. Выходные данные компилятора кэшируются для ускорения доступа при последующем использовании. Однако, если сценарий изменен, этап компиляции выполняется снова.
Механизм выполнения просматривает AST и байт-код при вызове сценария. Таблица символов используется для хранения значений переменных и предоставления адресов байт-кода для функций.
Этот процесс компиляции в байт-код и его интерпретации во время выполнения типичен для языков, которые работают на какой-либо виртуальной машине времени выполнения, включая Perl, Java, Ruby, Smalltalk и другие.
PHP - это интерпретируемый язык. Однако он может быть скомпилирован в байт-код сторонними инструментами.
Скомпилированный код может выполняться непосредственно с помощью центрального процессора компьютера. То есть исполняемый код указывается на родном языке ЦП.
Код интерпретируемых языков должен быть переведен во время выполнения из любого формата в машинные инструкции ЦП. Этот перевод выполняется переводчиком.
Было бы неправильно говорить, что язык интерпретируется или компилируется, потому что интерпретация и компиляция являются свойствами реализации этого конкретного языка, а не свойством самого языка . Итак, любой язык можно скомпилировать или интерпретировать - это просто зависит от того, что делает конкретная реализация, которую вы используете.
Наиболее широко используемая реализация PHP основана на Zend Engine и известна просто как PHP. Zend Engine компилирует исходный код PHP в формат, который он может выполнять, таким образом, механизм Zend работает как интерпретатор .
Это бессмысленный вопрос. PHP использует yacc (bison), как и GCC. yacc - это «компилятор компилятора». Результатом yacc является компилятор. Вывод компилятора "компилируется". PHP анализируется выводом yacc. Так оно и скомпилировано по определению.
Если это вас не устраивает, подумайте о следующем. И php (двоичный), и gcc читают ваш исходный код и создают абстрактное синтаксическое дерево. В версиях 4 и 5 php затем обходит дерево, чтобы преобразовать программу в байт-код (этап компиляции). Вы можете увидеть байт-код, переведенный в коды операций (которые аналогичны сборке), используя Vulcan Logic Dumper . Наконец, php (в частности, движок Zend) интерпретирует байт-код. gcc, для сравнения, обходит дерево и выводит сборку; он также может запускать ассемблеры и компоновщики для завершения процесса. Вызов программы, обрабатываемой одним «интерпретируемым», и другой программой, обрабатываемой другим «скомпилированным», бессмысленно. В конце концов, обе программы запускаются через «компилятор» с обоими.
Вместо этого вам следует задать вопрос, который вы хотите задать. («Плачу ли я штраф за производительность, поскольку PHP перекомпилирует мой исходный код для каждого запроса?» И т. Д.)
Я знаю, что этот вопрос старый, но он связан повсюду, и я думаю, что все ответы здесь неверны (возможно, потому, что они старые).
Существует нет НЕТ такого понятия , как интерпретируемый язык или скомпилированный язык. Любой язык программирования можно интерпретировать и / или скомпилировать.
Прежде всего, язык - это просто набор правил, поэтому, когда мы говорим о компиляции, мы имеем в виду конкретные реализации этого языка.
Например, HHVM - это реализация PHP. Он использует JIT-компиляцию для преобразования кода в промежуточный байт-код HipHop, а затем переводится в машинный код. Достаточно ли сказать, что он скомпилирован? Некоторые реализации Java (не все) также используют JIT. Google V8 также использует JIT.
Использование старых определений компилируемого и интерпретируемого в настоящее время не имеет смысла.
"Скомпилирован ли PHP?" это бессмысленный вопрос, учитывая, что больше нет четких и согласованных разделителей между компилируемым языком и интерпретируемым.
Один из возможных способов их разграничения (я не нахожу смысла в этой дихотомии):
компилируемые языки используют компиляцию Ahead of Time (C, C ++);
интерпретируемые языки используют компиляцию Just in Time или вообще не используют компиляцию (Python, Ruby, PHP, Java).
in most cases
, да. во всех случаях нет. поэтому вы не можете провести черту, которая является семантически значимой и согласованной.
По крайней мере, он не компилирует (или, лучше сказать, оптимизирует) код, насколько это нужно.
Этот код ...
for($i=0;$i<100000000;$i++);
echo $i;
... задерживает программу одинаково сильно каждый раз при ее запуске.
Он мог обнаружить, что это расчет, который нужно выполнить только в первый раз.