In Eile? Probiere Hack jetzt aus: http://hacklang.org/
Heute stellen wir Hack vor, eine Programmiersprache, die wir für HHVM entwickelt haben und die nahtlos mit PHP interagiert. Hack vereint den schnellen Entwicklungszyklus von PHP mit der Disziplin der statischen Typisierung und fügt gleichzeitig viele Funktionen hinzu, die in anderen modernen Programmiersprachen üblich sind.
Wir haben Hack bei Facebook eingesetzt und es war ein großer Erfolg. Im Laufe des letzten Jahres haben wir fast unsere gesamte PHP-Codebasis auf Hack migriert, sowohl dank der organischen Akzeptanz als auch dank einer Reihe von selbst entwickelten Refactoring-Tools.
Wir sind auch stolz darauf, eine Open-Source-Version von Hack als Teil unserer HHVM-Laufzeitplattform zu veröffentlichen, die nun sowohl Hack als auch PHP unterstützt.
Motivation
Jeder PHP-Programmierer ist mit alltäglichen Aufgaben vertraut, die knifflig oder mühsam sein können. Der obige Code ist ein großartiges Beispiel für einen häufigen Fehler, bei dem eine Methode unerwartet auf einem Null-Objekt aufgerufen werden kann, was einen Fehler verursacht, der erst zur Laufzeit bemerkt wird. Ein anderes Beispiel ist eine komplexe API, bei der die Entwickler zwar ein solides Verständnis der Semantik haben, aber dennoch Zeit damit verbringen, in der Dokumentation nach banalen Methodennamen zu suchen.
Im Maßstab von Facebook – mit Tausenden von Entwicklern, die zweimal täglich neuen Code liefern – sind solche Verlangsamungen noch problematischer. Vor Hack hatten wir eine einfache Sprache mit einer schnellen Feedback-Schleife – aber wie konnten wir die oben beschriebenen Probleme entschärfen? Könnte eine frühzeitige Fehlererkennung mit einer schnellen Iteration koexistieren, ohne dass unsere Investition in PHP darunter leidet? Könnte eine verbesserte Codeanalyse und Introspektion dazu beitragen, dass Entwickler mit Werkzeugen wie der Autovervollständigung produktiver werden?
Traditionell ermöglichen dynamisch typisierte Sprachen eine schnelle Entwicklung, aber sie opfern die Fähigkeit, Fehler frühzeitig zu erkennen und den Code schnell zu analysieren, insbesondere bei größeren Codebasen. Umgekehrt bieten statisch typisierte Sprachen ein größeres Sicherheitsnetz, aber oft auf Kosten einer schnellen Iteration. Wir waren der Meinung, dass es einen „Sweet Spot“ geben muss.
So wurde Hack geboren. Wir glauben, dass es das Beste von dynamisch und statisch typisierten Sprachen bietet und dass es für Projekte jeder Größe wertvoll sein wird.
Die Hack-Sprache
Hack hat tiefe Wurzeln in PHP. In der Tat sind die meisten PHP-Dateien bereits gültige Hack-Dateien. Wir haben uns bewusst dafür entschieden, eine Handvoll veralteter Funktionen und Features nicht zu unterstützen, die nicht mit der statischen Typisierung kompatibel waren (z.B. „variable Variablen“ und die extract()-Funktion). Wir haben auch viele neue Funktionen hinzugefügt, von denen wir glauben, dass sie Entwicklern helfen werden, produktiver zu sein.
Unsere wichtigste Ergänzung ist die statische Typisierung. Wir haben ein System entwickelt, um Funktionssignaturen und Klassenmitglieder mit Typinformationen zu versehen; unser Algorithmus zur Typüberprüfung (der „Type Checker“) leitet den Rest ab. Die Typprüfung erfolgt schrittweise, so dass sogar innerhalb einer einzelnen Datei ein Teil des Codes in Hack konvertiert werden kann, während der Rest dynamisch typisiert bleibt. Technisch gesehen ist Hack eine „allmählich typisierte*“* Sprache: dynamisch typisierter Code interagiert nahtlos mit statisch typisiertem Code.
In Hack’s Typsystem haben wir verschiedene Features eingeführt, wie z.B. Generics, nullable types, type aliasing und constraints on type parameters. Diese neuen Sprachfeatures sind unauffällig, so dass der Code, den Sie mit Hack schreiben, immer noch wie die dynamische Sprache aussieht und sich anfühlt, an die PHP-Programmierer gewöhnt sind.
Hingegen fügt Hack zusätzliche Features hinzu, die über die statische Typprüfung hinausgehen, einschließlich Collections, Lambda-Ausdrücke und die Durchsetzung von Rückgabetypen und Parametertypen zur Laufzeit.
Collections bieten eine saubere, typsichere Alternative zu PHP-Arrays. Wir haben sie speziell entwickelt, um gut mit statischer Typisierung und Generics zu arbeiten. Die Collections-API bietet viele klassische Funktionen höherer Ordnung wie map() und filter(), um funktionale Programmierstile zu erleichtern.
Lambda-Ausdrücke bieten eine prägnante Syntax zur Erstellung von Closures. PHP verfügt zwar über Closures, verlangt aber vom Programmierer, dass er die Variablen, die er aus umschließenden Bereichen verwenden muss, explizit benennt. Mit Hack’s Lambda-Ausdrücken leiten wir diese Verwendungen automatisch ab, was Ihnen unnötige Arbeit erspart. Lambda-Ausdrücke machen es bequemer, die Vorteile der Collections-API in vollem Umfang zu nutzen.
Die Durchsetzung von Rückgabe- und Parametertypen (einschließlich skalarer Typen wie int und string) zur Laufzeit bietet Sicherheit, die über das hinausgeht, was statisch überprüft werden kann, während Typkommentare schrittweise zu einer Codebasis hinzugefügt werden. Die Durchsetzung zur Laufzeit hilft Programmierern, bestimmte Arten von Problemen leichter zu erkennen und zu diagnostizieren, und sie hilft dem JIT von HHVM, effizienteren Code zu produzieren, indem sie es sicher macht, Typ-Annotationen zu Optimierungszwecken zu vertrauen.
Sofortige Typüberprüfung
Während der Entwicklung wechselt ein PHP-Programmierer normalerweise schnell zwischen dem Quellcode und dem Browser hin und her. Ingenieure können so schnell wie nötig iterieren, testen und optimieren, bis das Ergebnis perfekt ist.
Traditionell würde eine Typüberprüfung diese Feedbackschleife unterbrechen, da die Analyse des Quellcodes Zeit in Anspruch nimmt. Wir wollten den PHP-Workflow nicht verlangsamen, also haben wir einen neuen Ansatz entwickelt, um sofortiges Feedback mit Typsicherheit in Einklang zu bringen.
Unsere Lösung bestand darin, die Typüberprüfung als lokalen Server zu gestalten, der das Dateisystem überwacht. Der Server behält alle Informationen über den Quellcode im Speicher und aktualisiert sich automatisch, wenn sich eine Datei auf der Festplatte ändert. Dieser Ansatz hat sich ausgezahlt: Die Typüberprüfung läuft in der Regel in weniger als 200 Millisekunden und benötigt selten mehr als eine Sekunde, so dass sie leicht in den Entwicklungsablauf integriert werden kann, ohne dass es zu einer spürbaren Verzögerung kommt.
Code-Migration
Die Vorteile von Hack in Bezug auf Typsicherheit und Refactoring wachsen, je mehr er in einer Codebasis eingesetzt wird. Da wir wussten, dass es schwierig sein würde, einen Teil des Codes sofort vollständig auf Hack umzustellen, war es uns wichtig, Hack so zu entwickeln, dass es direkt mit anderen PHP-Dateien koexistieren kann, während es schrittweise eingeführt wird.
Der Rest des Konvertierungsprozesses, wie das Hinzufügen von Typ-Annotationen und die Verwendung neuer Sprachfunktionen, kann je nach Codebasis durchgeführt werden. So kann zum Beispiel eine Typ-Annotation für eine Funktion hinzugefügt, für eine andere Funktion aber weggelassen werden, sogar in derselben Datei. Wenn ein Funktionsparameter oder ein Klassenmitglied keine explizite Typ-Annotation hat, betrachtet die Typprüfung seinen Typ als dynamisch und prüft den Typ dieses Wertes nicht.
Innerhalb von Facebook haben wir festgestellt, dass unsere Ingenieure Hack so sehr schätzen, dass sie den Großteil ihres eigenen Codes freiwillig konvertieren. Bei Millionen von Codezeilen in unserem Baum wollten wir auch eine Form der Automatisierung, also haben wir eine Reihe von Tools zur Codeänderung entwickelt, die den Prozess unterstützen (und die wir als Teil von Hack veröffentlichen).
Keine Sorge, Ihr PHP ist sicher!
HHVM ist immer noch eine PHP-Laufzeitumgebung, und wir haben vor, das auch so zu lassen. In der Tat arbeiten wir hart daran, die Parität mit PHP-5 zu erreichen. Eine der obersten Prioritäten von HHVM ist es, unveränderten PHP-5-Quellcode laufen zu lassen, sowohl für die Community als auch weil wir intern auf PHP-Bibliotheken von Drittanbietern angewiesen sind.
HHVM ist jetzt eine Laufzeitumgebung, die *beide* PHP und Hack unterstützt, so dass Sie schrittweise von den neuen Funktionen von Hack profitieren können.
Viel Spaß mit Hack!
Wir freuen uns, sowohl Hack als auch die Tools, die Sie zur automatischen Konvertierung Ihrer Codebasis verwenden können, als Open-Source zu veröffentlichen. Dies ist nur der erste Schritt, und wir sind bestrebt, diese Software weiterzuentwickeln, um die Entwicklung sowohl für unsere eigenen Ingenieure als auch für die breitere Gemeinschaft noch einfacher zu machen. Der Wert von Hack ist *nicht* auf große Projekte beschränkt: mit Typinformationen, guten Fehlermeldungen und schnellem Feedback können auch kleine Codebasen von Hack profitieren.
Nächsten Monat werden wir die Sprache auch auf dem Hack Developer Day auf dem Facebook-Campus in Menlo Park vorstellen, und wir hoffen, Sie dort persönlich oder online zu sehen.
Wir würden uns über Ihr Feedback zu unserer bisherigen Arbeit freuen und heißen Sie alle herzlich willkommen, sich an der HHVM- und Hack-Community zu beteiligen.
Dankeschön
Es gibt viele Leute, die zur Entwicklung von Hack beigetragen haben.
Das Kernteam von Hack besteht aus Julien Verlaguet, Joel Beales, Eugene Letuchy, Gabriel Levi, Joel Marcey, Erik Meijer, Alok Menghrajani, Bryan O’Sullivan, Drew Paroski, James Pearce, Joel Pobar, und Joshua Van Dyke Watzman.
Ein besonderer Dank geht an unsere frühen Community-Anwender, die mit ihrem wertvollen Feedback zur Verbesserung der Sprache beigetragen haben: James Miller, Simon Welsh, Nils Adermann, Fabien Potencier, und Alexander Mols.
Hack ist hauptsächlich in OCaml geschrieben. Wir möchten dem Gallium-Team (INRIA) für die Entwicklung der OCaml-Sprache und dem Ocsigen-Team (CNRS – Universität Paris Diderot – INRIA) für die Entwicklung des js_of_ocaml-Teils von Ocsigen danken.
Und natürlich danken wir auch allen anderen, die dazu beigetragen haben, Hack zu der Sprache zu machen, die es heute ist. Die Liste ist zu umfangreich für einen Blogbeitrag, aber Sie wissen, wer Sie sind.