На этой неделе язык PHP, который используется в 81.9% сайтов всего мира, отметил 20-летие первого публичного релиза. Корреспондент dev.by поговорил с ведущим разработчиком PHP 7 и Chief Performance Engineer компании Zend Technologies Дмитрием Стоговым, который рассказал о последних веяниях в разработке PHP и мире скриптовых языков.
Zend и обретение мании программирования
— Дмитрий, как вы пришли в программирование?
— Моё знакомство с программированием началось с калькулятора «Электроника Б3-34». Польская нотация, 96 команд, простенькие игры типа посадки на луну... Потом была «Электроника Д3-28», Бейсик, мучение с кассетным накопителем.
Ну, а потом я увидел Pac-Man на CM-4. Очень захотелось его на «Д3-28», но возможностей и производительности Бейсика не хватало (а может просто опыта), и тогда я начал вникать в ассемблер. В общем, Pac-Man я так и не написал, зато дизассемблировал монитор, разобрался во внутренностях — так я постепенно и заработал манию к программированию
— Почему подсели именно на PHP и как в итоге оказались в Zend?
— Моя карьера началась с CM-4, Modula-2 и 100 руб. зарплаты. В последующем Modula мне часто не хватало, и в какой-то момент я даже написал свой компилятор под Linux/DOS/Windows/OS2. Потом, уже работая над серьёзными проектами, я познакомился с Ada и Prolog, которые также наложили серьёзный отпечаток. Знакомство с внутренним устройством Prolog (Warren Abstract Machine) и попытки его улучшить дали опыт в написании интерпретаторов.
И вот вначале 2000-х, работая в немецкой конторе, состоялось моё знакомство с PHP. Мы писали какой-то общедоступный веб-сервис тогда... Очень быстро, упёршись в производительность PHP (и бюджет), мы начали искать пути ускорения. Так появился Turck MMCahce (eAccelerator). Будучи конкурентом продуктам Zend, он и позволил мне завести там знакомства. Впоследствии, нескольких звонков оказалось достаточно, чтобы устроится к ним на работу.
Сейчас я ведущий инженер в Zend, а результаты моей работы можно увидеть, сравнивая производительность версий PHP начиная с 5.0 и до 7 (сейчас PHP 7 в 14 раз быстрее PHP 5.0 на bench.php) — это моя непосредственная зона ответственности.
— Чем сейчас для вас является программирование — это просто работа, рутина или же занятие с элементами искусства и вызова?
— По внутреннему ощущению это скорее работа. Юношеская одержимость ушла, но адреналина хоть отбавляй. В Zend я сам определяю задачи для своей группы, так что без анализа, поиска существующих наработок и экспериментов просто не обойтись. После того как идея оформилась в голове и картинках, реализация становится делом техники. Если в процессе реализации возникают труднопреодолимые препятствия, значит что-то не так с идеей. Большая проблема в том, что выигрыш от реализации того или иного решения зачастую можно оценить только имея готовый прототип, а для этого могут потребоваться месяцы, если не годы. Так было с JIT для PHP, так было и с PHPNG.
Я уже привык, что только половина моих идей доходит до реализации в PHP или продуктах Zend. Стоит также отметить, что первичные идеи и последующие прототипы проходят через стадии обсуждения. Так мои идеи анализируют и дополняют, а я зачастую участвую в реализации идей других членов РHP-комьюнити.
— Как организована ваша работа в Zend?
— На данный момент я единственный сотрудник Zend в России, то есть работа по большей части удалённая. Мой непосредственный начальник Зеев Сураски (Zeev Suraski) находится в Израиле, СEO Энди Гутманс (Andi Gutmans) — в Кремниевой долине, подчиненные — в Китае. Всё общение между нами происходит по email и Skype. Время от времени, при принятии очередных узловых решений, проводятся встречи с партнёрами. Это более-менее типичная для Запада удалёнка.
— Можно ли формально сказать, что во главе разработки новейшего PHP 7 стоит россиянин?
— Я автор и лидер PHPNG. И да, я один из основных разработчиков PHP 7. Но не хочу утверждать, что я или кто-нибудь другой стоит во главе разработки всего PHP. Формально все представители PHP-комьюнити равны — большинство вопросов решается голосованием, где каждый имеет один голос.
Тем не менее, положа руку на сердце, стоит отметить: реальных контрибьютеров кода во все времена было не так уж много. Поэтому я бы особо отметил вклад в PHP 7 — Nikita Popov, Xinchen Hui, Andrea Faulds, Anatol Belski, Levi Morison, Joe Watkins, Bob Weinand... Как видите я тут не единственный с русским именем, хотя из России, да, один.
Введение в PHPNG и PHP 7
— Для начала предлагаю определиться с тем, что такое PHPNG.
— Это был важный проект Zend Technologies, нацеленный на повышение производительности PHP, но без потери совместимости. Фактически — это полный рефакторинг ядра PHP на основе оптимизированных структур данных. Мы начали работу над приватным проектом в январе 2014 и открыли его в мае, когда получили первые удовлетворительные результаты (например, 10-30-процентное ускорение реальных приложений).
В августе PHPNG был принят в качестве ядра для PHP 7, и на этом, собственно, проект PHPNG был закончен. С августа 2014 работа ведётся над PHP 7, а этот проект имеет уже совсем другие цели...
— Какой был бэкграунд и мотивировка для появления PHPNG?
— На самом деле работы по увеличению производительности PHP с 2005-го велись практически постоянно. От версии к версии мы добавляли новые усовершенствования и оптимизации. По большей части они затрагивали отдельные подсистемы ядра и не требовали больших изменений во всей кодовой базе PHP. С выпуском PHP 5.4 в 2012 этот подход себя исчерпал, и мы стали задумываться о чем-то новом. Так началась наша эпопея с JIT. Начав с простого генератора последовательности вызовов обработчиков для виртуальных инструкций (по аналогии с «шитым» кодом Фортa), мы пришли к анализатору кода основанному на SSA (Static Single Assignement Form), написали проход позволяющий определить какие типы и диапазоны значений могут принимать переменные в каждой точке программы, реализовали меж-процедурный анализ, inlining и клонирование функций.
В качестве кодогенератора мы первоначально использовали собственную библиотеку для x86, но зайдя в тупик с распределением регистров, решили попробовать LLVM. В общем, JIT мы сделали, но результат получился странный. Синтетические тесты (типа bench.php и Mandelbrot) ускорялись до 10-30 раз, но реальные приложения не ускорялись ни на процент.
Отчасти происходило это потому, что вывести типы в реальной (не математичкой) задаче куда труднее, а как только типы были неизвестны нам в JIT, приходилось работать с теми же структурами данных, что и в PHP. То есть выделять под них память, увеличивать и уменьшать счётчики ссылок и.т.д. Тогда и пришло понимание, что оптимизировав базовые структуры данных, можно существенно улучшить генерируемый JIT-код, но тогда мы ещё не знали, насколько эти изменения ускорят PHP даже без JIT.
Собственно так и начался PHPNG. И если на первоначальные изменения структур ушла неделя, то на адаптацию 40MB зависимого кода — около двух месяцев (просто чтобы скомпилировать, запустить и увидеть, что же мы получили). Конечно, сразу всё не заработало, и ещё месяц ушёл на отладку, но зато потом мы увидели 20-30-процентное ускорение и на тестах, и на реальных приложениях. Не останавливаясь на достигнутом, каждый следующий месяц мы повышали производительность ещё на 10%. Сейчас мы имеем уже двукратное преимущество над предыдущей версией (и это без JIT).
Интересно, что сейчас PHP 7 на многих проектах быстрее HHVM (альтернативная реализация PHP от Facebook-a с JIT).
— Насколько я понимаю, вектор движения несколько раз менялся?
— Ну да, и это мягко сказано. Но PHPNG разрабатывался маленькой командой с четко поставленной целью, что и позволило добиться успеха. А вот PHP 7 — это «демократически» открытый проект со всеми плюсами и минусами этой самой демократии. Не могу сказать, что все принятые в PHP 7 решения меня устраивают на 100%, но в принципе, думаю, получается очень даже неплохо.
— Что из себя представляет PHP 7 (PHPNG) на данный момент?
— Отмечу только самые важные с точки зрения пользователей особенности:
- новый уровень производительности;
- возможность определения типов аргументов и значений функций;
- многие ошибки, приводившие ранее к остановке приложения, теперь вызывают исключения и соответственно могут быть обработаны самим приложением;
- функция assert() теперь может обрабатываться особым образом, чтобы полностью исключить накладные расходы. То есть, можно использовать её для отладки и отключать в production;
- на Windows/64-бит целые числа наконец-то будут 64-битными;
- из главного дерева проекта убраны ext/mysql и ext/ereg (доступны в PECL);
- исключены некоторые устаревшие возможности.
— Осталось спросить, на какой стадии реализации находится эта самая свежая седьмая версия PHP?
— В начале года PHP 7 перешёл в стадию заморозки. Дорабатываются последние запланированные и одобренные нововведения. Дальше — чистка, стабилизация кода, тестирование, документация... Сам релиз запланирован на вторую половину 2015-го.
Проблемы роста и будущее PHP
— Описав прошлое и настоящее этой новой версии языка, самое время спросить о будущем. Какой roadmap в развитии PHPNG и PHP 7? Какие фичи вы планируете, чего ожидать фанатам языка в обозримом будущем?
— PHPNG свой roadmap закончил. Дальше будет развиваться PHP 7.0, 7.1 и.т.д. Я противник кардинальных изменений в языке и предпочёл бы видеть только реально востребованные фичи и универсальные конструкции, на базе которых можно самостоятельно строить почти всё, что угодно.
Из того, что сейчас мне кажется интересным и реализуемым, — аннотации (в некоторых языках называются атрибутами), кооперативная многозадачность, асинхронные функции. Ну, и в какой-то момент я надеюсь вернуться к JIT.
— Очень часто по отношению к PHP наблюдается какое-то надменно-брезгливое отношение со стороны адептов более «современных» языков программирования типа Ruby, Python и т.д. Они критикуют PHP за неразвитую объектную модель, большое количество самых разных шероховатостей и некрасивостей. Что с позиции профессионального разработчика этого языка вы бы могли возразить таким критикам?
— Начать стоит с того, что принято называть фактами. Сейчас PHP — это второй по популярности скриптовой язык в мире. Но популярность языков слабо связана с их «правильностью» или «кривизной». Важно понять, что PHP — это не просто язык, а в первую очередь рабочий инструмент, который позволяет успешно и быстро решать определенный круг задач. Его популярность лишь говорит, что это один из лучших инструментов в своей области.
Если же относиться к PHP сугубо академично как к языку, то я согласен, что тут он далёк он совершенства, и сам знаю с десяток несоответствий, «странностей» и.т.п. Что-то из этого постепенно удаляется и полируется, но вы поймите, каждое такое удаление — это потенциальная проблема для наших пользователей. Что вы скажете если завтра из С удалят goto? Почему это не сделано, несмотря на шквал критики академических специалистов?
В любом случае, моя работа над PHP связана по большей частью с улучшением производительности. И тут PHP уже давно обогнал и Python, и Ruby. Так что критикуйте дальше, а мы будем работать. (Улыбается, показывая результаты теста):
Mandelbrot benchmark (sec). gcc -O2 (4.9.2) 0.013 LuaJIT-2.0.3 (JIT=on) 0.014 gcc -O0 (4.9.2) 0.022 HHVM-3.5.0 (JIT=on) 0.030 Java-1.8.0 (JIT=on) 0.059 LuaJIT-2.0.3 (JIT=off) 0.073 Java-1.8.0 (JIT=off) 0.251 PHP-7 0.281 squirrel-3.0.4 0.335 Lua-5.2.2 0.339 PHP-5.6 0.379 PHP-5.5 0.383 PHP-5.4 0.406 ruby-2.1.5 0.684 PHP-5.3 0.855 HHVM-3.5.0 (JIT=off) 0.978 PHP-5.2 1.096 python-2.7.8 1.128 PHP-5.1 1.217 perl-5.18.4 2.083 PHP-4.4 4.209 PHP-5.0 4.434
(Желающие могут самостоятельно повторить указанный тест вот здесь).
— Чтобы как-то поставить точку в этой бесконечной по мощности «холиварной» теме, какие три классные вещи вы бы сами выделили в современном PHP? И, наоборот, можно ли привести несколько примеров узких мест, которые лично вас раздражают в PHP?
— Про достоинства PHP мне говорить довольно скучно. Просто повторюсь, что это достаточно хороший и доступный для масс инструмент для веб-программирования. Субъективно выделю такие общие положительные моменты:
- низкий порог вхождения;
- большинство концепций интуитивно понятны;
- богатый набор библиотек;
- неплохая документация и большое комьюинити.
Недостатки для каждого могут быть свои, в зависимости от предпочтений и сферы интересов. Для меня же это скорее список того, что я лично очень хочу реализовать:
- отсутствие поддержки механизмов многозадачности и асинхронности на уровне ядра PHP (кстати, это одна из главных целей для следующей версии);
- отсутствие JIT-компиляции (Полезность JIT для реальных PHP-приложений пока вызывает вопросы. Пока что нам удавалось существенно ускорять только небольшие синтетические тесты. Но это может говорить как о недостатках технологии, так и о «кривых» руках);
- некоторые излишне динамические возможности существенно усложняют эффективную реализацию.
— Выходя за пределы PHP, как опытный разработчик языков программирования, изучающий тренды разработок в более глобальном ракурсе, какие наблюдаются тенденции развития скриптовых языков для бэкенда?
— Я бы отметил несколько технологий, которые кажутся мне весьма интересными.
- Событийно-ориентированная модель, позволяющая очень эффективно решать определённый круг задач, связанных с обработкой большого количества конкурентных запросов (Node.js, nginx+Lua). Область применения достаточно ограничена, но очень востребована.
- Построение оптимизированных интерпретаторов и JIT-компиляторов на базе мета-интерпретаторов (PyPy). Помимо того что PyPy является реализацией Python, написанной на Python (и значительно более быстрой чем оригинальный СPython), это ещё и инструмент для реализации других языков.
- Я сам люблю логичные и простые языки. С моей точки зрения, описание языка должно укладываться на нескольких страницах. Реализация тоже не должна разрастаться бесконечно. Пример Lua показывает, как это должно быть сделано. На самом деле некоторые технические решения для PHP 7 были позаимствованы у Lua и LuaJIT.
— В заключение, отталкиваясь от трендов, какие советы вы бы дали начинающим программистам, в том числе пишущим на PHP?
— Вот мои четыре совета подрастающему поколению для лучшего старта, исходя из собственного опыта:
- Как бы вы не относились к PHP, я бы посоветовал попробовать как можно больше разных подходов. Хорошо бы понимать и функциональный подход, и логическое программирование, и ООП, и механизмы синхронизации. А в идеале представлять, как это всё работает в связке в реальном мире.
- Мне в своё время особенно помогли книги по теории компиляции.
- Ключевой момент — активное участие в совершенно разных проектах, что позволило наработать кругозор.
- Также специально для начинающих особо отмечу необходимость английского. Это и возможность читать необходимые порой научные работы, книги и документацию, и возможность участия в Open Source-проектах (см. предыдущий пункт). Хотите, присоединяйтесь к тем, что вам нравятся, хотите — создавайте и развивайте свои, здесь главное постоянно учиться и двигаться вперёд.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.