Скомпилирован или интерпретирован PHP?

143

Скомпилирован или интерпретирован PHP?

ники
источник

Ответы:

129

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

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

Тибо Мартен-Лагардетт
источник
26
Он означает, что утилита под названием php (или в Windows php.exe) скомпилирована.
sepp2k 03
7
@nicky Это означает, что программа, используемая для интерпретации PHP, скомпилирована, но интерпретируется сам PHP.
Эндрю Сонг
5
Но почему это так упоминается в Википедии? goo.gl/YOwZ Начиная с PHP 4, синтаксический анализатор PHP компилирует входные данные для создания байт-кода для обработки Zend Engine, обеспечивая более высокую производительность по сравнению с его предшественником-интерпретатором.
kiranvj
5
@kiranvj Он действительно скомпилирован для повышения производительности, но во время выполнения. Считайте «скомпилированные языки» «предварительно скомпилированными», а интерпретируемые языки - «компилируемыми при запуске». В этом разница между этими двумя: - JIT («Как раз вовремя»), где только необходимый код компилируется, когда это необходимо (обратите внимание, однако, что после выхода интерпретатора скомпилированного кода много) - AOT (« Опережая время »), где весь код компилируется перед запуском.
Тибо Мартин-Лагардетт,
4
@kiranvj: Я полагаю, OP хотел знать, компилируется ли PHP в собственный код. Компиляция его в байт-код, который затем снова интерпретируется Zend, находится где-то посередине с точки зрения стоимости компиляции и производительности во время выполнения. Лол, это довольно старая ветка, только что понял.
Groo
68

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

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

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

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

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

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

Барри Браун
источник
Связывание переменных происходит во время выполнения, а не во время компиляции.
jrockway,
PHP даже не пытается определить, какие имена находятся в области видимости во время компиляции?
Барри Браун,
17

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

Максимум
источник
15

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

code_burgar
источник
2
«байт-код» - это термин, используемый для псевдоинструкций, специфичных для виртуальной машины, которые не являются собственными, поэтому не могут рассматриваться как «компиляция» в этом контексте.
Седат Капаноглу, 03
7
«объектный код» - это просто байт-код для декодера инструкций ЦП. (Вы же не думаете, что у процессоров действительно есть собственные инструкции, такие как «CMPSB», верно?)
jrockway
11

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

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

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

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

Гауранг Дешпанде
источник
2
« То есть, исполняемый код указан на родном языке ЦП ». Исполняемый код не указан на родном языке ЦП, но в двоичном формате, родным языком ЦП может быть что угодно, и когда двоичные файлы программного обеспечения не приходят, как для этого ЦП или этот ЦП .. Полностью скомпилированный и исполняемый код будет в двоичном формате ..
hagrawal
10

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

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

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

перекресток
источник
5
Токенизация исходного кода не компилируется. Даже VBScript можно рассматривать как компилируемый язык с вашим определением.
Седат Капаноглу, 03
5
Я согласен с этим, хотя на самом деле это не отвечает на вопрос ОП. Заманчиво создать таксономию языков, в которой каждый язык четко помещается в каждую категорию. Но в реальности все не так гладко. Почти каждый язык представляет собой смесь характеристик. К тому же, если сразу приступить к делу, даже машинный код «интерпретируется» процессором.
Барри Браун,
4
Ваше высокий уровень утверждение верно, то это является бессмысленным вопросом. Однако ваш аргумент не очень полезен, все, что вы сделали, это взяли нечеткие определения и довели их до крайности. Компиляция - это преобразование исходного кода в объектный код. Да, вы можете рассматривать преобразование исходного кода в конкретное / абстрактное синтаксическое дерево как компиляцию, но большинство людей имеет в виду не это? Тем не менее, это бессмысленный вопрос, потому что язык ВНУТРЕННИЙ не компилируется и не интерпретируется, имплементации языка компилируются или интерпретируются.
Falaina 03
6
давайте не будем упускать из виду, что парень новичок. это заставляет меня интерпретировать вопрос как «создает ли реализация Zend собственный код из исходного кода PHP?». проверьте мой ответ. я думаю, вы слишком строги в том, как задают вопрос. вы знаете, мы пытаемся помочь, а не запугать новичков.
Седат Капаноглу
3
Полностью согласен с Седатом. Вы можете поделиться своими знаниями, не
придавая значения тому, кто спрашивает,
10

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

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

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

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

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

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

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

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

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

Клаудиу Крянга
источник
Но разве в большинстве случаев Java не использует предварительную компиляцию? Я довольно новый разработчик Java, и мы обычно компилируем наш код перед запуском.
aCarella
@aCarella in most cases, да. во всех случаях нет. поэтому вы не можете провести черту, которая является семантически значимой и согласованной.
Claudiu
2

По крайней мере, он не компилирует (или, лучше сказать, оптимизирует) код, насколько это нужно.

Этот код ...

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

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

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

Магнус Андерссон
источник
Теперь у нас есть опция под названием генераторы.
Анкит Вишвакарма
1

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

RichieHH
источник