Скачиваний:
18
Добавлен:
02.05.2014
Размер:
906.24 Кб
Скачать

2. Характеристика языка php

Так на чем же писать сценарии? Многие тут же ответят: "Конечно, на том, на чем обычно пишут сценарии – на Perl!". Да, это распространенная точка зрения. Однако у Perl, наряду с его неоспоримыми достоинствами, существуют и недостатки. Причем недостатки весьма серьезные. Вот один из них: Perl не приспособлен непосредственно для программирования сценариев. Это в некотором роде универсальный язык, поэтому он не поддерживает напрямую того, чего бы нам хотелось. А вот и второй: у Perl синтаксис не способствует читабельности программы. Он не похож ни на Си, ни на Паскаль (а эти языки замечательно зарекомендовали себя как самодокументирующиеся). Вообще, я сам принадлежу к той категории людей, которые очень болезненно воспринимают непродуманный синтаксис языка программирования, отсюда и мое отношение к Perl...

PHP – язык, специально нацеленный на работу в Интернете, язык с универсальным (правда, за некоторыми оговорками) и ясным синтаксисом, удивительно похожим на Си, сочетающий достоинства Perl и Си. И хотя этот язык еще довольно молодой, он (точнее, его интерпретатор) установлен уже на порядка миллиона серверов по всему миру, и цифра продолжает расти. Новое поколение PHP – четвертое – должно вообще стереть все преимущества Perl перед PHP, как с точки зрения быстродействия обработки программ (а третья версия PHP сильно отставала от Perl при обработке больших циклов), так и с точки зрения синтаксиса. Наконец, большинство PHP-сценариев (особенно не очень больших размеров) работают быстрее аналогичных им программ, написанных на Perl (конечно, если сравнивать с обычными Perl-сценариями, а не программами, запускаемыми под управлением mod_perl).

Думаю, у PHP есть лишь один серьезный недостаток, который менее выражен у Perl: это – его медлительность при работе с большими и сложными сценариями. Однако работы по преодолению этой трудности давно ведутся и, если верить разработчикам PHP, версия 4 является уже компилятором, построенным примерно на том же принципе, что и компилятор Perl. Давайте поговорим на последнюю тему чуть подробнее.

Интерпретатор или компилятор?

Возможно, вы уже слышали, что PHP версии 4, в отличие от своего предшественника, является компилятором. Так вот, это не совсем так. Во избежание разногласий в терминах давайте определимся, что мы будем называть компилятором, а что – интерпретатором. Если быть до конца откровенными, компиляторами очень часто и незаслуженно называют программы, которые на самом-то деле являются интерпретирующими трансляторами, т. е., по своей главной функции – интерпретаторами . Так обстоит дело и с PHP версии 4. Транслятор – программа, которая переводит код с одного "языка" на другой. Например, утилита, преобразующая исходный Паскаль-код на Си,транслятор. В общем понимании компилятор – ни что иное, как транслятор, конвертирующий код программы на языке высокого уровня в машинный код. Интерпретатор же – это утилита, которая просматривает код некоторой программы и выполняет одну ее инструкцию за другой, т. е. полностью контролирует процесс исполнения.

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

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

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

Язык Perl, который практически всегда называют компилятором, работает точно по такой же схеме – он транслирует текст программы во внутреннее представление, а затем использует результирующий код при исполнении. Так что, можно сказать, PHP версии 4 представляет собой компилятор ровно настолько, насколько им является Perl.

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

Как вы видите, PHP версии 4 коренным образом отличается от своего предшественника – PHP версии 3. Фактически, весь код программы в очередной раз был переписан заново. При этом возникла серьезная проблема с переносимостью программ: не так-то легко обеспечить совместимость классического интерпретатора с новым транслирующим блоком (вообще, трансляторы по своей природе ограничивают свободу действий, зато привносят быстродействие). Тем не менее, разработчики PHP блестяще справились с проблемой: практически любая программа, работающая на PHP версии 3 и не использующая недокументированных возможностей языка, будет работать и на четвертой версии.

Что же такое PHP? Как мы выяснили, уж точно не компилятор, т. к. не имеет ни малейшего отношения к машинному коду. И, конечно же, не транслятор в чистом виде – ведь оттранслированный байт-код нельзя ни сохранить в файле, ни использовать повторно. В то же время, главной фазой работы PHP является интерпретация внутреннего представления программы и ее исполнение. Именно эта фаза и занимает больше всего времени в серьезных сценариях. Итак, мы вынуждены заключить, что PHP является интерпретатором с встроенным блоком трансляции, оптимизирующим ход интерпретации.

Я уже предвижу, что множество читателей не согласятся с такой формулировкой. Конечно, слово "компилятор" звучит солиднее, чем какой-то там "интерпретирующий транслятор". Но все дело в том, что английское слово compiler переводится не только как "компилятор", но также и как "транслятор". Задумайтесь над этим, если окончательно решили для себя считать PHP и Perl компиляторами.