Pull to refresh

Интерпретатор PHP: а что там внутри…

Level of difficulty Hard
Reading time 2 min
Views 5.5K
Если совсем просто, интерпретатор PHP — это программа, которая выполняет скрипты на языке PHP. Он состоит из нескольких компонентов, которые работают вместе, чтобы обработать скрипт PHP и произвести вывод.

Перечислим эти компоненты:

  1. Lexer — это компонент, который разбирает исходный код на токены (ключевые слова, операторы, константы и т.д.).
  2. Parser — это компонент, который преобразует токены в абстрактное синтаксическое дерево (AST). AST — это структура данных, которая представляет скрипт на языке PHP в виде дерева, где каждый узел представляет собой операцию или конструкцию языка.
  3. Executor — это компонент, который выполняет инструкции, представленные в AST. Он просматривает каждый узел AST и выполняет соответствующую операцию.
  4. Zend Engine — это основной компонент интерпретатора PHP, который объединяет Lexer, Parser и Executor. Он также управляет работой с памятью, оптимизацией кода и другими внутренними аспектами языка.
  5. SAPI (Server Application Programming Interface) — это интерфейс между интерпретатором PHP и веб-сервером, который позволяет запускать скрипты на языке PHP на сервере. В PHP существует несколько различных SAPI, таких как Apache, CGI и FastCGI.


Начнем наш обзор с лексического анализатора.

Lexer (лексический анализатор) в PHP — это компонент, который преобразует исходный код на языке PHP в поток токенов. Он работает по следующему алгоритму:

  1. Получение кода на входе — Lexer получает на вход исходный код на языке PHP.
  2. Разбиение кода на лексемы — Lexer анализирует код и разбивает его на отдельные лексемы (ключевые слова, операторы, константы и т.д.).
  3. Создание токенов — Для каждой лексемы Lexer создает соответствующий токен, который содержит информацию о типе лексемы, ее значение и позиции в исходном коде.
  4. Формирование потока токенов — Lexer формирует поток токенов из созданных токенов, который передается на вход компоненту Parser для дальнейшей обработки.
  5. Обработка ошибок — В случае возникновения ошибки Lexer создает соответствующее исключение, которое передается на уровень выше для обработки.


Для примера работы лексера можно рассмотреть следующий код на языке PHP:

<?php
function helloWorld($name) {
    echo "Hello, " . $name . "!";
}


После применения лексера к этому коду получится поток токенов, который можно представить в виде таблицы:

Тип токена Значение Позиция в коде
T_FUNCTION function 1:1
T_WHITESPACE 1:10
T_STRING helloWorld 1:11
T_OPEN_PAREN ( 1:21
T_VARIABLE $name 1:22
T_CLOSE_PAREN ) 1:27
T_WHITESPACE 1:28
T_OPEN_CURLY { 2:1
T_WHITESPACE 2:2
T_ECHO echo 3:5
T_WHITESPACE 3:9
T_CONSTANT_EN «Hello, „ 3:10
T_CONCAT_EQUAL . 3:18
T_VARIABLE $name 3:20
T_CONCAT_EQUAL . 3:24
T_CONSTANT_EN “!» 3:26
T_SEMICOLON ; 3:27
T_WHITESPACE 4:1
T_CLOSE_CURLY } 5:1


Каждый токен имеет свой тип, значение и позицию в исходном коде. Например, первый токен имеет тип T_FUNCTION, значение function и позицию 1:1 (1 строка, 1 символ), а последний токен имеет тип T_CLOSE_CURLY, значение }, и позицию 5:1 (5 строка, 1 символ).

Поток токенов, полученный после работы лексера, затем передается на вход компоненту Parser для дальнейшей обработки и выполнения скрипта.

продолжение следует...
Tags:
Hubs:
+45
Comments 160
Comments Comments 160

Articles