Просмотров: 16672

Топ-разработчик PHP 7: «Критикуйте дальше, а мы будем работать»


Две недели назад язык PHP, который используется в 81.9% сайтов всего мира, отметил 20-летие первого публичного релиза.

Я погутарил с ведущим разработчиком PHP 7 и по совместительству Chief Performance Engineer компании Zend Technologies Дмитрием Стоговым, который рассказал о последних веяниях в разработке PHP и мире скриптовых языков вообще. Можете считать, что это вторая часть к моему давнему интервью про изнанку PHP-мира с PHP Core Team.

Топ-разработчик PHP 7: «Критикуйте дальше, а мы будем работать» Стогов

Zend и обретение мании программирования

— Дмитрий, как вы пришли в программирование?

— Моё знакомство с программированием началось с калькулятора «Электроника Б3-34». Польская нотация, 96 команд, простенькие игры типа посадки на луну... Потом была «Электроника Д3-28», Бейсик, мучение с кассетным накопителем.

Ну, а потом я увидел Pac-Man на CM-4. Очень захотелось его на «Д3-28», но возможностей и производительности Бейсика не хватало (а может просто опыта), и тогда я начал вникать в ассемблер. В общем, Pac-Man я так и не написал, зато дизассемблировал монитор, разобрался во внутренностях — так я постепенно и заработал манию к программированию

Топ-разработчик PHP 7: «Критикуйте дальше, а мы будем работать» Стогов
Дмитрий Стогов,
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 и 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).

Топ-разработчик PHP 7: «Критикуйте дальше, а мы будем работать» Стогов

— Насколько я понимаю, вектор движения несколько раз менялся?

— Ну да, и это мягко сказано. Но PHPNG разрабатывался маленькой командой с четко поставленной целью, что и позволило добиться успеха. А вот PHP 7 — это «демократически» открытый проект со всеми плюсами и минусами этой самой демократии. Не могу сказать, что все принятые в PHP 7 решения меня устраивают на 100%, но в принципе, думаю, получается очень даже неплохо.

— Что из себя представляет PHP 7 (PHPNG) на данный момент?

— Отмечу только самые важные с точки зрения пользователей особенности:

  • новый уровень производительности;
  • возможность определения типов аргументов и значений функций;
  • многие ошибки, приводившие ранее к остановке приложения, теперь вызывают исключения и соответственно могут быть обработаны самим приложением;
  • функция assert() теперь может обрабатываться особым образом, чтобы полностью исключить накладные расходы. То есть, можно использовать её для отладки и отключать в production;
  • на Windows/64-бит целые числа наконец-то будут 64-битными;
  • из главного дерева проекта убраны ext/mysql и ext/ereg (доступны в PECL);
  • исключены некоторые устаревшие возможности.

— Осталось спросить, на какой стадии реализации находится эта самая свежая седьмая версия PHP?

— В начале года PHP 7 перешёл в стадию заморозки. Дорабатываются последние запланированные и одобренные нововведения. Дальше — чистка, стабилизация кода, тестирование, документация... Сам релиз запланирован на вторую половину 2015-го.

Топ-разработчик PHP 7: «Критикуйте дальше, а мы будем работать» Стогов

Проблемы роста и будущее 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 7: «Критикуйте дальше, а мы будем работать» Стогов

— Чтобы как-то поставить точку в этой бесконечной по мощности «холиварной» теме, какие три классные вещи вы бы сами выделили в современном PHP? И, наоборот, можно ли привести несколько примеров узких мест, которые лично вас раздражают в PHP?

— Про достоинства PHP мне говорить довольно скучно. Просто повторюсь, что это достаточно хороший и доступный для масс инструмент для веб-программирования. Субъективно выделю такие общие положительные моменты:

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

Недостатки для каждого могут быть свои, в зависимости от предпочтений и сферы интересов. Для меня же это скорее список того, что я лично очень хочу реализовать:

  • отсутствие поддержки механизмов многозадачности и асинхронности на уровне ядра PHP (кстати, это одна из главных целей для следующей версии);
  • отсутствие JIT-компиляции (Полезность JIT для реальных PHP-приложений пока вызывает вопросы. Пока что нам удавалось существенно ускорять только небольшие синтетические тесты. Но это может говорить как о недостатках технологии, так и о «кривых» руках);
  • некоторые излишне динамические возможности существенно усложняют эффективную реализацию.

— Выходя за пределы PHP, как опытный разработчик языков программирования, изучающий тренды разработок в более глобальном ракурсе, какие наблюдаются тенденции развития скриптовых языков для бэкенда?

— Я бы отметил несколько технологий, которые кажутся мне весьма интересными.

  • Событийно-ориентированная модель, позволяющая очень эффективно решать определённый круг задач, связанных с обработкой большого количества конкурентных запросов (Node.js, nginx+Lua). Область применения достаточно ограничена, но очень востребована.
  • Построение оптимизированных интерпретаторов и JIT-компиляторов на базе мета-интерпретаторов (PyPy). Помимо того что PyPy является реализацией Python, написанной на Python (и значительно более быстрой чем оригинальный СPython), это ещё и инструмент для реализации других языков.
  • Я сам люблю логичные и простые языки. С моей точки зрения, описание языка должно укладываться на нескольких страницах. Реализация тоже не должна разрастаться бесконечно. Пример Lua показывает, как это должно быть сделано. На самом деле некоторые технические решения для PHP 7 были позаимствованы у Lua и LuaJIT.

— В заключение, отталкиваясь от трендов, какие советы вы бы дали начинающим программистам, в том числе пишущим на PHP?

— Вот мои четыре совета подрастающему поколению для лучшего старта, исходя из собственного опыта:

  1. Как бы вы не относились к PHP, я бы посоветовал попробовать как можно больше разных подходов. Хорошо бы понимать и функциональный подход, и логическое программирование, и ООП, и механизмы синхронизации. А в идеале представлять, как это всё работает в связке в реальном мире.
  2. Мне в своё время особенно помогли книги по теории компиляции.
  3. Ключевой момент — активное участие в совершенно разных проектах, что позволило наработать кругозор.
  4. Также специально для начинающих особо отмечу необходимость английского. Это и возможность читать необходимые порой научные работы, книги и документацию, и возможность участия в Open Source-проектах (см. предыдущий пункт).
  5. Хотите, присоединяйтесь к тем, что вам нравятся, хотите — создавайте и развивайте свои, здесь главное постоянно учиться и двигаться вперёд.

    Дополнительные материалы по новому PHP7 на русском:

    dev.by, 2015

    twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru pikabu.ru blogger.com liveinternet.ru livejournal.ru google.com bobrdobr.ru yandex.ru del.icio.us

Подписка на обновления блога → через RSS, на e-mail, через Twitter
Теги: , , , ,
Эта запись опубликована: Пятница, 3 июля 2015 в рубрике ПрограммированиеИнтервью.

8 комментариев

Следите за комментариями по RSS
  1. Забавная ситуация вышла с PHP6

    Решили сразу на семерку перескочить

    Интересно, стоит ли заранее начинать читать документацию по нему?

    http://digimac.ru/

  2. Комментатор 220 - да, типа изменения настолько радикальны, что нужно как-то подчеркнуть масштаб новой версии - поэтому сразу перепрыгнули через шестерку. Для программистов, думаю, этот намек на грандиозность содеянного, вполне понятен.

  3. Виталий

    Прежде всего, хочу поблагодарить за хорошее интервью.

    Но, уважаемый автор, картинка к статье крайне оскорбляет мои чувства. Убери ее или съешь тарелку ****.

    Спасибо за понимание.

  4. PHP 6 разрабатывался с учётом полной поддержки юникода, на уровне ядра.

    После долгих мучений получилось, что не получилось.

    Вот ветку 6 в отстойник и поместили, а на её место придёт быстрый и динамичный потомок PHPNG за именем PHP 7.

  5. "моя работа над PHP связана по большей частью с улучшением производительности. И тут PHP уже давно обогнал и Python, и Ruby"

    товарищ знает про существование PyPy, но почему то осознанно не приводит для него бенчмарк. в нем PyPy быстрее хваленого php 7 в 7 раз

  6. https://gist.github.com/hipertracker/734305

    Я бы не отзывался так лестно о PyPy...

  7. Stringer: "типа изменения настолько радикальны, что нужно как-то подчеркнуть масштаб новой версии - поэтому сразу перепрыгнули через шестерку".

    Лолшто?

  8. ...81.9% сайтов всего мира - весомая цифра ;)

Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Зарегистрировать/комментатор

Для регистрации укажите свой действующий email и пароль. Связка email-пароль позволяет вам комментировать и редактировать данные в вашем персональном аккаунте, такие как адрес сайта, ник и т.п. (Письмо с активацией придет в ящик, указанный при регистрации)

(обязательно)


⇑ Наверх
⇓ Вниз