Im Maßstab von Facebook machten sich die Grenzen von PHP schmerzhaft bemerkbar: Tausende Ingenieure lieferten zweimal täglich neuen Code aus, doch der Aufruf einer Methode auf einem Null-Objekt oder das Erraten eines Methodennamens einer komplexen API erzeugte Fehler erst zur Laufzeit, und die Sprache gab Werkzeugen wenig Struktur zur Introspektion. Die dynamische Sprache hielt die Schleife aus Bearbeiten und Aktualisieren schnell, bot aber kein frühes Sicherheitsnetz, während eine konventionelle statisch typisierte Sprache Prüfungen auf Kosten der Iterationsgeschwindigkeit erkauft hätte – und ein Neuschreiben hätte Facebooks Investition in PHP und seine Bibliotheken verworfen.

Hack, am 20. März 2014 als Teil der HHVM-Laufzeit angekündigt, löste diesen Widerspruch, indem es eine Obermenge von PHP blieb. Die meisten PHP-Dateien sind bereits gültiges Hack, sodass ein Ingenieur Typannotationen zu einer Funktion hinzufügen und die nächste dynamisch lassen konnte, wobei statisch und dynamisch typisierter Code nahtlos zusammenarbeiteten, selbst innerhalb einer einzigen Datei. Hack fügte Generics, nullable Typen, Typaliasing, Collections und Lambda-Ausdrücke hinzu, und HHVM erzwang annotierte Rückgabe- und Parametertypen zur Laufzeit, was es seinem JIT auch ermöglichte, Annotationen für die Optimierung sicher zu vertrauen.

Um den schnellen PHP-Workflow intakt zu halten, architektonierte das Team den Typprüfer als lokalen Server, der das Dateisystem überwacht und den gesamten Codegraphen im Speicher hält; typische Prüfungen liefen in unter 200 Millisekunden und überschritten selten eine Sekunde. Da die Konvertierung granular und optional war, konvertierten die Ingenieure den Großteil ihres eigenen Codes freiwillig, selbstgebaute Werkzeuge zur Code-Modifikation automatisierten den Rest, und im vorangegangenen Jahr war nahezu die gesamte PHP-Codebasis von Facebook auf Hack migriert.

Dieselbe Ankündigung stellte Hack und die Konvertierungswerkzeuge unter dem Dach von HHVM als Open Source bereit, das weiterhin unverändertes PHP neben Hack ausführen würde, und lud Entwickler für den folgenden Monat zu einem Hack Developer Day auf dem Campus in Menlo Park ein. Die Veröffentlichung erzielte am Erscheinungstag 576 Punkte und 415 Kommentare auf Hacker News.

Schrittweise statische Typisierung an PHP selbst anzubringen, sodass sich Sicherheit Funktion für Funktion verbreitet, niemals auf einmal

Die Kompatibilität als Obermenge bedeutete kein Neuschreiben und keine Big-Bang-Migration: bestehende PHP-Dateien liefen weiter, HHVM blieb eine PHP-Laufzeit, und PHP-Bibliotheken von Drittanbietern blieben durchgehend nutzbar.

Die Granularität pro Funktion ließ Sicherheit im eigenen Tempo jedes Teams wachsen, weil nicht annotierter Code dynamisch blieb, statt eine ganze Datei oder ein Modul an der Konvertierung zu hindern.

Ein das Dateisystem überwachender Prüfserver hielt die Rückmeldung unter 200 Millisekunden, sodass statische Typisierung die Schleife aus Bearbeiten und Aktualisieren nicht belastete, die die PHP-Iteration schnell machte.

Ingenieure entschieden sich, ihren eigenen Code zu annotieren, und Codemods erledigten den repetitiven Rest, sodass eine Codebasis mit mehreren Millionen Zeilen innerhalb eines Jahres konvertiert wurde, statt auf ein dediziertes Migrationsteam zu warten.

Nicht neu schreiben, um Sicherheit zu gewinnen: die Sprache alten Code akzeptieren lassen, die neue Disziplin eine Funktion nach der anderen verbreiten und die Prüfung schnell genug halten, dass sie den Workflow nie unterbricht.

Hack und seine Werkzeuge zur Code-Modifikation wurden auf hacklang.org als Teil von HHVM als Open Source bereitgestellt, und Facebook erklärte, HHVM werde eine PHP-Laufzeit bleiben, die auf Parität mit PHP 5 hinarbeite, damit PHP-Code von Drittanbietern neben Hack weiterlief. Die Ankündigung erzielte am 20. März 2014 576 Punkte und 415 Kommentare auf Hacker News, und Facebook plante für den folgenden Monat einen Hack Developer Day auf seinem Campus in Menlo Park. Innerhalb von Facebook war die Migration bereits faktisch abgeschlossen: Nahezu die gesamte PHP-Codebasis lief nach etwa einem Jahr organischer Übernahme plus automatisierter Refactoring-Werkzeuge auf Hack.

DEN BELEGEN FOLGEN

Die Quellen

  1. Hack: a new programming language for HHVM Engineering at Meta · engineering.fb.com ·
  2. Hacker News discussion: Hack: a new programming language for HHVM Hacker News · news.ycombinator.com ·