Новости Software

"Хип-хоп" от Facebook превращает PHP в С++

Мы уже сообщали о некоем таинственном проекте разработчиков социальной сети Facebook, связанном с переписыванием PHP-кода и снижением нагрузки на серверы. Итак, появились подробности данного проекта. В первую очередь стоит отметить, что в данном случае почти все слухи оказались правдивыми. Это действительно проект, связанный с переписыванием и модификацией PHP-скриптов для экономии ресурсов. Но в данном случае речь идет не об обыденном рефакторинге, а о довольно интересной технологии преобразования PHP-кода в С++. Кроме того, правильным оказался также и слух об опубликовании материалов как открытом ПО. Ну а теперь обо всем этом чуть подробнее.
Логотип проекта HipHop for PHP от разработчиков Facebook
Новая разработка, получившая название "HipHop for PHP" ("HipHop для PHP"), сама по себе не является компилятором, скорее это транслятор кода. Он автоматически превращает исходный код, написанный на PHP, в высоко оптимизированный код С++, а затем при помощи компилятора g++ его компилирует. HipHop обрабатывает код в семантически схожей манере, а потому от некоторых специфических возможностей (например, функции eval() ) пришлось отказаться. HipHop включает в себя транслятор кода, альтернативную реализацию среды выполнения PHP, а также множество наиболее распространённых расширений PHP (PHP Extensions), переписанных с целью повышения производительности. Кстати, разработчики данного проекта надеются что это позволит превысить уровень в 400 миллиардов просмотров PHP-страниц в месяц. Сам язык PHP относится к скриптовым языкам, таким как Perl, Python и Ruby, к основным преимуществам которых относится удобство и простота разработки. В этом отношении скриптовые языке если и не выигрывают, то вполне себе конкурируют с обычными компилируемыми и интерпретируемыми языками, как например, С++ и Java. Но с другой стороны, с точки зрения потребления ресурсов центрального процессора и памяти скриптовые языки существенно проигрывают компилируемым языкам. Одним из способов борьбы с подобной неэффективностью является переписывание наиболее сложных частей PHP-программы на языке С++ в виде расширений PHP. В результате PHP превращается в некую прослойку между HTML-страницей, выдаваемой конечному пользователю, и логикой на С++. К минусам подобного подхода относится сильно возрастающая сложность его исполнения, а это означает повышение требований к квалификации разработчика и снижению количества инженеров, способных разрабатывать подобные приложения, поскольку изучение С++ - это лишь первый шаг, причем вторым будет являться изучение Zend API. С учетом этого, команда разработчиков Facebook является относительно небольшой, составляя примерно 400 человек (Хайпин Жао (Haiping Zhao), являющийся одним из разработчиков проекта, пишет, что "сейчас на каждого инженера приходится свыше миллиона пользователей"). Вопрос масштабирования (повышение производительности) Facebook остро стоит из-за того, что почти все страницы зарегистрированных пользователей обладают собственными настройками. То есть, при просмотре страницы пользователя необходимо выполнять сбор информации о его друзьях, выбирать соответствующие обновления (за счет настраиваемой службы Multifeed), отфильтровать результаты в зависимости от настроек приватности, а затем еще вывести комментарии, фотографии и прочий материал, столь любимый пользователями. Все вместе это занимает менее секунды. HipHop позволяет написать логику, выполняющую окончательную сборку страницы из PHP и быстрое ее обновление, в то время как серверные службы, написанные на C++, Erlang, Java и Python, обслуживают новостной поток (News Feed), поиск, чат и прочие части сайта. Поиск способов улучшить производительность PHP сам по себе не являлся чем-то новым. Среда исполнения Zend Engine превращает написанный PHP-код в опкод (операционный код), а затем при помощи Zend Virtual Machine его выполняет. Для ускорения работы на некоторых веб-сайтах применяются наработки проектов с открытым исходным кодом, как например, APC и eAccelerator, использующие кеширование вывода. Также существует коммерческий продукт Zend Server, ускоряющий работу PHP за счет оптимизации опкода и кеширования. Однако разработчики HipHop предпочли другой подход, превратив PHP сразу в С++, который затем можно транслировать в машинный код. Причем, даже сама идея компиляции PHP-кода не является новой, поскольку уже до этого существовали проекты с открытым исходным кодом Roadsend и phc, компилирующие PHP в С, Quercus, компилирующий PHP в Java, а также Phalanger, компилирующий PHP в CIL байт-код для платформы .Net. Основной задачей проекта было "сокращение разрыва между PHP и С++". PHP - это скриптовый язык со слабой динамической типизацией, а С++ - компилируемый язык, обладающий статической типизацией. Вот это отличие разработчики и использовали для повышения производительности. В генерируемом коде по возможности использовалось статическое связывание функций и переменных, а также приведение наиболее специфичных типов в переменных к типам, определенными разработчиками, что позволило существенно экономить память.
Процесс трансляции кода PHP в C++
Процесс трансляции состоит из трех основных этапов: 1. Статический анализ, во время которого собирается информация о том, кто что объявляет и об их зависимостях; 2. Приведение типов, во время которого выбираются наиболее подходящие типы языка С++ (скаляры, строки, массивы, классы, объекты и т.д.); 3. Генерация кода, основывающаяся на прямом соотношении инструкций и выражений языка PHP и соответствующих им инструкций и выражений языка C++. Подводя итог, можно сказать, что HipHop позволил объединить простоту PHP с производительностью С++. Всего на данный момент проект состоит примерно из 300 тысяч строк кода и 5 тысяч модульных тестов. Ну а история проекта началась несколько лет назад однажды ночью на одной из хакерских встреч (Hackathon), когда Хайпин Жао написал первую часть кода, транслирующего PHP в C++. Эти языки довольно схожи с точки зрения синтаксиса, но С++ значительно превосходит PHP в плане эффективности потребления ресурсов процессора и памяти, несмотря на то, что движок PHP сам был написан на Си. Вообще различные попытки решить возникающие трудности с производительностью скриптов для сайта Facebook предпринимались начиная с 2007 года, причем разработчики все больше склонялись к мысли о необходимости целиком переписать код сайта на другом языке, поскольку все другие варианты не давали сколько-нибудь заметного прироста производительности (и это при том, что разработчики даже переписали фрагменты движка Zend Engine, лежащего в основе PHP, внеся свои изменения в общий проект!). Собственно, HipHop стал неким компромиссом между этим вариантом и желанием сохранить имеющиеся наработки. И вот спустя восемь месяцев после упомянутой ночи на Hackathon у Хайпина уже было достаточно кода для демонстрации его идеи ускорения за счет компиляции. Примерно в это же время к проекту подключились Айен Проктор (Iain Proctor) и Мингхай Янг (Minghui Yang). В течение последующих десяти месяцев шла работа над завершением кода, а следующие полгода - тестирование на производственных серверах. И вот на данный момент, то есть спустя лишь полгода после его внедрения, порядка 90% веб-траффика Facebook обслуживает именно при помощи HipHop. Необходимо отметить, что за всю двухлетнюю историю проекта работала над ним небольшая группа разработчиков. Но учитывая то, что как и практически любое ПО, чтобы "HipHop for PHP" обладало широкими возможностями, хорошей производительностью и минимумом ошибок, необходимы существенные затраты на его поддержку и развитие. Однако есть и другой путь, а именно "Open source". Вот именно им и решила пойти компания, открыв исходные коды проекты для всех желающих. Сам же проект на данном этапе был объявлен "незаконченным" и получил статус "беты". Кроме того, в ходе работы был создан побочный продукт, получивший название HPHPi, представляющий из себя экспериментальный компилятор, при использовании которого отпадает необходимость компиляции PHP-кода перед его исполнением. Он помог разработчикам выявлять ошибки в HipHop и позволил инженерам работать над проектам, не меняя способа разработки PHP-кода. Также для заинтересовавшихся проектом разработчики выложили запись лекции, посвященной HipHop. Материалы по теме: Источник:

window-new
Soft
Hard
Тренды 🔥