Плюсы и минусы компилируемого PHP
На митапе VK Tech Talks | Engines & KPHP, который прошёл 29 августа, руководитель Команды backend-оптимизации Александр Кирсанов рассказал о плюсах и минусах компилируемого скриптового языка PHP.
У Александра небольшая команда, но все в ней постоянно находятся в работе: оптимизируют, что-то допиливают. А самое важное и значительное, что она делает, — это компилятор KPHP.
В репозитории vk.com находится около 5,5 миллиона строк кода на PHP. Встаёт вопрос: «Почему ВКонтакте, передовая компания, работает на PHP, ведь на дворе 2019 год?»
Давайте в этом разберёмся:
- Так исторически сложилось (любимая отмазка).
- Интерпретируемая разработка — это удобно.
- Мы придумали, как сделать PHP быстрым.
О чём мы сегодня поговорим?
- Что такое KPHP и как он работает.
- Какие возникают проблемы.
- Какие мы получаем преимущества.
Что такое KPHP и как он работает?
В начале мы имеем код на PHP, который превращаем в код на C++. Но этого недостаточно — весь рантайм должен реализоваться в PHP.
Проблема в том, что PHP и С++ слишком разные: PHP — интерпретируемый, а С++ — компилируемый.
После долгих раздумий на тему того, как проще объяснить работу KPHP изнутри, было принято решение показать её на примерах.





Если рассмотреть формально, мы берём PHP-код и прогоняем через lexer, получая линейный список токенов. Далее строим синтетическое дерево. Обладая деревьями для каждой функции, можно вычислить достижимость. На основании cfg мы выводим типы (определяем где строки, где числа и т. д.). Обладая типами, мы переходим к оптимизации. Например, выносим константы. Всё это пропускается через код-генератор и получается код на С++.
Но на этом приключения не заканчиваются.
После рассказа про технический процесс следует рассказать и о цифрах:
- 5,5 млн строк PHP-кода;
- 180 000 cpp/h файлов;
- 2 ГБ — размер бинарника vkcom;
- сборка с нуля за 6 минут.
Какие возникают проблемы?
Во-первых, всё должно работать так же, как в PHP.
Следующая проблема — скорость компиляции. Если все исходники и файлы просто поместить в gcc, ничего не сработает.
Решением стала распределённая компиляция:
Ещё одна неочевидная проблема — стектрейсы. Имеется 5,5 миллиона строк кода, которые не написаны в одном файле. Минимальная архитектура всё же есть.
Вряд ли разработчик ожидал этого, поэтому PHP пишет notice:
Но у нас-то не PHP, а С++, в котором есть только адреса памяти. Вот так выглядят стектрейсы на С++:
Для решения проблемы есть два независимых шага:


Подытожим про стектрейсы:
- При warning на проде есть плюсовый stacktrace.
- Админскими скриптами копируется в базу.
- addr2line на debug-бинарнике — строки в C++.
- Над ними — комментарии — строки на PHP.
Отдадим разработчикам PHP должное. Если бы я задался сделать максимально нелогичный язык, у меня бы не получилось. А здесь получилось.
Этим всё не заканчивается. Поскольку у нас бинарник в С++, чего-то не может быть в принципе:
- обращений по именам;
- моков, подмены функций на лету;
- Runtime reflection;
- технических ограничений;
- Vkext;
- 32 bit vs 64 bit;
- исключений;
- PHP-only кода;
- не справляются asan, valgrind;
- собственного make.
Какие мы получаем преимущества?
Как оценить Performance?
Бенчмарки в данном случае бесполезны. Единственный способ понять, какой профит — посмотреть наши цифры.


Мы выигрываем не только по Performance, но и по памяти, потому что в PHP никаких типов во время компиляции — всё в рантайме.
Яркий пример — это класс:
Есть вещи, которых нет в PHP, но они есть у нас. Например, аналоги корутин.


Если же нам что-то очень нужно, мы можем это переписать на С++. Например, умножение матриц для нейронных сетей:
Конкретно наше преимущество ещё в том, что код лежит вместе с движками в одном репозитории. Для нас это удобно.
Что можно сказать напоследок?
- Performance — все страдания ради этого, все ограничения ради этого.
- Стабильность.
- Есть, что доделать и оптимизировать.
На этом всё, а полную версию выступления можно посмотреть ниже:
The Brown Room — независимое интернет-издание про социальные сети и современные технологии
Автор: Сергей Котов
Корректор: Лена NL
Слайды и данные: VK Tech
