Чи компілюється або інтерпретується PHP?


Відповіді:


127

PHP - це інтерпретована мова. Бінарний файл, що дозволяє інтерпретувати PHP, складається, але те, що ви пишете, інтерпретується.

Більше ви можете побачити на сторінці Вікіпедії для тлумачених мов


26
Він означає, що утиліта під назвою php (або на windows php.exe) складається.
sepp2k

7
@nicky Це означає, що програма, що використовується для інтерпретації PHP, компілюється, але інтерпретується сама PHP.
Ендрю Пісень

5
Але чому його згадують так у вікіпедії? goo.gl/YOwZ Починаючи з PHP 4, PHP-аналізатор збирає вхід для отримання байтового коду для обробки Zend Engine, забезпечуючи покращену продуктивність у порівнянні з попередником інтерпретатора.
kiranvj

5
@kiranvj Дійсно складено для покращення виступів, але під час виконання. Подумайте про "компільовані мови" як "заздалегідь складені", а інтерпретуйте мови як "Складено під час запуску". Це різниця між цими двома: - JIT ("Тільки вчасно"), де лише той код, який потрібен, компілюється тоді, коли це потрібно (зауважте, однак, що після того, як інтерпретатор вийде, складеного коду буде багато) - AOT (" Попереду час "), де весь код складається перед його запуском.
Тібо Мартін-Лагардет

4
@kiranvj: Я вважаю, що ОП хотів дізнатися, чи PHP буде компільовано до рідного коду. Компіляція його в байт-код, який потім знову інтерпретується Зендом, знаходиться десь посередині з точки зору вартості компіляції та продуктивності виконання. Лол, це досить стара нитка, щойно це зрозумів.
Гроо

66

І те й інше. PHP складається до проміжного байтового коду, який потім інтерпретується двигуном виконання.

Завдання компілятора PHP - проаналізувати ваш PHP-код і перетворити його у форму, відповідну для двигуна виконання. Серед її завдань:

  • Ігноруйте коментарі
  • Розв’яжіть змінні, назви функцій тощо, і створіть таблицю символів
  • Побудуйте абстрактне синтаксичне дерево вашої програми
  • Напишіть байт-код

Залежно від налаштування PHP, цей крок, як правило, виконується лише один раз, коли перший сценарій викликається. Вихід компілятора кешується для прискорення доступу при наступному використанні. Якщо сценарій буде змінено, проте, етап компіляції виконується знову.

Двигун виконання виконує AST і байт-код, коли викликається сценарій. Таблиця символів використовується для зберігання значень змінних та надання адрес байт-кодів для функцій.

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


Змінна прив'язка відбувається під час виконання, а не час компіляції.
jrockway

PHP навіть не намагається вирішити, які імена підпадають під час компіляції?
Баррі Браун

17

Зазвичай він інтерпретується, але деякий час може використовувати його як складений, і це дійсно підвищує продуктивність. Інструмент з відкритим кодом для виконання цієї операції: hhvm.com


15

PHP - це інтерпретована мова. Однак він може бути складений в байт-код сторонніми інструментами.


2
"байт-код" - термін, що використовується для специфічних для ПМ псевдоінструкцій, які не є власними, тому в цьому контексті не можуть розглядатися як "компіляція".
Седат Капаноглу

7
"об'єктний код" - це просто байт-код для декодера інструкцій процесора. (Ви не думаєте, що процесори насправді мають вбудовані інструкції типу "CMPSB", правда?)
jrockway

11

Скомпільований код може виконуватися безпосередньо з допомогою центрального процесора комп'ютера. Тобто виконуваний код задається рідною мовою процесора

Код інтерпретованих мов повинен бути перекладений під час виконання з будь-якого формату на інструкції з процесорної машини. Цей переклад робиться перекладачем.

Неправильно було б сказати, що мова інтерпретується або складається, оскільки інтерпретація та компіляція є властивостями реалізації цієї конкретної мови, а не властивістю самої мови . Отже, будь-яка мова може бути складена або інтерпретована - це просто залежить від того, якою саме функціональною реалізацією ви користуєтесь.

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


2
" Тобто, виконуваний код вказаний на рідній мові процесора ". Виконавчий код не вказаний на рідній мові процесора, але у двійковому форматі, рідною мовою процесора може бути все що завгодно, і коли бінарні програми не надходять так, як це для цього ЦП або той процесор .. Повністю скомпільований і виконуваний код буде у двійковому форматі ..
hagrawal

10

Це безглузде питання. PHP використовує yacc (зубр), як і GCC. yacc - "компілятор компілятора". Вихід yacc - компілятор. Вихід компілятора "компілюється". PHP аналізується на виході yacc. Так воно, за визначенням, складено.

Якщо це не задовольняє, врахуйте наступне. І php (двійковий), і gcc читають ваш вихідний код і створюють абстрактне дерево синтаксису. У версіях 4 та 5, php потім ходить по дереву, щоб перевести програму в байт-код (крок компіляції). Ви можете побачити байт-код, переведений на коди (аналогічні збірці), використовуючи логічний дампер Vulcan . Нарешті, php (зокрема, двигун Zend) інтерпретує байт-код. gcc, порівняно, ходить по дереву і виводить збірку; він також може запускати асемблери та лінкери, щоб закінчити процес. Викликати програму, якою керується одна «інтерпретована», а інша програма, якою керується інша «складена», безглуздо. Зрештою, програми обидва запускаються через "компілятор".

Насправді слід задати питання, яке ви хочете задати замість цього. ("Чи сплачую я штраф за ефективність, оскільки PHP переписує свій вихідний код за кожен запит?" І т. Д.)


5
Токенізація вихідного коду не компілюється. Навіть VBScript може розглядатися як складена мова з вашим визначенням.
Седат Капаноглу

5
Я з цим дроквей, хоча це не відповідає на питання ОП. Заманливо створити систематику мов, в якій кожна мова чітко розміщена в кожній категорії. Але реальність не така охайна. Майже кожна мова є сукупністю характеристик. Плюс, коли ви перейдете до цього, процесор навіть інтерпретується нативним машинним кодом.
Баррі Браун

4
Ваше високий рівень твердження вірне, то це є безглуздим питанням. Однак ваш аргумент не дуже корисний, все, що ви зробили, - це нечіткі визначення та взято їх до крайності. Компіляція - це перетворення вихідного коду в об'єктний код. Так, ви можете вважати перетворення джерела в конкретне / абстрактне синтаксичне дерево компіляцією, але це не те, що більшість людей означає це? Незважаючи на це, це безглузде запитання, оскільки мова НЕ СПІЛЬНО складена чи інтерпретована, вкладення мови складаються чи інтерпретуються.
Фалаїна

6
не будемо спостерігати за тим, що хлопець - початківець. це змушує мене інтерпретувати питання як "чи реалізація Zend виробляє нативний код із джерела PHP?". перевірити мою відповідь. я думаю, ти занадто суворий щодо того, як задається питання. ви знаєте, ми намагаємось допомогти, а не пограбувати новичками.
Седат Капаноглу

3
Я повністю погоджуюся з Sedat. Ви можете поділитися своїми знаннями, не ставши
жодною статкою на запитання

10

Я знаю, що це питання давнє, але воно повсюдно пов'язане, і я думаю, що всі відповіді тут невірні (можливо, тому, що вони старі).

Існує немає НІ такого поняття , як інтерпретована мова або скомпільований мову. Будь-яку мову програмування можна інтерпретувати та / або компілювати.

Перш за все мова - це лише сукупність правил, тому, коли ми говоримо про компіляцію, ми посилаємося на конкретні реалізації цієї мови.

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

Використання старих визначень складених та інтерпретованих нині не має сенсу.

"Чи компілюється PHP?" це нечуттєве запитання, враховуючи те, що більше немає чітких і узгоджених роздільників між тим, що є складеною мовою та інтерпретованою.

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

компільовані мови використовують компіляцію перед часом (C, C ++);

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


Однак, у більшості випадків Java не використовує компіляцію достроково? Я досить новий розробник Java, і ми зазвичай компілюємо наш код до початку виконання.
aCarella

@aCarella in most cases, так. у всіх випадках ні. тож ви не можете намалювати семантично значущу і узгоджену лінію.
Клавдіу Кріанга

2

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

Цей код ...

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

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

Це могло б виявити, що це розрахунок, який потрібно зробити лише перший раз.


Тепер у нас є варіант, який називається генераторами.
Ankit Vishwakarma

1

Прийнята відповідь очевидно хибна. PHP IS складено. Кінець історії. Можливо, не для власних інструкцій, а для інтерпретованого байт-коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.