|
почти независимых блоков — транслято-
ра и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображений
быстродействия. Посудите сами: синтаксический разбор осуществляется всего один
раз на этапе трансляции, а исполняется уже "полуфабрикат" — байт-код, который
гораздо более удобен для этих целей.
Пусть, например, в программе есть цикл с большим числом итераций. PHP версии 3,
в котором отсутствует фаза трансляции, вынужден перед исполнением очередной
итерации заново анализировать ее код, проводить строковый разбор, проверку син-
таксиса и т. д. В то же время PHP версии 4 делает это только один раз (при
трансля-
ции кода программы), и на каждой итерации цикла занимается лишь исполнением
готового байт-кода. Выигрыш очевиден, не правда ли?
Язык Perl, который практически всегда называют компилятором, работает точ-
но по такой же схеме — он транслирует текст программы во внутреннее пред-
ставление, а затем использует результирующий код при исполнении. Так что,
Глава 6. Характеристика языка PHP 107
можно сказать, PHP версии 4 представляет собой компилятор ровно настоль-
ко, насколько им является Perl.
Впрочем, описанная только что схема работы PHP не совсем соответствует действи-
тельности. Дело в том, что в языке можно создавать конструкции, которые просто
физически невозможно перевести во внутреннее представление во время фазы транс-
ляции (к таковым, например, относится инструкция включения в программу кода
внешнего файла, имя которого выясняется только на этапе исполнения программы —
к примеру, вводится пользователем). В этом случае PHP просто пропускает их,
"от-
кладывая на потом", и транслирует, как только до них дойдет управление. Конечно,
это несколько замедляет выполнение программы, но если подобных конструкций в
ней немного (и они не вставлены в цикл с большим количеством итераций),
замедле-
ние не так уж и существенно.
Как вы видите, PHP версии 4 коренным образом отличается от своего предшествен-
ника — PHP версии 3. Фактически, весь код программы в очередной раз был перепи-
сан заново. При этом возникла серьезная проблема с переносимостью программ: не
так-то легко обеспечить совместимость классического интерпретатора с новым
транс-
лирующим блоком (вообще, трансляторы по своей природе ограничивают свободу
действий, зато привносят быстродействие). Тем не менее, разработчики PHP
блестя-
ще справились с проблемой: практически любая программа, работающая на PHP вер-
сии 3 и не использующая недокументированных возможностей языка, будет работать
и на четвертой версии.
Что же такое PHP? Как мы выяснили, уж точно не компилятор, т. к. не имеет ни
ма-
лейшего отношения к машинному коду. И, конечно же, не транслятор в чистом ви-
де — ведь оттранслированный байт-код нельзя ни сохранить в файле, ни использо-
вать повторно. В то же время, главной фазой работы PHP является интерпретация
внутреннего представления программы и ее исполнение. Именно эта фаза и занимает
больше всего времени в серьезных сценариях. Итак, мы вынуждены заключить, что
PHP является интерпретатором с встроенным блоком трансляции, оптимизирующим
ход интерпретации.
Я уже предвижу, что множество читателей не согласятся с такой формулиров-
кой. Конечно, слово "компилятор" звучит солиднее, чем какой-то там "интер-
претирующий транслятор". Но все дело в том, что английское слово compiler
переводится не только как "компилятор", но также и как "транслятор". Заду-
майтесь над этим, если окончательно решили для себя считать PHP и Perl
компиляторами.
Часть III. Основы языка PHP 108
Достоинства и недостатки
интерпретатора
|
|