Dlaczego Facebook konwertuje kod PHP na C ++? [Zamknięte]


42

Czytałem, że Facebook zaczynał w PHP, a następnie, aby przyspieszyć, teraz kompilują PHP jako kod C ++. Jeśli tak jest, dlaczego nie:

  1. Po prostu program w c ++? Z pewnością musi być NIEKTÓRE błędy / błędy po naciśnięciu przycisku magicznego kompilatora, który przenosi PHP na kod c ++, prawda?

  2. Jeśli ten imponujący konwerter działa tak ładnie, po co w ogóle trzymać się PHP? Dlaczego nie użyć czegoś takiego jak Ruby lub Python? Uwaga - wybrałem te dwa losowo, ale głównie dlatego, że prawie wszyscy mówią, że kodowanie w tych językach to „radość”. Dlaczego więc nie rozwinąć się w super doskonałym języku, a następnie nacisnąć magiczny przycisk kompilacji c ++?


12
Obie alternatywy prawdopodobnie oznaczałyby wyrzucenie całego kodu PHP, narzędzi i wiedzy specyficznej dla PHP, połowy infrastruktury wspierającej itp., Która już istnieje i zaczynając od zera.

Dlaczego? Jeśli potrafisz przekonwertować kod na C ++, na pewno każdy może użyć swojego ulubionego języka, nacisnąć przycisk konwersji i poprosić go o przypisanie go do Codebase C ++. Nie?
user72245,

7
Nie. Kompilatory generalnie generują działający, ale brzydki i nienaturalny kod oraz usuwają takie elementy, jak nazwy zmiennych, komentarze, nie wspominając już o wszelkiego rodzaju abstrakcjach. W dużym stopniu jest to nieuniknione. Chociaż istnieją projekty mające na celu przetłumaczenie na możliwą do utrzymania bazę kodu w innym języku, problem jest znacznie trudniejszy, szczególnie w przypadku bardzo różnych języków. Ponadto, nawet zakładając, że wyjdzie całkowicie idiomatyczny C ++, wszyscy pracujący nad bazą kodu będą musieli nauczyć się C ++ lub zostać zwolnieni i zastąpieni ludźmi znającymi C ++. A potem nadal nie zająłeś się narzędziami.

1
Również (właśnie to odkryłem, ale jest to zgodne z moim przeczuciem i doświadczeniem z innymi dynamicznymi implementacjami językowymi), zauważ, że kompilator PHP-C ++ jest stopniowo wycofywany i zastępowany przez interpreter kodu bajtowego + JIT o nazwie HHVM ( opracowany później w ramach tego samego projektu parasolowego), który znacznie przewyższa go i ma mniej ograniczeń. Zobacz github.com/facebook/hiphop-php/wiki

@Delnan: Złe kompilatory wytwarzają brzydki i nienaturalny kod. Ale nie jest to nieuniknione. Spójrz na Smart , który kompiluje się do JavaScript. Wyjście jest bardzo czytelne, chyba że włączysz zaciemnianie i / lub minimalizację oczywiście. <snark>(O ile JS można kiedykolwiek nazwie „czytelny”, że jest.)</snark>
Mason Wheeler

Odpowiedzi:


65

Oni nie. Przynajmniej już nie. Okazuje się, że zrobienie tego w ten sposób powoduje zbyt wiele problemów, w tym bóle głowy związane z wdrażaniem i niwelowanie jednej z głównych zalet używania języka skryptowego w pierwszej kolejności - możliwości zmiany skryptów bez konieczności ponownej kompilacji - więc przerobili system HipHop na architektura VM z przezroczystą fazą JIT i przestarzała kompilator C ++.

Co ciekawe, najwyraźniej robienie tego w ten sposób jest około dwa razy szybsze (jak w performerze) niż oryginalne podejście do kompilacji C ++.


4
Wszystko, co czerpię z tego, to to, że Facebookowi trudno jest zrównoważyć potrzeby biznesowe z możliwościami programistów. Ciekawe mimo wszystko, chociaż dodam, że uzyskanie lepszej wydajności z rozwiązania JIT w porównaniu z rodzimym oznacza po prostu, że ich jiggerypokery PHP-> C ++ było w rzeczywistości spodniami.
James

7
@James Wątpię, by „HipHopc” był jak dotąd najlepszym kompilatorem optymalizującym, ale ten konkretny wynik nie pokazuje, że są do bani w pisaniu kompilatorów, po prostu pokazuje, że statyczna kompilacja języków dynamicznych jest znacznie mniej skuteczna niż kompilacja dynamiczna. Co zostało wielokrotnie potwierdzone przez ludzi, którzy zdecydowanie wiedzą, jak pisać kompilatory optymalizujące. Kompilator JIT może z łatwością przeprowadzić wiele optymalizacji. Kompilator AOT (bez bardzo drogiej analizy całego programu) rzadko może zrobić znacznie więcej niż usunąć narzut związany z samą interpretacją, bez faktycznego usuwania dynamiki.

2
@delnan Cóż, tak, jeśli osłabisz główną zaletę kompilatora AOT (analiza całego programu), wskazując cały punkt kompilatora AOT (mając dużo czasu na analizę), to na pewno nie będzie on porównywany JIT robi to, w czym JIT jest dobry (szybkie optymalizacje). Ale to niesprawiedliwe, prawda?
Alice,

2
@delnan To po prostu nieprawda, a przynajmniej nieuczciwość intelektualna. JIT ma bardzo ograniczony czas w porównaniu z AOT na optymalizacje; Java napisał artykuły na temat programów do dzielenia rejestrów, które nie są idealne, ale wystarczająco szybkie, aby można było z nich korzystać. Korzystanie z SSA pozwala na ogromne ilości optymalizacji za darmo, z którymi większość JIT musi nadążać. AOT mogą stosować sprawdzone algorytmy wnioskowania typu (Hindley – Milner i algorytm W), które nie są skomplikowane, podczas gdy JIT absolutnie nie otrzymuje tego za darmo, płacąc koszty w zakresie pamięci. JIT może lepiej dokonywać optymalizacji, podobnie jak AOT.
Alice,

1
@Alice Mówimy o bardzo dynamicznych językach. Nie ma prostych i skutecznych algorytmów wnioskowania typu AOT (tj. Statycznych) dla języków takich jak Python lub JavaScript. Istnieją skomplikowane algorytmy on-line / run-time (stosowane na przykład w SpiderMonkey), które są skuteczne, i istnieją skomplikowane algorytmy AOT (np. Starkiller), które jak dotąd nie okazały się skuteczne. Algorytm W nie zaczyna nawet uwzględniać złożoności dynamicznych języków.

34

Starszy inżynier Facebooka Haiping Zhao prawdopodobnie najlepiej odpowiada na twoje pytania .

  1. HipHop programowo przekształca kod źródłowy PHP w wysoce zoptymalizowany C ++, a następnie używa g ++ do jego skompilowania. HipHop wykonuje kod źródłowy w sposób semantycznie równoważny i poświęca niektóre rzadko używane funkcje - takie jak eval () - w zamian za lepszą wydajność.

  2. Jednym z powszechnych sposobów rozwiązania tych nieefektywności jest przepisanie bardziej złożonych części aplikacji PHP bezpośrednio w C ++ jako Rozszerzenia PHP. To w znacznej mierze przekształca PHP w język kleju między interfejsem HTML a logiką aplikacji w C ++. Z technicznego punktu widzenia działa to dobrze, ale drastycznie zmniejsza liczbę inżynierów, którzy są w stanie pracować nad całą aplikacją.

Reszta posta na blogu to dobra lektura i polecam ją. Daje wgląd w wyzwania programowe, z którymi boryka się Facebook, oraz w jaki sposób próbują rozwiązać te problemy.


7
Zauważ, że jest to przestarzałe; to była ich pierwsza próba, ale Facebook już tego nie robi. Zobacz moją odpowiedź poniżej.
Mason Wheeler,

@MasonWheeler - świetny link i aktualizacja.

19

Po prostu program w c ++? Z pewnością musi być NIEKTÓRE błędy / błędy po naciśnięciu przycisku magicznego kompilatora, który przenosi PHP na kod c ++, prawda?

Zgadza się, ale programowanie w C ++ wymagałoby zastąpienia całej istniejącej bazy kodu - idei znanej na całym świecie z tego, że jest całkowicie głupi i niszczycielski.

Jeśli ten imponujący konwerter działa tak ładnie, po co w ogóle trzymać się PHP? Dlaczego nie użyć czegoś takiego jak Ruby lub Python? Uwaga - wybrałem te dwa losowo, ale głównie dlatego, że prawie wszyscy mówią, że kodowanie w tych językach to „radość”. Dlaczego więc nie rozwinąć się w super doskonałym języku, a następnie nacisnąć magiczny przycisk kompilacji c ++?

Ponownie oznaczałoby to zastąpienie istniejącej bazy kodu PHP.

W idealnym świecie po prostu kodują w C ++ od zera. Niestety, ponieważ mają one sporo istniejącego kodu w PHP, nie jest to możliwe. Zamiast tego włamują się do problemu. Jest o wiele tańszy.


2
+1 za to: „Zamiast tego hakują ten problem. Jest o wiele tańszy”. To prawda - jeśli mają 3500 inżynierów pracujących nad ich produktem, to o wiele taniej jest uzyskać mały zespół 5-50 osób skupiających się na napisaniu dobrego kompilatora PHP-> C ++, niż cały zespół inżynierów przepisuje kod na 6 lat .
Suman,

Przepraszam, jestem zdezorientowany. Dlaczego mieliby się go przepisać . Właśnie powiedziałeś, że to ty - HipHop konwertuje cały kod do C ++. Więc po prostu przekonwertuj to, a następnie wklej w C ++.
user72245,

16
@ user72245 tylko dlatego, że konwertuje go na C ++, nie oznacza, że ​​konwertuje go na czytelny lub możliwy do utrzymania C ++
Mr.Mindor

Dlaczego tak jest they hack around the problem? Optymalizacja kodu za pomocą C ++, a nawet asemblera wcale nie jest nowa, robiąc to od czasów, gdy był komputer.
Steve,

należy również pamiętać, że programiści na Facebooku są programistami PHP. Pewnie, że możesz to wszystko przekonwertować na C ++ i rozpocząć programowanie w C ++, ale twoi programiści nie mają doświadczenia w tym języku. Musisz je przekwalifikować lub zatrudnić nowych programistów, aby kontynuować rozwój.
Gavin Coates

8

„Rzeczywiście, dlaczego nie pracować bezpośrednio w asemblerze, ponieważ kod C ++ jest ostatecznie tłumaczony na instrukcje kodu maszynowego?”

- Do tego w istocie sprowadza się ten argument. Mam nadzieję, że to wyjaśnia, dlaczego tak się nie dzieje:

  • Do programowania w asemblerze (C ++) wymagany jest (znacznie!) Inny zestaw umiejętności niż w C ++ (PHP).
  • Z różnych powodów programowanie jest potencjalnie znacznie trudniejsze
  • Kod produkowany przez montera / kompilator nie może być czytelny dla człowieka (po: utrzymaniu), nawet jeśli można , od podstaw, pisać programy czytelny w montażu (C ++).

2
Kiedyś utrzymywałem wniosek ubezpieczeniowy napisany w asemblerze z lat 70. W październiku miałem za zadanie zmienić pozdrowienia na „liście”, aby powiedzieć odpowiednik „Wesołych Świąt”. Został ukończony dopiero w lutym następnego roku ze względu na złożoność. Stałem się bardzo biegły w asemblerze i mogłem pisać optymalny kod, pod warunkiem, że nie będzie to więcej niż kilka tysięcy wierszy. Jednak kompilatory COBOL i C skopały mi tyłek i stworzyły znacznie bardziej optymalny kod dla platformy, na której działaliśmy, szczególnie dla systemów przekraczających 1m linii montażowych. To nie ma sensu biznesowego.
bloudraak,

5

Nie jestem na Facebooku, ale najlepiej zgaduję, że motywami byłoby „unikanie znacznego ryzyka”. W tym momencie przejście na inny język nie jest już decyzją technologiczną: przede wszystkim jest decyzją biznesową.

Kiedy jesteś dużą firmą, która wyrosła organicznie do wielkości FB, powoli przyciągasz ludzi, którzy następnie zdobywają wiedzę na swojej platformie programistycznej (w przypadku FB jest to PHP). Jeden po drugim dostajesz kilka tysięcy pracowników z ogromną wiedzą fachową w PHP. W tym momencie przejście na jakikolwiek inny język staje się bardzo niebezpieczne: Twoi inżynierowie nie będą na bieżąco z nowym ekosystemem i mogą potrzebować dużo czasu, aby osiągnąć poziom wiedzy wymaganej przez ich bieżącą pracę, nie mówiąc już o doskonaleniu umiejętności.

Pomijając względne zalety PHP i języków alternatywnych, przy nakładach FB na technologię PHP byłoby zbyt aroganckie myśleć, że zmiana byłaby bezbolesna i zbyt głupia, aby spróbować. W biznesie technologia jest środkiem do celu, więc „radość” programowania nawet nie wchodzi w dyskusje.


4

Mogę wymyślić tylko jedną dużą stronę internetową, która została zaimplementowana w C ++. H2G2

Nawet wtedy obecny implementator jest w rzeczywistości tłumaczem z dużą liczbą wbudowanych funkcji manipulacji tekstem i bazą danych (czy to nie brzmi trochę jak wczesne PHP :-)).

Facebook jest bardzo zadowolony z funkcjonalności swojej strony internetowej. Właśnie urosły do ​​tego stopnia, że ​​waniliowe PHP nie może obsługiwać przetwarzanych woluminów. Stąd kompilacja tam PHP do kodu maszynowego C ++. Mogliby napisać pełny kompilator dla PHP, ale przegapiliby 20 lat subtelnej optymalizacji, która trafiła na stos kompilatora gcc. Chodzi o to, że kod „C ++” nie ma być czytelny dla człowieka ani utrzymywalny, to tylko pośredni krok na drodze do kodu maszynowego.

Podobnie jak wielu programistów na tej stronie, uważam, że nie doceniasz ilości pracy zainwestowanej w logikę biznesową i funkcjonalność wbudowaną w istniejące aplikacje, a także sam kod wartości.


Mogę myśleć o dziesiątkach, teraz, gdy WT odnosi sukcesy.
Alice,

@Alice - ciekawe! Ale nie mogę znaleźć nikogo, kto użyłby tego do witryny o dużej objętości. Plus hello world 30 coś linii kodu do zrobienia 5 linii kodu PHP.
James Anderson

Porównywanie przykładu „witaj świecie” jest trochę śmieszne. W mniej niż 100 liniach mogę skonfigurować włączoną obsługę stron internetowych, cofanie się długich ankiet, stopniowe ulepszanie widżetu z optymalnym SEO, automatyczne czyste adresy URL bez pełnego ładowania strony przy użyciu AJAX i niewielki ślad procesora / pamięci RAM. PHP, przynajmniej w typowych konfiguracjach, nie jest w stanie robić websockets, długich ankiet, czystych adresów URL bez pomocy, w ogóle oczyszczać adresów URL za pomocą AJAX i na pewno zużyje ogromną (względnie) ilość pamięci RAM / procesora. W przypadku aplikacji internetowych, a nie prostych przykładów, WT i C ++ są drastycznie lepsze, a w C ++ 11 mają porównywalną długość.
Alice,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.