Warum konvertiert Facebook PHP-Code nach C ++? [geschlossen]

42

Ich habe gelesen, dass Facebook in PHP gestartet ist. Um schneller zu werden, kompilieren sie PHP jetzt als C ++ - Code. Wenn das der Fall ist, warum tun sie es dann nicht:

  1. Einfach in c ++ programmieren? Sicherlich muss es EINIGE Fehler / Bugs geben, wenn man eine magische Compiler-Schaltfläche drückt, die PHP in C ++ - Code portiert, oder?

  2. Wenn dieser beeindruckende Konverter so gut funktioniert, warum sollte man sich überhaupt an PHP halten? Warum nicht so etwas wie Ruby oder Python verwenden? Hinweis - Ich habe diese beiden zufällig ausgewählt, aber meistens, weil fast jeder sagt, dass das Codieren in diesen Sprachen eine "Freude" ist. Warum also nicht in einer super tollen Sprache entwickeln und dann den Magic C ++ - Kompilierungsbutton drücken?

user72245
quelle
12
Ihre beiden Alternativen würden wahrscheinlich bedeuten, dass Sie den gesamten PHP-Code, die PHP-spezifischen Tools und das Know-how, die Hälfte der unterstützenden Infrastruktur usw., die bereits vorhanden ist, wegwerfen und von vorne beginnen.
Warum? Wenn Sie Code in C ++ konvertieren können, kann sicherlich jeder seine Lieblingssprache verwenden, eine Konvertierungstaste drücken und sie in die C ++ - Codebasis übernehmen. Nein?
User72245
7
Compiler produzieren im Großen und Ganzen funktionierenden, aber hässlichen und unnatürlichen Code und entfernen Dinge wie Variablennamen, Kommentare und alle Arten von Abstraktionen. Dies ist weitgehend unumgänglich. Während es einige Projekte gibt, die darauf abzielen, tatsächlich in eine wartbare Codebasis in einer anderen Sprache zu übersetzen, ist das Problem viel schwieriger, insbesondere bei sehr unterschiedlichen Sprachen. Selbst wenn perfekt idiomatisches C ++ herauskommt, müsste jeder, der an der Codebasis arbeitet, C ++ lernen oder durch Leute ersetzt werden, die C ++ kennen. Und dann haben Sie sich noch nicht mit Werkzeugen befasst.
1
Beachten Sie auch, dass der PHP-zu-C ++ - Compiler aus dem Programm genommen und durch einen Bytecode-Interpreter + JIT mit dem Namen HHVM ersetzt wird. später im Rahmen desselben Dachprojekts entwickelt), das seine Leistung massiv übertrifft und weniger Einschränkungen unterliegt. Siehe github.com/facebook/hiphop-php/wiki
@Delnan: Schlechte Compiler produzieren hässlichen und unnatürlichen Code. Aber es ist kaum zu vermeiden. Schauen Sie sich Smart an , das bis zu JavaScript kompiliert. Die Ausgabe ist sehr gut lesbar, es sei denn, Sie aktivieren die Verschleierung und / oder Minimierung. <snark>(Soweit JS jemals als "lesbar" bezeichnet werden kann.)</snark>
Mason Wheeler,

Antworten:

65

Sie tun es nicht. Zumindest nicht mehr. Es stellt sich heraus, dass diese Vorgehensweise zu viele Probleme verursacht, z. B. Probleme bei der Bereitstellung und die Beseitigung eines der Hauptvorteile der Verwendung einer Skriptsprache - sie können Skripts ändern, ohne dass sie neu kompiliert werden müssen -, sodass das HipHop-System überarbeitet wurde eine VM-Architektur mit einer transparenten JIT-Phase und veraltetem C ++ - Compiler.

Interessanterweise ist diese Methode anscheinend auch doppelt so schnell (wie performant) wie der ursprüngliche C ++ - Transkompilierungsansatz.

Mason Wheeler
quelle
4
Alles, was ich davon habe, ist, dass Facebook Schwierigkeiten hat, die geschäftlichen Anforderungen mit den Fähigkeiten der Entwickler in Einklang zu bringen. Interessant, obwohl ich hinzufügen würde, dass eine bessere Leistung von einer JIT-Lösung gegenüber einer nativen nur bedeutet, dass ihre PHP-> C ++ - Jigger-Typokery in der Tat Hosen waren.
James
7
@James Obwohl ich bezweifle, dass "HipHopc" der größte optimierende Compiler aller Zeiten war, zeigt dieses spezielle Ergebnis nicht, dass sie beim Schreiben von Compilern scheiße sind, sondern nur, dass das statische Kompilieren dynamischer Sprachen viel weniger effektiv ist als das dynamische Kompilieren. Was sich immer wieder als wahr erwiesen hat, von Leuten, die definitiv wissen, wie man Compiler schreibt, um sie zu optimieren. Ein JIT-Compiler kann auf einfache Weise eine Vielzahl von Optimierungen durchführen. Ein AOT-Compiler (ohne sehr teure Analyse des gesamten Programms) kann selten viel mehr als den Aufwand für die Interpretation selbst beseitigen, ohne die Dynamik tatsächlich zu beseitigen.
2
@delnan Nun ja, wenn Sie den Hauptnutzen eines AOT-Compilers (Analyse des gesamten Programms) dadurch lähmen, dass Sie auf den gesamten Punkt eines AOT-Compilers hinweisen (der viel Zeit für die Analyse hat), wird er sicher nicht verglichen zu einer JIT, die das macht, was eine JIT kann (schnelle Peekhole-Optimierungen). Aber es ist kaum fair, oder?
Alice
2
@delnan Das ist einfach nicht wahr oder zumindest intellektuell unehrlich. Ein JIT hat im Vergleich zu einem AOT nur sehr wenig Zeit für Optimierungen. Java hat Artikel zu Registerzuordnern verfasst, die nicht ideal sind, aber schnell genug für die JIT-Verwendung. Die Verwendung von SSA ermöglicht eine enorme Anzahl kostenloser Optimierungen , mit denen die meisten JIT- Mitarbeiter nicht Schritt halten können. AOTs können bewährte Inferenzalgorithmen (Hindley-Milner und Algorithmus W) verwenden, die nicht kompliziert sind, während eine JIT diese absolut nicht kostenlos erhält und die Speicherkosten trägt. Ein JIT kann einige Optimierungen besser durchführen, ebenso ein AOT.
Alice
1
@Alice Wir sprechen von hochdynamischen Sprachen. Für Sprachen wie Python oder JavaScript gibt es keine einfachen und effektiven Inferenzalgorithmen vom Typ AOT (dh statisch). Es gibt komplizierte Online- / Laufzeitalgorithmen (wie sie beispielsweise in SpiderMonkey verwendet werden), die effektiv sind, und es gibt komplizierte AOT-Algorithmen (z. B. Starkiller), die sich bisher nicht als effektiv erwiesen haben. Der Algorithmus W befasst sich nicht einmal mit der Komplexität dynamischer Sprachen.
34

Der leitende Ingenieur von Facebook, Haiping Zhao, beantwortet Ihre Fragen wahrscheinlich am besten.

  1. HipHop wandelt Ihren PHP-Quellcode programmatisch in hochoptimiertes C ++ um und kompiliert ihn dann mit g ++. HipHop führt den Quellcode auf semantisch äquivalente Weise aus und verzichtet auf einige selten verwendete Funktionen - wie eval () -, um die Leistung zu verbessern.

  2. Eine übliche Möglichkeit, diese Ineffizienzen zu beheben, besteht darin, die komplexeren Teile Ihrer PHP-Anwendung direkt in C ++ als PHP-Erweiterungen umzuschreiben. Dies verwandelt PHP weitgehend in eine Verbindungssprache zwischen Front-End-HTML und Anwendungslogik in C ++. Aus technischer Sicht funktioniert dies gut, reduziert jedoch drastisch die Anzahl der Ingenieure, die in der Lage sind, an Ihrer gesamten Anwendung zu arbeiten.

Der Rest des Blogposts ist eine gute Lektüre und ich empfehle es. Es gibt einen Einblick in die Programmierherausforderungen, mit denen Facebook umgeht, und wie sie versuchen, diese Probleme zu lösen.

josh3736
quelle
7
Beachten Sie, dass dies veraltet ist. Das war ihr erster Versuch, aber Facebook macht das nicht mehr so. Siehe meine Antwort unten.
Mason Wheeler
@ MasonWheeler - toller Link und Update.
19

Einfach in c ++ programmieren? Sicherlich muss es EINIGE Fehler / Bugs geben, wenn man eine magische Compiler-Schaltfläche drückt, die PHP in C ++ - Code portiert, oder?

Richtig, aber das Programmieren in C ++ würde bedeuten, dass die gesamte vorhandene Codebasis ersetzt wird - eine Idee, die weltbekannt dafür ist, absolut dumm und verheerend zu sein.

Wenn dieser beeindruckende Konverter so gut funktioniert, warum sollte man sich überhaupt an PHP halten? Warum nicht so etwas wie Ruby oder Python verwenden? Hinweis - Ich habe diese beiden zufällig ausgewählt, aber hauptsächlich, weil fast jeder sagt, dass das Codieren in diesen Sprachen eine "Freude" ist. Warum also nicht in einer super tollen Sprache entwickeln und dann den Magic C ++ - Kompilierungsbutton drücken?

Denn dies würde wiederum bedeuten, dass die vorhandene PHP-Codebasis ersetzt wird.

In einer idealen Welt würden sie einfach von Grund auf in C ++ codieren. Leider ist dies nicht möglich, da sie eine Unmenge an vorhandenem Code in PHP haben. Also hacken sie stattdessen um das Problem herum. Es ist einfach so viel billiger.

DeadMG
quelle
2
+1 dafür: "Also hacken sie stattdessen um das Problem herum. Es ist einfach so viel billiger." Es ist wahr - wenn 3500 Ingenieure an ihrem Produkt arbeiten, ist es viel billiger, ein kleines Team von 5-50 Leuten dazu zu bringen, einen guten PHP-> C ++ - Compiler zu schreiben, als das gesamte Engineering-Team 6 Jahre lang Code neu schreiben zu lassen .
Suman
Entschuldigung ich bin verwirrt. Warum sollten sie es umschreiben müssen . Sie haben es einfach selbst gesagt - HipHop konvertiert den gesamten Code in C ++. Also einfach umwandeln, dann in C ++ bleiben.
user72245
16
@ user72245 nur weil es in C ++ konvertiert, heißt das nicht, dass es in lesbares oder wartbares C ++
konvertiert
Warum ist das so they hack around the problem? Die Optimierung von Code mithilfe von C ++ oder gar Assembly ist nicht neu. Dies geschah bereits, bevor es einen PC gab.
Steve
Denken Sie auch daran, dass die Facebook-Programmierer PHP-Programmierer sind. Natürlich können Sie alles in C ++ konvertieren und mit der Programmierung in C ++ beginnen, aber Ihre vorhandenen Programmierer haben keine Erfahrung mit dieser Sprache. Sie müssten sie neu trainieren oder neue Programmierer einstellen, um die Entwicklung fortzusetzen.
Gavin Coates
8

„Warum nicht direkt in der Assembly arbeiten, da der C ++ - Code letztendlich in Maschinencode-Anweisungen übersetzt wird?“

- Darauf reduziert sich das Argument im Wesentlichen. Und das macht hoffentlich klar, warum es nicht gemacht wird:

  • Zum Programmieren in Assembly (C ++) ist eine (sehr!) Andere Qualifikation erforderlich als in C ++ (PHP).
  • Es ist aus verschiedenen Gründen möglicherweise viel schwieriger zu programmieren
  • Der Code erzeugt durch einen Assembler / Compiler kann nicht in lesbarer Form (sprich: wartbar) sein, auch wenn Sie können , von Grund auf neu, gut lesbare Programme in der Montage (C ++) schreiben.
Konrad Rudolph
quelle
2
Ich habe einmal einen in den 1970er Jahren in der Montage erstellten Versicherungsantrag bearbeitet. Im Oktober wurde ich beauftragt, die Grüße auf einem "Brief" zu ändern, um das Äquivalent von "Frohe Feiertage" zu sagen. Aufgrund der Komplexität wurde es erst im Februar des nächsten Jahres fertiggestellt. Ich beherrschte die Montage sehr gut und konnte optimalen Code schreiben, vorausgesetzt, es waren nicht mehr als ein paar Tausend Zeilen. Die COBOL- und C-Compiler haben mir jedoch in den Hintern getreten und viel optimalen Code für die Plattform produziert, auf der wir ausgeführt wurden, insbesondere für Systeme mit einer Länge von mehr als 1 m. Es macht keinen geschäftlichen Sinn.
Bloudraak
5

Ich bin nicht bei Facebook, aber ich rate nach besten Kräften, "signifikante Risiken zu vermeiden". Ab diesem Zeitpunkt ist der Wechsel zu einer anderen Sprache keine technologische Entscheidung mehr, sondern vor allem eine geschäftliche Entscheidung.

Wenn Sie ein großes Unternehmen sind, das organisch auf die Größe von FB gewachsen ist, ziehen Sie langsam Leute an, die dann Fachwissen über Ihre Programmierplattform erwerben (im Fall von FB ist das PHP). Einer nach dem anderen bekommt ein paar tausend Mitarbeiter mit großem Fachwissen bei PHP. Zu diesem Zeitpunkt wird der Wechsel zu einer anderen Sprache sehr gefährlich: Ihre Ingenieure sind mit dem neuen Ökosystem nicht vertraut und benötigen möglicherweise viel Zeit, um das für ihre aktuellen Jobs erforderliche Fachwissen zu erreichen, geschweige denn, um ihre Fähigkeiten zu verbessern.

Abgesehen von den relativen Vorzügen von PHP und den alternativen Sprachen wäre es angesichts des Umfangs der Investitionen, die der FB in die PHP-Technologie getätigt hat, zu arrogant zu glauben, dass ein Wechsel schmerzlos und zu dumm wäre, um ihn auszuprobieren. In der Wirtschaft ist Technologie ein Mittel zum Zweck, so dass die "Freude" am Programmieren nicht einmal in Diskussionen gerät.

dasblinkenlight
quelle
4

Ich kann mir nur eine große Website vorstellen, die in C ++ implementiert wurde. H2G2

Selbst dann ist die aktuelle Implementierung tatsächlich ein Interpreter mit einer großen Anzahl eingebauter Text- und Datenbankmanipulationsfunktionen (klingt das nicht ein bisschen wie und frühes PHP :-)).

Facebook ist sehr zufrieden mit der Funktionalität ihrer Website. Sie sind gerade so weit gewachsen, dass Vanilla PHP die von ihnen verarbeiteten Volumes nicht mehr unterstützt. Daher das Kompilieren von PHP in C ++ und von dort in Maschinencode. Sie hätten einen vollständigen Compiler für PHP schreiben können, aber sie hätten die 20 Jahre subtiler Optimierung verpasst, die in den gcc-Compiler-Stack geflossen sind. Der Punkt ist, dass der "C ++" - Code nicht für den Menschen lesbar oder wartbar sein soll, sondern nur ein Zwischenschritt auf dem Weg zum Maschinencode.

Wie viele Programmierer auf dieser Website sind Sie der Meinung, dass Sie den Arbeitsaufwand für die Geschäftslogik und -funktionalität, die in vorhandene Anwendungen eingebettet sind, und den Wertcode für sich selbst unterschätzen.

James Anderson
quelle
Ich kann an Dutzende denken, jetzt, wo WT erfolgreich ist.
Alice
@Alice - interessant! Aber ich kann niemanden finden, der dies für eine hochvolumige Site verwendet. Plus hallo Welt 30 etwas Code-Zeilen, um 5 Zeilen PHP-Code zu tun.
James Anderson
Ein "Hallo Welt" -Beispiel zu vergleichen ist irgendwie lächerlich. In weniger als 100 Zeilen kann ich ein Web-Sockets-fähiges, auf lange Umfragen zurückzuführendes, progressiv verbessertes Widget mit optimaler Suchmaschinenoptimierung, automatisch bereinigten URLs ohne volles Laden von Seiten mit AJAX und einem winzigen CPU- / RAM-Platzbedarf einrichten. Zumindest in typischen Konfigurationen kann PHP keine Websockets ausführen, lange Abfragen durchführen, URLs ohne Hilfe bereinigen, URLs überhaupt mit AJAX bereinigen, und es wird definitiv eine enorme (vergleichsweise) Menge an RAM / CPU verbrauchen. Für Webapps und nicht einfache Beispiele sind WT und C ++ drastisch überlegen und mit C ++ 11 vergleichbar lang.
Alice