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