Почему Facebook конвертирует код PHP в C ++? [закрыто]

42

Я читал, что Facebook начинался на PHP, а затем, чтобы набрать скорость, теперь он компилирует PHP как код C ++. Если это так, почему бы им не

  1. Просто программа на с ++? Конечно, должны быть НЕКОТОРЫЕ ошибки / ошибки при нажатии волшебной кнопки компилятора, которая портирует PHP на код C ++, верно?

  2. Если этот впечатляющий конвертер работает так хорошо, зачем вообще придерживаться PHP? Почему бы не использовать что-то вроде Ruby или Python? Примечание. Я выбрал эти два наугад, но в основном потому, что почти все говорят, что кодирование на этих языках - «радость». Так почему бы не развиться на супер отличном языке, а затем нажать волшебную кнопку компиляции c ++?

user72245
источник
12
Обе ваши альтернативы, вероятно, будут означать выброс всего PHP-кода, специфичных для PHP инструментов и опыта, половину вспомогательной инфраструктуры и т. Д., Которые уже есть и начинаются с нуля.
Зачем? Если вы можете конвертировать код в C ++, то, несомненно, любой может использовать свой любимый язык, нажать кнопку конвертации и заставить его перейти на базу кода C ++. Нет?
user72245
7
Нет. Компиляторы, по большому счету, создают рабочий, но уродливый и неестественный код и отбрасывают такие вещи, как имена переменных, комментарии, не говоря уже о всевозможных абстракциях. В значительной степени это неизбежно. Хотя есть некоторые проекты, нацеленные на фактический перевод в поддерживаемую кодовую базу на другом языке, проблема намного сложнее, особенно с разными языками. Кроме того, даже при условии, что выйдет совершенно идиоматический C ++, все, кто работает над базой кода, должны будут изучить C ++ или быть уволенными и заменены людьми, которые знают C ++. И тогда вы еще не обратились к инструментам.
1
Также (я только что обнаружил это сам, но это соответствует моему интуитивному чувству и моему опыту с другими реализациями динамического языка), обратите внимание, что компилятор PHP-to-C ++ постепенно сокращается и заменяется интерпретатором байт-кода + JIT под названием HHVM ( разработанный позже как часть того же зонтичного проекта), который значительно превосходит его и имеет меньше ограничений. См github.com/facebook/hiphop-php/wiki
@Delnan: плохие компиляторы создают уродливый и неестественный код. Но это вряд ли неизбежно. Взгляните на Smart , который компилируется в JavaScript. Вывод очень удобочитаемый, если вы, конечно, не включите запутывание и / или минификацию. <snark>(Поскольку JS когда-либо можно назвать «читабельным», т. </snark>
Е.

Ответы:

65

Они не По крайней мере, больше. Оказалось, что выполнение этого способа вызывает слишком много проблем, включая головные боли при развертывании и сводит на нет одно из главных преимуществ использования языка сценариев в первую очередь - возможность изменять сценарии без необходимости перекомпиляции - поэтому они преобразовали систему HipHop в архитектура виртуальной машины с прозрачной фазой JIT и устаревший компилятор C ++.

Интересно, что, по-видимому, делать это таким же образом примерно в два раза быстрее (как в перформанте) по сравнению с оригинальным подходом к транскомпиляции C ++.

Мейсон Уилер
источник
4
Все, что я получил от этого, - это то, что Facebook с трудом соотносит потребности бизнеса с возможностями разработчиков. Интересно все же, хотя я бы добавил, что получение большей производительности от решения JIT по сравнению с нативным просто означает, что их jiggerypokery на PHP-> C ++ были на самом деле штаны.
Джеймс
7
@James Хотя я сомневаюсь, что «HipHopc» был величайшим оптимизирующим компилятором когда-либо, этот конкретный результат не показывает, что им не хватает написания компиляторов, он просто показывает, что статическая компиляция динамических языков гораздо менее эффективна, чем динамическая компиляция. Это было неоднократно подтверждено людьми, которые точно знают, как писать оптимизирующие компиляторы. JIT-компилятор может легко выполнить множество оптимизаций. Компилятор AOT (без очень дорогого анализа всей программы) редко может сделать гораздо больше, чем просто удалить издержки самой интерпретации, фактически не удаляя динамичность.
2
@delnan Ну, да, если вы ограничиваете главное преимущество компилятора AOT (анализ всей программы), указывая на всю точку компилятора AOT (имея много времени для анализа), тогда, конечно, он не будет сравниваться чтобы JIT делал то, в чем хорош JIT (быстрая оптимизация). Но вряд ли это справедливо, правда?
Алиса
2
@delnan Это просто неправда или, по крайней мере, интеллектуально нечестно. JIT имеет чрезвычайно ограниченное время по сравнению с AOT для выполнения оптимизаций; Java написала статьи о распределителях регистров, которые не идеальны, но достаточно быстры для использования JIT. Использование SSA обеспечивает огромное количество бесплатных оптимизаций, которые большинство JIT стараются не отставать. В AOT могут использоваться проверенные алгоритмы вывода типов (Hindley-Milner и алгоритм W), которые не сложны, в то время как JIT абсолютно не получает их бесплатно, оплачивая затраты с точки зрения памяти. JIT может сделать некоторые оптимизации лучше, как и AOT.
Алиса
1
@ Алиса Мы говорим о высоко динамичных языках. Для таких языков, как Python или JavaScript, не существует простых и эффективных алгоритмов вывода типа AOT (то есть статических). Существуют сложные онлайновые / динамические алгоритмы (используемые, например, в SpiderMonkey), которые являются эффективными, и есть сложные алгоритмы AOT (например, Starkiller), которые до сих пор не смогли доказать свою эффективность. Алгоритм W даже не начинает рассматривать сложности динамических языков.
34

Старший инженер Facebook Хайпин Чжао, вероятно, лучше всего ответит на ваши вопросы .

  1. HipHop программно преобразует ваш исходный код PHP в высоко оптимизированный C ++, а затем использует g ++ для его компиляции. HipHop выполняет исходный код семантически эквивалентным образом и жертвует некоторыми редко используемыми функциями, такими как eval (), в обмен на повышение производительности.

  2. Один из распространенных способов устранения этих недостатков - переписать более сложные части вашего приложения PHP непосредственно в C ++ как расширения PHP. Это в значительной степени превращает PHP в связующий язык между внешним интерфейсом HTML и логикой приложения в C ++. С технической точки зрения это работает хорошо, но резко сокращает количество инженеров, способных работать над всем вашим приложением.

Остальная часть поста в блоге хорошо читается, и я рекомендую это. Это дает некоторое представление о проблемах программирования, с которыми сталкивается Facebook, и о том, как они пытаются решить эти проблемы.

josh3736
источник
7
Обратите внимание, что это устарело; это была их первая попытка, но Facebook больше не делает это таким образом. Смотрите мой ответ ниже.
Мейсон Уилер
@MasonWheeler - отличная ссылка и обновление.
19

Просто программа на с ++? Конечно, должны быть НЕКОТОРЫЕ ошибки / ошибки при нажатии волшебной кнопки компилятора, которая портирует PHP на код C ++, верно?

Правильно, но программирование на C ++ повлечет за собой замену всей их существующей кодовой базы - идея, известная во всем мире как совершенно глупая и разрушительная.

Если этот впечатляющий конвертер работает так хорошо, зачем вообще придерживаться PHP? Почему бы не использовать что-то вроде Ruby или Python? Примечание. Я выбрал эти два наугад, но в основном потому, что почти все говорят, что кодирование на этих языках - «радость». Так почему бы не развиться на супер отличном языке, а затем нажать волшебную кнопку компиляции c ++?

Потому что это, опять же, повлечет за собой замену существующей базы кода PHP.

В идеальном мире они просто программировали бы на C ++ с нуля. К сожалению, из-за того, что у них есть куча существующего кода на PHP, это невозможно. Таким образом, вместо этого они решают проблему. Это намного дешевле.

DeadMG
источник
2
+1 за это: «Вместо этого они взломают проблему. Это намного дешевле». Это правда - если у них 3500 инженеров, работающих над их продуктом, гораздо дешевле получить небольшую команду из 5-50 человек, сосредоточенных на написании хорошего компилятора PHP-> C ++, чем заставить всю команду инженеров переписать код на 6 лет. ,
Суман
Извините, я в замешательстве. Зачем им это переписывать . Вы только что сказали это сами - HipHop преобразует весь код в C ++. Так что просто конвертируйте его, затем вставьте в C ++.
user72245
16
@ user72245 только потому, что он конвертирует его в C ++, не означает, что он конвертирует его в читаемый или поддерживаемый C ++
Mr.Mindor
Почему это they hack around the problem? Оптимизация кода с использованием C ++ или даже ассемблера не нова, это делалось еще до появления ПК.
Стив
Также имейте в виду, что программисты на Facebook являются программистами на PHP. Конечно, вы можете конвертировать все это в C ++ и начать программирование на C ++, но ваши существующие программисты не имеют опыта работы с этим языком. Вам нужно будет переучить их или нанять новых программистов, чтобы продолжить разработку.
Гэвин Коутс
8

«Действительно, почему бы не работать в ассемблере напрямую, поскольку код C ++ в конечном итоге переводится в инструкции машинного кода?»

- Это то, к чему сводится аргумент. И, надеюсь, это делает очевидным, почему это не сделано:

  • (Очень!) Другой набор навыков требуется для программирования на ассемблере (C ++), чем на C ++ (PHP).
  • Это потенциально гораздо сложнее программировать по разным причинам.
  • Код, созданный ассемблером / компилятором, может быть нечитаемым (говоря: поддерживаемым), даже если вы можете с нуля писать читаемые программы на ассемблере (C ++).
Конрад Рудольф
источник
2
Однажды я поддержал заявление о страховании, написанное на ассамблее, задуманной в 1970-х годах. В октябре мне было поручено изменить поздравление на «письмо», чтобы сказать, что «счастливых праздников». Он был закончен только в феврале следующего года из-за сложности. Я стал очень опытным в сборке и мог написать оптимальный код, при условии, что это не более пары тысяч строк. Тем не менее, компиляторы COBOL и C надрали мне задницу и создали гораздо более оптимальный код для платформы, на которой мы работали, особенно для систем, длина которых превышает 1 метр. Это не имеет никакого делового смысла.
bloudraak
5

Я не нахожусь в Facebook, но моя лучшая догадка по мотивам будет «избегать значительных рисков». На этом этапе переключение на другой язык больше не является технологическим решением: прежде всего, это бизнес-решение.

Когда вы большая компания, которая органически выросла до размера FB, вы постепенно привлекаете людей, которые затем приобретают опыт в вашей программной платформе (в случае FB, это PHP). Один за другим вы получаете несколько тысяч сотрудников с большим опытом работы с PHP. На этом этапе переключение на любой другой язык становится очень опасным: ваши инженеры не будут в курсе новой экосистемы, и им может потребоваться значительное время для достижения уровня знаний, требуемого их текущей работой, не говоря уже о повышении квалификации.

Оставляя в стороне относительные достоинства PHP и альтернативных языков, учитывая объем инвестиций FB в технологию PHP, было бы слишком высокомерно думать, что переход будет безболезненным, и слишком глупым, чтобы попробовать его. В бизнесе технологии - это средство для достижения цели, поэтому «радость» программирования даже не вступает в дискуссию.

dasblinkenlight
источник
4

Я могу вспомнить только один крупный сайт, который был реализован на C ++. h2g2

Даже тогда текущая реализация на самом деле является интерпретатором с большим количеством встроенных функций манипулирования текстом и базой данных (разве это не похоже на ранний PHP :-)).

Facebook вполне доволен функциональностью своего сайта. Они только что выросли до такой степени, что ванильный PHP не может поддерживать объемы, которые они обрабатывают. Следовательно, компиляция PHP в машинный код C ++. Можно было бы написать полный компилятор для PHP, но они упустили бы 20 лет тонкой оптимизации, которые вошли в стек компилятора gcc. Дело в том, что код «C ++» не предназначен для того, чтобы быть читаемым или обслуживаемым человеком, это всего лишь промежуточный этап на пути к машинному коду.

Как и многие программисты на этом сайте, я чувствую, что вы недооцениваете объем работы, вложенной в бизнес-логику и функциональность, встроенные в существующие приложения, и в ценность кода для себя.

Джеймс Андерсон
источник
Я могу думать о десятках, теперь, когда WT успешен.
Алиса
@ Алиса - интересно! Но я не могу найти никого, кто бы использовал это для сайта большого объема. Плюс привет мир 30-то строк кода, чтобы сделать 5 строк кода PHP.
Джеймс Андерсон
Сравнение примера "Привет, мир" - это просто смешно. Менее чем за 100 строк я могу настроить включение веб-сокетов, длительный откат опроса, прогрессивно улучшенный виджет с оптимальным SEO, автоматическую очистку URL-адресов без полной загрузки страницы с помощью AJAX и небольшую загрузку ЦП / ОЗУ. PHP, по крайней мере в типичных конфигурациях, не может делать веб-сокеты, долгий опрос, чистить URL-адреса без помощи, очищать URL-адреса с помощью AJAX вообще, и он определенно будет использовать огромный (сравнительно) объем ОЗУ / ЦП. Для веб-приложений, а не простых примеров, WT и C ++ значительно лучше, а с C ++ 11 сопоставимы по длине.
Алиса