- PVSM.RU - https://www.pvsm.ru -
Ракета Союз, доставленная на поезде на пусковую площадку. Фото из общественного достояния NASA.
Это перевод статьи Taking PHP Seriously [1], автор которой является одним из инженеров известного приложения Slack. Он рассказывает о недостатках и преимуществах PHP, а также о языке Hack [2] и виртуальной машине HHVM [3], на которую почти завершил переход Slack.
Slack использует PHP для большей части своей серверной логики, что является не самым популярным выбором в наши дни. Почему же мы решили написать новый проект именно на этом языке? Следует ли вам поступать также?
Большинство программистов, которые немного игрались с PHP, знают две вещи про него: это плохой язык, который они никогда не станут использовать при наличии выбора, и что некоторые из чрезвычайно успешных проектов в истории мира используют его. Это не совсем противоречие, но этот факт должен заставить вас задуматься. То есть, Facebook, Wikipedia, WordPress, Etsy, Baidu, Box и в последнее время Slack — все они успешно решают проблемы, не смотря на то, что используют PHP? Были ли бы они более успешными, если бы они использовали у себя Ruby? Erlang? Haskell?
Вполне возможно, что нет. Язык PHP имеет множество недостатков, которые, несомненно, замедлили его развитие, но среда PHP имеет такие достоинства, которые более чем компенсируют данные недостатки. И он также имеет способы [4] разрешения его собственных языковых проблем, которые вполне впечатляют [2]. По итоговым результатам, PHP предоставляет наилучший фундамент для создания, изменения и эксплуатации успешного веб-проекта по сравнению с конкурирующими средами. Сегодня я хотел бы начать новый проект на PHP, с парой оговорок, но не видя причин извиняться за это.
PHP родился в уникальной для современных языков среде веб-сервера. Его сильные стороны связаны с контекстом запроса на сервере.
PHP изначально назывался "Персональная Домашняя Страница [4]". Он был опубликован в 1995г. Расмусом Лердорфом, с нацеливанием на поддержку маленьких, простых динамических веб-приложений, вроде гостевых книг и счётчиков посетителей, популярных на заре Интернета.
[1] [5], которая включает JavaScript, Python, Ruby и Lua. Если вы пробовали PHP в ранние 2000-ные, современная кодовая база PHP может удивить вас трейтами [6], замыканиями [7] и генераторами [8].
PHP имеет несколько очень глубоких и, однозначно, верных особенностей.
Первая, состояние. Каждый веб-запрос начинается с совершенно чистого листа. Его пространство имён и глобальные переменные не инициализированы, за исключением некоторых стандартных глобальных переменных, функций и классов, которые предоставляют примитивную функциональность и жизнеобеспечение. Начиная каждый запрос с известного состояния, мы получаем своего рода изоляцию от возможных ошибок; если запрос t сталкивается с неполадкой ПО и завершается с ошибкой, данный баг не оказывает никакого влияния на выполнение последующего запроса t+1. В действительности, конечно же, помимо программной кучи, состояние приложения находится и в других местах, и вполне возможно полностью испортить базу данных, memcache или файловую систему. Но PHP разделяет эту слабость со всеми мыслимыми средами, которые позволяют сохранять состояние. В то же время, разделение программных куч между запросами снижает цену большинства программных ошибок.
Вторая, параллелизм. Индивидуальный запрос работает в одном PHP потоке. На первый взгляд, это кажется глупым ограничением. Но так как наше приложение выполняется в контексте веб-сервера, мы имеет натуральный источник параллелизма: веб запросы. Асинхронный curl'инг на локалхост (или даже другой веб-сервер) предоставляет неразделяемый (shared-nothing), копирование-в/копирование-из подход использования параллелизма. На практике, это безопаснее и устойчивее к ошибкам, чем подход с блокировками и разделяемым состоянием, который используется в других языках общего назначения.
В заключении, тот факт, что PHP программы оперируют на уровне запросов, означает, что рабочий процесс программиста является быстрым и эффективным, и остаётся быстрым после изменения приложения. Множество языков продуктивной разработки претендуют на это, но если они не очищают своё состояние при каждом запросе, и основной поток событий разделяет программный уровень состояния между запросами, они почти всегда требуют некоторое время на запуск. Для типичного сервера приложений на Python'е, типичный цикл отладки будет выглядеть примерно как «подумать, отредактировать, перезапустить сервер, отправить несколько тестовых запросов». Даже если «перезапустить сервер» занимает всего несколько секунд из общего количества часов, это забирает большой срез из 15-30 секунд [9] наших человеческих мозгов на необходимость удержания в голове самой ненужной части текущего состояния.
Я утверждаю, что разработка на PHP в стиле «подумать, отредактировать и перезагрузить страницу» делает разработчиков более продуктивными. В долгих и сложных циклах разработки проектов это даёт ещё больший прирост.
Если всё это является правдой, почему же его так ненавидят [10]? Когда вы уберёте все красочные гиперболы в сторону, что основные жалобы о PHP кластере сведутся к следующим проблемам:
Чтобы не показаться нерефлективным апологетом PHP: всё это серьёзные проблемы, которые позволяют более вероятно создавать дефекты. Они являются явными ошибками (unforced errors). Здесь нет присущего компромисса между Хорошими Частями PHP и данными проблемами. Должна быть реализована возможность создать PHP, который разрешит данные недостатки, сохранив при этом все хорошие стороны.
Этот преемник системы PHP зовётся Hack [2] [3] [14]
Hack — это такой язык программирования, который люди называют «постепенная система типов» для PHP. «Система типов» значит, что он позволяет программисту составлять автоматически проверяемые инварианты [15] о данных, которые протекают через код: данная функция берёт строку или число и возвращает лист Fribbles, как например в Java или C++ или Haskell, или в любом другом статически типизированном языке, который вы выберете. «Постепенная» означает, что некоторые части вашей кодовой базы могут быть статически типизированными, в то время как другие её части могут всё ещё находится в беспорядочном, динамическом PHP. Возможность совмещать эти подходы позволяет постепенно мигрировать большие кодовые базы.
Вместо того чтобы разлить здесь тонны чернил в описании системы типов Hack и того, как она работает, просто поиграйтесь с ним [16]. Я буду здесь, когда вы вернётесь.
Это аккуратная система, и она весьма амбициозна в том что она позволяет вам выразить. И наличие возможности постепенной миграции проекта на Hack, в случаях когда он разрастается сильнее, чем вы ожидали изначально, является уникальным преимуществом экосистемы PHP. Проверки типов Hack сохраняют рабочий процесс в стиле «думать, отредактировать, перезагрузить страницу», потому что они запускаются в фоне, постепенно обновляя модель кодовой базы, когда он видит модификации в файловой системе. Проект Hack предоставляет интеграции со всеми популярными редакторами и IDE, так что вы сможете увидеть обратную связь об ошибках типов уже тогда, когда завершите печатать код, также как в веб-демонстрации.
Давайте рассмотрим совокупность реальных рисков, которые создаёт PHP, в свете Hack:
Hack предоставляет возможность, которой не имеют другие популярные члены семьи MPDPL: возможность ввести систему типов уже после основной разработки, и только частично, в тех частях системы, где значение перевешивает цену.
Hack изначально был разработан как часть виртуальной машины HipHop [3], или HHVM, виртуальной среды с открытым исходным кодом для PHP. HHVM предоставляет другую важную опцию для успешного проекта: возможность запустить ваш сайт быстрее и более экономно. Facebook докладывает [19] о приросте производительности в 11.6 раз на процессорной эффективности над интерпретатором PHP, а Wikipedia сообщает [20] об ускорении в 6 раз.
Slack недавно перевёл свои веб-окружения на HHVM и получил значительные снижения задержек на всех точках выхода, но нам не хватает измерений в стиле apples-to-apples на процессорные нагрузки на момент написания этого текста. Мы также находимся в процессе перемещения нашей кодовой базы на Hack и будем сообщать о своём опыте здесь.
Мы начали с очевидного парадокса о том, что PHP является очень плохим языком, который используется во многих успешных проектах. Мы считаем, что его репутация как бедного языка, в изоляции, довольно заслуженна. Успех проектов, использующих его, имеет много общего с основными свойствами среды PHP, и возможностью ускоренной разработки, которая также предоставляет PHP. И преимущества от этого окружения (сниженное количество багов через изоляцию ошибок; безопасная параллельность; высокая пропускная способность программистов) являются более ценными, чем проблемы, которые возникают из-за недостатков языка.
Кроме того, в отличии от других членов семьи MPDPL, он предоставляет чёткий путь для миграции на более производительную, безопасную и обслуживаемую среду в виде Hack и HHVM. Slack находится на последних стадиях к переходу на HHVM, и на ранних этапах перехода на Hack, и мы оптимистично настроены, так как они позволяют нам производить более качественное программное обеспечение в более быстрые сроки.
Примечания (они тоже из блога разработчика):
[1] Это я придумал термин MPDPL. В то время как существует мало генетических связей между ними, данные языки сильно повлияли друг на друга. Глядя на прошлый синтаксис, можно увидеть, что они имеют намного больше общего, чем отличий. Во вселенной языков программирования ассамблеи MIPS [21], Haskell, C++, Forth и Erlang, трудно отрицать, что MPDPL образуют плотный кластер в пространстве языковых дизайнов. [назад к тексту] [22]
dl.acm.org/citation.cfm?id=2660199 [23]. [назад к тексту] [24]
[назад к тексту] [25]
[назад к тексту] [26]
Автор: saggid
Источник [27]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/209054
Ссылки в тексте:
[1] Taking PHP Seriously: https://slack.engineering/taking-php-seriously-cf7a60065329#.v0vmkde83
[2] Hack: http://hacklang.org/
[3] HHVM: http://hhvm.com/
[4] способы: http://php.net/manual/ru/history.php.php
[5] [1]: #note-1
[6] трейтами: http://php.net/manual/ru/language.oop5.traits.php
[7] замыканиями: http://php.net/manual/ru/functions.anonymous.php
[8] генераторами: http://php.net/manual/ru/language.generators.overview.php
[9] 15-30 секунд: https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%BE%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C
[10] так ненавидят: https://habrahabr.ru/post/142140/
[11] [2]: #note-2
[12] Философия вычислений, игнорирующих отказы: http://people.csail.mit.edu/rinard/paper/osdi04.pdf
[13] разрешена в PHP 7: http://php.net/manual/ru/migration70.incompatible.php
[14] [3]: #note-3
[15] инварианты: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82#.D0.92_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B8
[16] просто поиграйтесь с ним: http://hacklang.org/tutorial.html
[17] запретом использования ссылок старого стиля: https://docs.hhvm.com/hack/unsupported/references
[18] [4]: #note-4
[19] докладывает: https://research.facebook.com/publications/the-hiphop-virtual-machine/
[20] сообщает: http://hhvm.com/blog/7205/wikipedia-on-hhvm
[21] ассамблеи MIPS: https://en.wikibooks.org/wiki/MIPS_Assembly
[22] [назад к тексту]: #note-1-back
[23] dl.acm.org/citation.cfm?id=2660199: http://dl.acm.org/citation.cfm?id=2660199
[24] [назад к тексту]: #note-2-back
[25] [назад к тексту]: #note-3-back
[26] [назад к тексту]: #note-4-back
[27] Источник: https://habrahabr.ru/post/314970/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.