Плюсы и минусы компилируемого PHP

На митапе VK Tech Talks | Engines & KPHP, который прошёл 29 августа, руководитель Команды backend-оптимизации Александр Кирсанов рассказал о плюсах и минусах компилируемого скриптового языка PHP.

У Александра небольшая команда, но все в ней постоянно находятся в работе: оптимизируют, что-то допиливают. А самое важное и значительное, что она делает, — это компилятор KPHP.

В репозитории vk.com находится около 5,5 миллиона строк кода на PHP. Встаёт вопрос: «Почему ВКонтакте, передовая компания, работает на PHP, ведь на дворе 2019 год?»

Давайте в этом разберёмся:

  1. Так исторически сложилось (любимая отмазка).
  2. Интерпретируемая разработка — это удобно.
  3. Мы придумали, как сделать PHP быстрым.

О чём мы сегодня поговорим?

  1. Что такое KPHP и как он работает.
  2. Какие возникают проблемы.
  3. Какие мы получаем преимущества.

Что такое KPHP и как он работает?

В начале мы имеем код на PHP, который превращаем в код на C++. Но этого недостаточно — весь рантайм должен реализоваться в PHP.

Плюсы и минусы компилируемого PHP, image #1

Проблема в том, что PHP и С++ слишком разные: PHP — интерпретируемый, а С++ — компилируемый.

Плюсы и минусы компилируемого PHP, image #2

После долгих раздумий на тему того, как проще объяснить работу KPHP изнутри, было принято решение показать её на примерах.

Плюсы и минусы компилируемого PHP, image #3
Плюсы и минусы компилируемого PHP, image #4
Плюсы и минусы компилируемого PHP, image #5
Плюсы и минусы компилируемого PHP, image #6
Плюсы и минусы компилируемого PHP, image #7
1 of 5

Если рассмотреть формально, мы берём PHP-код и прогоняем через lexer, получая линейный список токенов. Далее строим синтетическое дерево. Обладая деревьями для каждой функции, можно вычислить достижимость. На основании cfg мы выводим типы (определяем где строки, где числа и т. д.). Обладая типами, мы переходим к оптимизации. Например, выносим константы. Всё это пропускается через код-генератор и получается код на С++.

Плюсы и минусы компилируемого PHP, image #8

Но на этом приключения не заканчиваются.

Плюсы и минусы компилируемого PHP, image #9

После рассказа про технический процесс следует рассказать и о цифрах:

  1. 5,5 млн строк PHP-кода;
  2. 180 000 cpp/h файлов;
  3. 2 ГБ — размер бинарника vkcom;
  4. сборка с нуля за 6 минут.

Какие возникают проблемы?

Во-первых, всё должно работать так же, как в PHP.

Плюсы и минусы компилируемого PHP, image #10

Следующая проблема — скорость компиляции. Если все исходники и файлы просто поместить в gcc, ничего не сработает.

Плюсы и минусы компилируемого PHP, image #11

Решением стала распределённая компиляция:

Плюсы и минусы компилируемого PHP, image #12

Ещё одна неочевидная проблема — стектрейсы. Имеется 5,5 миллиона строк кода, которые не написаны в одном файле. Минимальная архитектура всё же есть.

Плюсы и минусы компилируемого PHP, image #13

Вряд ли разработчик ожидал этого, поэтому PHP пишет notice:

Плюсы и минусы компилируемого PHP, image #14

Но у нас-то не PHP, а С++, в котором есть только адреса памяти. Вот так выглядят стектрейсы на С++:

Плюсы и минусы компилируемого PHP, image #15

Для решения проблемы есть два независимых шага:

Плюсы и минусы компилируемого PHP, image #16
Плюсы и минусы компилируемого PHP, image #17
1 of 2

Подытожим про стектрейсы:

  1. При warning на проде есть плюсовый stacktrace.
  2. Админскими скриптами копируется в базу.
  3. addr2line на debug-бинарнике — строки в C++.
  4. Над ними — комментарии — строки на PHP.

Отдадим разработчикам PHP должное. Если бы я задался сделать максимально нелогичный язык, у меня бы не получилось. А здесь получилось.

Этим всё не заканчивается. Поскольку у нас бинарник в С++, чего-то не может быть в принципе:

  1. обращений по именам;
  2. моков, подмены функций на лету;
  3. Runtime reflection;
  4. технических ограничений;
  5. Vkext;
  6. 32 bit vs 64 bit;
  7. исключений;
  8. PHP-only кода;
  9. не справляются asan, valgrind;
  10. собственного make.

Какие мы получаем преимущества?

Плюсы и минусы компилируемого PHP, image #18

Как оценить Performance?

Плюсы и минусы компилируемого PHP, image #19

Бенчмарки в данном случае бесполезны. Единственный способ понять, какой профит — посмотреть наши цифры.

Плюсы и минусы компилируемого PHP, image #20
Плюсы и минусы компилируемого PHP, image #21
1 of 2

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

Плюсы и минусы компилируемого PHP, image #22

Яркий пример — это класс:

Плюсы и минусы компилируемого PHP, image #23
Плюсы и минусы компилируемого PHP, image #24

Есть вещи, которых нет в PHP, но они есть у нас. Например, аналоги корутин.

Плюсы и минусы компилируемого PHP, image #25
Плюсы и минусы компилируемого PHP, image #26
1 of 2

Если же нам что-то очень нужно, мы можем это переписать на С++. Например, умножение матриц для нейронных сетей:

Плюсы и минусы компилируемого PHP, image #27

Конкретно наше преимущество ещё в том, что код лежит вместе с движками в одном репозитории. Для нас это удобно.

Что можно сказать напоследок?

  1. Performance — все страдания ради этого, все ограничения ради этого.
  2. Стабильность.
  3. Есть, что доделать и оптимизировать.
Плюсы и минусы компилируемого PHP, image #28

На этом всё, а полную версию выступления можно посмотреть ниже:

Плюсы и минусы компилируемого PHP, image #29

The Brown Room — независимое интернет-издание про социальные сети и современные технологии

Автор: Сергей Котов
Корректор: Лена NL
Слайды и данные: VK Tech

323 views·6 shares
323 views