Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vtoraya_chast_uchebnika_po_WWW_Okonchat_variant...doc
Скачиваний:
31
Добавлен:
27.09.2019
Размер:
6.06 Mб
Скачать

1.2. Как работает обработчик кода php

Рассмотрим подробнее, как работает обработчик PHP. В частности, выясним, является ли он интерпретатором или транслятором (компилятором).

Получая на свой вход исходный код программы – файл, который имеет расширение .php, обработчик в первую очередь анализирует его (в частности, проверяет синтаксис) и транслирует в специальное внутреннее представление. Оно представляет собой специальный байт-код, который, конечно, невозможно прочитать глазами, но с которым в дальнейшем проще всего будет оперировать PHP. Вот эту-то фазу чаще всего и называют ошибочно компиляцией. Далее, PHP исполняет (интерпретирует) полученный байт-код3. В этот момент он представляет собой классический интерпретатор.

Следовательно, PHP состоит из двух почти независимых блоков - транслятора и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображений быстродействия. Посудите сами: синтаксический разбор осуществляется всего один раз на этапе трансляции, а исполняется уже "полуфабрикат" — байт-код, который гораздо более удобен для этих целей.

Впрочем, описанная схема работы PHP не совсем соответствует действительности. Дело в том, что в языке PHP можно создавать конструкции, которые просто физически невозможно перевести во внутреннее представление во время фазы трансляции (к таковым, например, относится инструкция включения в программу кода внешнего файла, имя которого выясняется только на этапе исполнения программы — к примеру, вводится пользователем). В этом случае PHP просто пропускает их, "откладывая на потом", и транслирует, как только до них дойдет управление. Конечно, это несколько замедляет выполнение программы, но если подобных конструкций в ней немного (и они не вставлены в цикл с большим количеством итераций), замедление не так уж и существенно.

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

В то же время, главной фазой работы PHP является интерпретация внутреннего представления программы и ее исполнение. Именно эта фаза и занимает больше всего времени в серьезных сценариях.

Итак, можно сказать, что PHP является интерпретатором с встроенным блоком трансляции, оптимизирующим ход интерпретации.

Для обработки больших массивов данных, используются базы данных. База данных - это набор очень большого числа записей с одинаковой структурой плюс программное обеспечение для быстрого поиска, добавления и удаления записей. PHP поддерживает работу с очень большим числом разнообразных баз данных, поэтому написание сценариев с применением баз данных не должно вызвать особых проблем. Кстати, и выполняться такие скрипты будут быстрее, чем аналогичные им, написанные на Си - ведь разработкой баз данных и эффективных алгоритмов работы с ними занималось множество людей. А в PHP останется лишь вызвать нужную функцию (например, поиск в базе данных) и сразу получить результат — многие базы данных даже умеют нужным образом его отсортировать и вообще выполнить всю "грязную работу".

У интерпретатора есть и другие преимущества перед классическим компилятором, например, перед Си. Вот некоторые из них.

  • Упрощается обнаружение ошибок во время выполнения программы.

  • В случае сбоя (ошибочного кода программы) интерпретатор сразу же выведет сообщение, что что-то не так.

  • Можно не заботиться об освобождении выделенной памяти. Интерпретатор сам определит, когда та или иная переменная в программе уже не используется, и освободит память, выделенную для нее.

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

  • Не нужно думать о типах переменных.

Таким образом, использование интерпретатора способно дать сценариям ту мощь, которую пользователи Web от них и ожидают. Но за все нужно платить: медлительность интерпретаторов, даже с блоком трансляции, при работе с большими проектами способна вывести из себя самого закаленного программиста.

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