PHP компилируется или интерпретируется? - PullRequest
126 голосов
/ 03 октября 2009

PHP компилируется или интерпретируется?

Ответы [ 15 ]

111 голосов
/ 03 октября 2009

Язык PHP интерпретируется. Двоичный файл, который позволяет вам интерпретировать PHP, компилируется, но то, что вы пишете, интерпретируется.

Вы можете увидеть больше на странице Википедии для устных языков

53 голосов
/ 04 октября 2009

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

Работа компилятора PHP заключается в том, чтобы проанализировать ваш код PHP и преобразовать его в форму, подходящую для движка времени выполнения. Среди его задач:

  • Игнорировать комментарии
  • Разрешить переменные, имена функций и т. Д. И создать таблицу символов
  • Создайте абстрактное синтаксическое дерево вашей программы
  • Введите байт-код

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

Средство выполнения выполняет AST и байт-код при вызове сценария. Таблица символов используется для хранения значений переменных и предоставления адресов байт-кода для функций.

Этот процесс компиляции в байт-код и интерпретации его во время выполнения типичен для языков, которые работают на виртуальной машине определенного типа, включая Perl, Java, Ruby, Smalltalk и другие.

16 голосов
/ 04 октября 2009

В целом это интерпретируется, но некоторое время может использовать его как скомпилированный, и это действительно увеличивает производительность.Инструмент с открытым исходным кодом для выполнения этой операции: hhvm.com

14 голосов
/ 03 октября 2009

PHP является интерпретируемым языком. Однако его можно скомпилировать в байт-код сторонними инструментами.

8 голосов
/ 19 августа 2015

A скомпилированный код может выполняться непосредственно процессором компьютера. То есть исполняемый код указывается на родном языке

процессора

Код интерпретируемых языков должен быть переведен во время выполнения из любого формата в машинные инструкции процессора. Этот перевод сделан переводчиком.

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

Самая широко используемая реализация PHP основана на Zend Engine и называется просто PHP. Zend Engine компилирует исходный код PHP в формат, который он может выполнить, таким образом, Zend engine работает переводчиком .

Спасибо:)

8 голосов
/ 04 октября 2009

Это бессмысленный вопрос. PHP использует yacc (бизон), как и GCC. yacc это "компилятор компилятора". Вывод yacc - это компилятор. Вывод компилятора "скомпилирован". PHP анализируется выводом yacc. Так что это по определению компилируется.

Если это не удовлетворяет, рассмотрите следующее. И php (двоичный файл), и gcc читают ваш исходный код и создают абстрактное синтаксическое дерево. В версиях 4 и 5 php затем обходит дерево, чтобы перевести программу в байт-код (этап компиляции). Вы можете увидеть байт-код, переведенный в коды операций (которые аналогичны сборке), используя Vulcan Logic Dumper . Наконец, php (в частности, движок Zend) интерпретирует байт-код. gcc, для сравнения, обходит дерево и выводит сборку; он также может запускать ассемблеры и компоновщики для завершения процесса. Вызывать программу, обрабатываемую одним «интерпретированным», а другую программу, обрабатываемую другим «скомпилированным», бессмысленно. В конце концов, обе программы запускаются через «компилятор» с обоими.

На самом деле вы должны задать вопрос, который хотите задать. («Оплачиваю ли я штраф за производительность, поскольку PHP перекомпилирует мой исходный код для каждого запроса?» И т. Д.)

6 голосов
/ 28 декабря 2015

Я знаю, что этот вопрос старый, но он связан повсюду, и я думаю, что все ответы здесь неправильные (возможно, потому что они старые).

Существует НЕТ такая вещь, как интерпретируемый язык или скомпилированный язык. Любой язык программирования может быть интерпретирован и / или скомпилирован.

Прежде всего, язык - это просто набор правил, поэтому, когда мы говорим о компиляции, мы ссылаемся на конкретные реализации этого языка.

ЧЧВМ , например, является реализацией PHP. Он использует JIT-компиляцию для преобразования кода в промежуточный байт-код HipHop, а затем преобразуется в машинный код. Достаточно ли сказать, что оно составлено? Некоторые реализации Java (не все) также используют JIT. Google V8 также использует JIT.

Использование старых определений скомпилированных и интерпретированных в настоящее время не имеет смысла.

"Скомпилирован ли PHP?" это бессмысленный вопрос, учитывая, что нет больше ясных и согласованных разделителей между тем, что является скомпилированным языком против истолковал один.

Один из возможных способов их разграничения (в этой дихотомии я не вижу смысла):

скомпилированные языки использовать компиляцию Ahead of Time (C, C ++);

интерпретируемые языки использовать компиляцию Just in Time или вообще не использовать компиляцию (Python, Ruby, PHP, Java).

3 голосов
/ 24 августа 2017

PHP - это интерпретируемый язык , но программа, используемая для интерпретации PHP, соответствует .

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

3 голосов
/ 08 ноября 2011

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

Этот код ...

for($i=0;$i<100000000;$i++);
echo $i;

... одинаково сильно задерживает программу при каждом запуске.

Он мог обнаружить, что это вычисление, которое нужно выполнить только в первый раз.

1 голос
/ 08 марта 2017

Очевидно, php.exe (интерпретатор PHP) - это скомпилированный исполняемый файл.

Тем не менее, я не думаю, что вы спросили.

Когда PHP-скрипт загружается, он компилирует в двоичный формат, известный как коды операций Zend, в память, которая затем эффективно интерпретируется.

Источник: https://stackoverflow.com/a/18595821/3881189

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...