Две недели назад язык PHP, который используется в 81.9% сайтов всего мира, отметил 20-летие первого публичного релиза.
Я погутарил с ведущим разработчиком PHP 7 и по совместительству Chief Performance Engineer компании Zend Technologies Дмитрием Стоговым, который рассказал о последних веяниях в разработке PHP и мире скриптовых языков вообще. Можете считать, что это вторая часть к моему давнему интервью про изнанку PHP-мира с PHP Core Team.
— Дмитрий, как вы пришли в программирование?
— Моё знакомство с программированием началось с калькулятора «Электроника Б3-34». Польская нотация, 96 команд, простенькие игры типа посадки на луну... Потом была «Электроника Д3-28», Бейсик, мучение с кассетным накопителем.
Ну, а потом я увидел Pac-Man на CM-4. Очень захотелось его на «Д3-28», но возможностей и производительности Бейсика не хватало (а может просто опыта), и тогда я начал вникать в ассемблер. В общем, Pac-Man я так и не написал, зато дизассемблировал монитор, разобрался во внутренностях — так я постепенно и заработал манию к программированию
Дмитрий Стогов,
Chief Performance Engineer (Zend Technologies, Inc), PHP Core Team
— Почему подсели именно на 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.
— Это был важный проект 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-процентное ускорение и на тестах, и на реальных приложениях.
Well - that's impressive.
PHP 5.5.12: Time: 27.91 seconds, Memory: 162.00Mb
PHP 7: Time: 4.27 seconds, Memory: 98.00Mb
#php #php7
— Magnus Buk (@maegnes) 22 мая 2015
Не останавливаясь на достигнутом, каждый следующий месяц мы повышали производительность ещё на 10%. Сейчас мы имеем уже двукратное преимущество над предыдущей версией (и это без JIT).
Интересно, что сейчас PHP 7 на многих проектах быстрее HHVM (альтернативная реализация PHP от Facebook-a с JIT).
— Насколько я понимаю, вектор движения несколько раз менялся?
— Ну да, и это мягко сказано. Но PHPNG разрабатывался маленькой командой с четко поставленной целью, что и позволило добиться успеха. А вот PHP 7 — это «демократически» открытый проект со всеми плюсами и минусами этой самой демократии. Не могу сказать, что все принятые в PHP 7 решения меня устраивают на 100%, но в принципе, думаю, получается очень даже неплохо.
— Что из себя представляет PHP 7 (PHPNG) на данный момент?
— Отмечу только самые важные с точки зрения пользователей особенности:
Аноннимные классы в #PHP7 #PHP!
http://t.co/GmFXoREiIQ pic.twitter.com/8ce53yis89
— Фаттахов Дамир (@captain_adama) 22 мая 2015
— Осталось спросить, на какой стадии реализации находится эта самая свежая седьмая версия PHP?
— В начале года PHP 7 перешёл в стадию заморозки. Дорабатываются последние запланированные и одобренные нововведения. Дальше — чистка, стабилизация кода, тестирование, документация... Сам релиз запланирован на вторую половину 2015-го.
— Описав прошлое и настоящее этой новой версии языка, самое время спросить о будущем. Какой 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, как опытный разработчик языков программирования, изучающий тренды разработок в более глобальном ракурсе, какие наблюдаются тенденции развития скриптовых языков для бэкенда?
— Я бы отметил несколько технологий, которые кажутся мне весьма интересными.
— В заключение, отталкиваясь от трендов, какие советы вы бы дали начинающим программистам, в том числе пишущим на PHP?
— Вот мои четыре совета подрастающему поколению для лучшего старта, исходя из собственного опыта:
Хотите, присоединяйтесь к тем, что вам нравятся, хотите — создавайте и развивайте свои, здесь главное постоянно учиться и двигаться вперёд.
PHP 7: First version on June 11h #php #php7 pic.twitter.com/YvAHxj33SO
— #BlackSoupe (@BlackYoup) 28 мая 2015
Дополнительные материалы по новому PHP7 на русском:
PHP7 slides by Julien Pauli, PHP core crew http://t.co/CMb5nldrA0 #php7
— Dev Metal (@devmetalblog) 26 мая 2015
8 комментариев
Забавная ситуация вышла с PHP6
Решили сразу на семерку перескочить
Интересно, стоит ли заранее начинать читать документацию по нему?
http://digimac.ru/
Комментатор 220 - да, типа изменения настолько радикальны, что нужно как-то подчеркнуть масштаб новой версии - поэтому сразу перепрыгнули через шестерку. Для программистов, думаю, этот намек на грандиозность содеянного, вполне понятен.
Прежде всего, хочу поблагодарить за хорошее интервью.
Но, уважаемый автор, картинка к статье крайне оскорбляет мои чувства. Убери ее или съешь тарелку ****.
Спасибо за понимание.
PHP 6 разрабатывался с учётом полной поддержки юникода, на уровне ядра.
После долгих мучений получилось, что не получилось.
Вот ветку 6 в отстойник и поместили, а на её место придёт быстрый и динамичный потомок PHPNG за именем PHP 7.
"моя работа над PHP связана по большей частью с улучшением производительности. И тут PHP уже давно обогнал и Python, и Ruby"
товарищ знает про существование PyPy, но почему то осознанно не приводит для него бенчмарк. в нем PyPy быстрее хваленого php 7 в 7 раз
https://gist.github.com/hipertracker/734305
Я бы не отзывался так лестно о PyPy...
Stringer: "типа изменения настолько радикальны, что нужно как-то подчеркнуть масштаб новой версии - поэтому сразу перепрыгнули через шестерку".
Лолшто?
...81.9% сайтов всего мира - весомая цифра ;)