Чому Facebook перетворює PHP-код у C ++? [зачинено]


42

Я читав, що Facebook запускався в PHP, а потім, щоб набрати швидкість, тепер вони компілюють PHP як код C ++. Якщо це так, то чому б вони не:

  1. Просто програма на c ++? Напевно повинні бути ДЕЯКІ помилки / помилки при натисканні на магічну кнопку компілятора, яка переносить PHP на код c ++, так?

  2. Якщо цей вражаючий конвертер працює так чудово, навіщо взагалі дотримуватися PHP? Чому б не використати щось на кшталт Ruby або Python? Зауважте - я обирав цих двох випадково, але в основному тому, що майже всі кажуть, що кодування цими мовами - це "радість". То чому б не розвинутись на чудовій мові, а потім натиснути на магічну кнопку компіляції c ++?


12
Обидві ваші альтернативи, ймовірно, означатимуть викинути весь PHP-код, специфічні для PHP інструменти та досвід, половину підтримуючої інфраструктури тощо. Це вже є і починається з нуля.

Чому? Якщо ви можете перетворити код на C ++, напевно, кожен може використовувати свою улюблену мову, натиснути кнопку конвертувати та дозволити її привласнити базу коду C ++. Немає?
користувач72245

7
Ні. Компілятори, за великим рахунком, створюють робочий, але некрасивий і неприродний код, і знімають такі речі, як назви змінних, коментарі, не кажучи вже про всі види абстракцій. Значною мірою це неминуче. Незважаючи на те, що існують деякі проекти, спрямовані на те, щоб фактично перевести в кодову базу даних, що можна отримати, іншою мовою, проблема набагато складніше, особливо з широко різними мовами. Крім того, навіть якщо припустити, що абсолютно ідіоматичний C ++ виходить, кожен, хто працює над кодовою базою, повинен був би вивчити C ++ або бути звільненим та замінений на людей, які знають C ++. І тоді ви ще не зверталися до інструментальних засобів.

1
Також (я щойно це відкрив сам, але це відповідає моїм відчуттям кишечника та моєму досвіду роботи з іншими динамічними реалізаціями мови), зауважте, що компілятор PHP-до-C ++ припиняється та замінюється інтерпретатором байт-коду + JIT під назвою HHVM ( розроблений пізніше як частина того ж парасольового проекту), який масово перевершує його і має менші обмеження. Дивіться github.com/facebook/hiphop-php/wiki

@Delnan: Погані компілятори створюють некрасивий і неприродний код. Але це навряд чи неминуче. Погляньте на Smart , який збирається на JavaScript. Вихід дуже читабельний, якщо тільки ви не ввімкніть обфускування та / або змінення курсу. <snark>(Наскільки JS коли-небудь можна назвати "читабельним", тобто.)</snark>
Мейсон Уілер

Відповіді:


65

Вони ні. Не більше, принаймні. Виявляється, це робиться таким чином, викликає занадто багато проблем, включаючи головні болі при розгортанні та зведення нанівець однієї з головних переваг використання мови сценаріїв - в першу чергу, можливість зміни сценаріїв без необхідності перекомпіляції - таким чином вони оновили систему HipHop в архітектура VM з прозорою фазою JIT та застарілим компілятором C ++.

Цікаво, що, мабуть, це так і є приблизно вдвічі швидше (як у виконавці), ніж оригінальний підхід до компіляції C ++.


4
Все, що я отримую з цього, - це те, що Facebook важко врівноважує потреби бізнесу в порівнянні з можливостями розробників. Цікаво все-таки, хоча я додам, що покращення продуктивності рішення JIT над рідним означає лише, що їх PHP-> C ++ jiggerypokery насправді були штанами.
Джеймс

7
@James Хоча я сумніваюся, що "HipHopc" був найбільшим оптимізуючим компілятором коли-небудь, цей конкретний результат не свідчить про те, що вони пишуть компілятори, але це просто показує, що статична компіляція динамічних мов набагато менш ефективна, ніж динамічна компіляція. Люди, які точно знають, як оптимізувати компілятори, неодноразово виявляли правду. Компілятор JIT може легко здійснити безліч оптимізацій. Компілятор AOT (без дуже дорогого аналізу на всю програму) рідко може зробити набагато більше, ніж видалити накладні витрати самої інтерпретації, фактично не знімаючи динамічності.

2
@delnan Ну, так, якщо ви калічите основну перевагу компілятора AOT (аналіз усієї програми), вказавши всю точку компілятора AOT (у якої є багато часу для аналізу), то, звичайно, це не буде порівняти до JIT, що робить те, у чому хороший JIT (швидка оптимізація). Але це навряд чи справедливо, зараз це?
Аліса

2
@delnan Це просто неправда або, принаймні, нечесно інтелектуально. JIT має надзвичайно обмежений час порівняно з AOT для оптимізації; Java написала документи про розподільники реєстрів, які є менш ідеальними, але досить швидкими для використання у JIT. Використання SSA дозволяє здійснити величезну кількість оптимізацій безкоштовно , з якими намагається не відставати більшість JIT. AOT можуть використовувати перевірені алгоритми виводу типу (Хіндлі - Мілнер та алгоритм W), які не є складними, тоді як JIT абсолютно не отримує це безкоштовно, оплачуючи витрати в частині пам'яті. JIT може зробити деякі оптимізації краще, і так може AOT.
Аліса

1
@Alice Ми говоримо про дуже динамічні мови. Не існує простих та ефективних алгоритмів виводу типу AOT (тобто статичних) для таких мов, як Python чи JavaScript. Є складні алгоритми в режимі он-лайн / час роботи (як, наприклад, використовується у SpiderMonkey), які є ефективними, і є складні алгоритми AOT (наприклад, Starkiller), які поки що не виявили себе ефективними. Алгоритм W навіть не починає вирішувати складності динамічних мов.

34

Старший інженер Facebook Хайпінг Чжао, ймовірно, найкраще відповідає на ваші запитання .

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

  2. Один поширений спосіб вирішити ці неефективність - переписати більш складні частини програми PHP безпосередньо в C ++ як PHP-розширення. Це значною мірою перетворює PHP в мову клею між вашим HTML на передньому кінці та логікою програми на C ++. З технічної точки зору це працює добре, але різко зменшує кількість інженерів, які можуть працювати над всією вашою програмою.

Решта публікації в блозі - це добре прочитане, і я рекомендую це. Це дає деяке уявлення про проблеми програмування, з якими займається Facebook, і те, як вони намагаються вирішити ці проблеми.


7
Зауважте, що це застаріло; це була їхня перша спроба, але Facebook більше не робить це так. Дивіться мою відповідь нижче.
Мейсон Уілер

@MasonWheeler - чудове посилання та оновлення.

19

Просто програма на c ++? Напевно повинні бути ДЕЯКІ помилки / помилки при натисканні на магічну кнопку компілятора, яка переносить PHP на код c ++, так?

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

Якщо цей вражаючий конвертер працює так чудово, навіщо взагалі дотримуватися PHP? Чому б не використати щось на кшталт Ruby або Python? Зауважте - я обирав цих двох випадково, але в основному тому, що майже всі кажуть, що кодування цими мовами - це "радість". То чому б не розвинутись на чудовій мові, а потім натиснути на магічну кнопку компіляції c ++?

Тому що це, знову ж таки, призведе до заміни існуючої бази даних PHP.

В ідеальному світі вони просто кодують C ++ з нуля. На жаль, оскільки у PHP є наявна кількість наявного коду, це неможливо. Тож замість цього вони ламають навколо проблеми. Це просто набагато дешевше.


2
+1 для цього: "Тож замість цього вони зламають проблему. Це просто набагато дешевше". Це правда - якщо у них 3500 інженерів, які працюють над їх продуктом, це дешевше отримати невелику команду з 5-50 людей, зосереджених на написанні хорошого компілятора PHP-> C ++, ніж щоб вся інженерна команда переписала 6-ти літній код .
Суман

Вибачте, я розгублений. Навіщо їм це переписувати . Ви тільки що сказали, що ви самі - HipHop перетворює весь код на C ++. Тому просто конвертуйте його, а потім дотримуйтесь C ++.
користувач72245

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 та альтернативних мов, при розмірі інвестицій, які ФБ зробив у технологію PHP, було б занадто зарозуміло думати, що перемикання буде безболісним і занадто нерозумним, щоб спробувати. У бізнесі технології - це засоби до кінця, тому "радість" програмування навіть не вступає в дискусії.


4

Я можу придумати лише один головний веб-сайт, який був реалізований на C ++. H2G2

Вже тоді поточний іон-реалізатор насправді є інтерпретатором із вбудованою великою кількістю функцій маніпулювання текстом та базами даних (чи це не звучить так, як і на початку PHP :-)).

Facebook цілком задоволений функціоналом їх веб-сайту. Вони щойно переросли до того, що PHP ванілі не може підтримувати обсяги, які вони обробляють. Звідси компілювання PHP в C ++ звідти машинного коду. Могли б написати повний компілятор для PHP, але вони б пропустили 20-річну тонку оптимізацію, що увійшла в стек компілятора gcc. Справа в тому, що "C ++" код не повинен бути зрозумілим для людини чи ремонтувати його просто проміжним кроком на шляху до машинного коду.

Як і багато програмістів на цьому веб-сайті, я відчуваю, що ви недооцінюєте обсяг роботи, вкладеної в hte-бізнес-логіку та функціональність, вбудовані в існуючі додатки, і, кодуйте значення заради себе.


Я можу придумати десятки, тепер, коли WT є успішним.
Аліса

@Alice - цікаво! Але я не можу знайти когось, хто використовує це для веб-сайту з великим обсягом. Плюс привіт світ 30-ти рядків коду, щоб зробити 5 рядків PHP-коду.
Джеймс Андерсон

Порівнювати приклад "привіт світу" - це щось смішно. Менш ніж у 100 рядках я можу налаштувати веб-розетки з увімкненим довгим опитуванням, прогресивно розширений віджет з оптимальним SEO, автоматичними чистими URL-адресами без повного завантаження сторінки за допомогою AJAX та крихітного сліду CPU / RAM. PHP, принаймні в типових конфігураціях, не може робити веб-розетки, довге опитування, чисті URL-адреси без сторонньої допомоги, чисті URL-адреси за допомогою AJAX взагалі, і, безумовно, буде використовувати величезну (порівняно) кількість оперативної пам’яті / процесора. Що стосується веб-сайтів і не простих прикладів, WT і C ++ є різко перевершеними, а C ++ 11 - порівнянними за довжиною.
Аліса
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.