Hack: een nieuwe programmeertaal voor HHVM – Facebook Engineering

Heeft u haast? Probeer Hack nu: http://hacklang.org/

Vandaag brengen we Hack uit, een programmeertaal die we hebben ontwikkeld voor HHVM en die naadloos samenwerkt met PHP. Hack verenigt de snelle ontwikkelcyclus van PHP met de discipline die wordt geboden door statische typering, terwijl het veel functies toevoegt die gebruikelijk zijn in andere moderne programmeertalen.

We hebben Hack ingezet bij Facebook en het is een groot succes geworden. In het afgelopen jaar hebben we bijna onze hele PHP-codebase gemigreerd naar Hack, dankzij zowel organische adoptie als een aantal zelfontwikkelde refactoring-tools.

We zijn er ook trots op dat we een open source-versie van Hack kunnen vrijgeven http://hacklang.org/ als onderdeel van ons HHVM runtime-platform, dat nu zowel Hack als PHP zal ondersteunen.

Motivatie

Elke PHP-programmeur is bekend met dagelijkse taken die lastig of omslachtig kunnen zijn. De bovenstaande code is een goed voorbeeld van een veelgemaakte fout waarbij een methode onverwacht kan worden aangeroepen op een null object, wat een fout veroorzaakt die pas bij runtime wordt opgemerkt. Een ander voorbeeld is een complexe API, waarbij ontwikkelaars misschien een goed begrip hebben van de semantiek, maar toch tijd besteden aan het opzoeken van alledaagse methodenamen in documentatie.

Op Facebook-schaal – met duizenden engineers die twee keer per dag nieuwe code verzenden – zijn dit soort vertragingen zelfs nog problematischer. Voor Hack hadden we een eenvoudige taal met een snelle feedback-lus – maar hoe konden we de hierboven beschreven problemen beperken? Kan vroege foutdetectie samengaan met snelle iteratie, terwijl onze investering in PHP behouden blijft? Kunnen verbeterde code analyse en introspectie ontwikkelaars productiever maken met tools zoals auto-complete?

Traditioneel laten dynamisch getypeerde talen een snelle ontwikkeling toe, maar offeren ze de mogelijkheid op om fouten vroeg op te sporen en code snel te introspecteren, vooral op grotere codebases. Omgekeerd, statisch getypeerde talen bieden meer van een vangnet, maar vaak ten koste van snelle iteratie. Wij geloofden dat er een middenweg moest zijn.

Hiermee was Hack geboren. Wij geloven dat het het beste biedt van zowel dynamisch getypeerde als statisch getypeerde talen, en dat het waardevol zal zijn voor projecten van elke grootte.

De taal Hack

Hack heeft diepe wortels in PHP. In feite zijn de meeste PHP bestanden al geldige Hack bestanden. We hebben er bewust voor gekozen om een handvol afgeschreven functies en functies die niet compatibel waren met statische typering (bijv. “variabele variabelen” en de functie extract()) niet te ondersteunen. We hebben ook veel nieuwe functies toegevoegd waarvan we geloven dat ze ontwikkelaars zullen helpen productiever te zijn.

Onze belangrijkste toevoeging is statische typering. We hebben een systeem ontwikkeld om functie handtekeningen en klasse leden te annoteren met type informatie; ons type controle algoritme (de “type checker”) leidt de rest af. De type-controle is incrementeel, zodat zelfs binnen een enkel bestand sommige code naar Hack geconverteerd kan worden, terwijl de rest dynamisch getypt blijft. Technisch gesproken is Hack een “geleidelijk getypeerde*”* taal: dynamisch getypeerde code werkt naadloos samen met statisch getypeerde code.

In het typesysteem van Hack hebben we verschillende eigenschappen geïntroduceerd, zoals generics, nullable types, type aliasing, en constraints op type-parameters. Deze nieuwe taalkenmerken zijn onopvallend, zodat de code die u met Hack schrijft er nog steeds uitziet en aanvoelt als de dynamische taal waaraan PHP-programmeurs gewend zijn.

Hoch voegt Hack extra kenmerken toe naast statische typecontrole, waaronder Collecties, lambda-expressies, en runtime handhaving van retourtypen en parametertypen.

Collecties bieden een schoon, typeveilig alternatief voor PHP-arrays. We hebben ze speciaal ontworpen om goed te werken met static typing en generics. De Collections API biedt veel klassieke hogere-orde functies zoals map() en filter() om functionele programmeerstijlen te vergemakkelijken.

Lambda expressies geven een beknopte syntax voor het maken van closures. Hoewel PHP closures heeft, vereist het van de programmeur om expliciet de variabelen te benoemen die ze nodig hebben om van omsluitende scopes gebruik te maken. Met de lambda-expressies van Hack leiden we dit gebruik automatisch af, zodat je onnodig werk bespaart. Lambda-expressies maken het handiger om volledig te profiteren van de Collections API.

Run-time handhaving van retour- en parametertypen (inclusief scalaire typen zoals int en string) biedt veiligheid die verder gaat dan wat statisch kan worden gecontroleerd terwijl type-annotaties geleidelijk aan een codebase worden toegevoegd. Run-time handhaving helpt programmeurs bepaalde soorten problemen gemakkelijker op te sporen en te diagnosticeren, en het helpt HHVM’s JIT efficiëntere code te produceren door het veilig te maken om op type-annotaties te vertrouwen voor optimalisatiedoeleinden.

Instantaneous type checking

Tijdens de ontwikkeling gaat een PHP-programmeur meestal snel heen en weer tussen de broncode en de browser. Ingenieurs kunnen zo snel itereren als ze nodig hebben, testen en tunen tot de ervaring perfect is.

Traditioneel zou een type-checker deze feedback-loop verstoren, omdat het tijd kost om de broncode te analyseren. We wilden de PHP-workflow niet vertragen, dus kwamen we met een nieuwe benadering om onmiddellijke feedback te verzoenen met typeveiligheid.

Onze oplossing was om de typechecker te ontwerpen als een lokale server die het bestandssysteem in de gaten houdt. De server bewaart alle informatie over de broncode in het geheugen en werkt zichzelf automatisch bij als een bestand op schijf verandert. Deze aanpak heeft zijn vruchten afgeworpen: de type-checker draait meestal in minder dan 200 milliseconden en neemt zelden meer dan een seconde in beslag, waardoor hij gemakkelijk in de ontwikkelworkflow kan worden geïntegreerd zonder merkbare vertraging op te lopen.

Code migratie

De voordelen van hack op het gebied van type-veiligheid en refactoring worden groter naarmate hij meer binnen een codebase wordt gebruikt. Omdat wij begrijpen dat het voor sommige code moeilijk zou zijn om meteen volledig op Hack over te stappen, was het voor ons belangrijk dat Hack zo wordt ontwikkeld dat het direct naast andere PHP-bestanden kan bestaan terwijl het stapsgewijs wordt ingevoerd.

De rest van het conversieproces, zoals het toevoegen van type-annotaties en het gebruik van nieuwe taaleigenschappen, kan worden gedaan zoals geschikt is voor de codebase. Bijvoorbeeld, een type annotatie kan worden toegevoegd voor een functie, maar weggelaten een andere functie, zelfs in hetzelfde bestand. Als een functieparameter of klasselid geen expliciete type-annotatie heeft, beschouwt de type-checker het type als dynamisch, en wordt het type van die waarde niet gecontroleerd.

Binnen Facebook ontdekten we dat onze ingenieurs Hack zo waardeerden dat ze vrijwillig het grootste deel van hun eigen code begonnen te converteren. Met miljoenen regels code in onze boom wilden we ook een vorm van automatisering, dus bouwden en gebruikten we een aantal hulpmiddelen voor het wijzigen van code om het proces te ondersteunen (die we uitbrengen als onderdeel van Hack).

Maak je geen zorgen, je PHP is veilig!

HVM is nog steeds een PHP-runtime, en we zijn van plan om dat zo te houden. Sterker nog, we werken er hard aan om gelijk te komen met PHP-5. Een van HHVM’s topprioriteiten is het draaien van ongewijzigde PHP-5 broncode, zowel voor de gemeenschap als omdat we intern vertrouwen op PHP-bibliotheken van derden.

HVM is nu een runtime die *zowel* PHP als Hack ondersteunt, zodat u stapsgewijs kunt beginnen te profiteren van de nieuwe mogelijkheden van Hack.

Heb plezier met Hack!

We zijn verheugd om zowel Hack als de gereedschappen die u kunt gebruiken om uw codebase automatisch om te zetten open-source te stellen. Dit is pas de eerste stap, en we zijn vastbesloten om deze software te blijven ontwikkelen om ontwikkeling nog gemakkelijker te maken voor zowel onze eigen ingenieurs als de bredere gemeenschap. De waarde van Hack is *niet* beperkt tot grote projecten: met type-informatie, goede foutmeldingen en snelle feedback kunnen ook kleine codebases de vruchten van Hack plukken.

Volgende maand zullen we de taal ook introduceren op de Hack Developer Day op de Facebook-campus in Menlo Park, en we hopen u daar persoonlijk of online te zien.

We zouden graag uw feedback krijgen op ons werk tot nu toe, en heten u allen welkom om deel te nemen aan de HHVM- en Hack-gemeenschap.

Aankondigingen

Er zijn veel mensen die hebben bijgedragen aan de ontwikkeling van Hack.

Het kernteam van Hack bestaat uit Julien Verlaguet, Joel Beales, Eugene Letuchy, Gabriel Levi, Joel Marcey, Erik Meijer, Alok Menghrajani, Bryan O’Sullivan, Drew Paroski, James Pearce, Joel Pobar, en Joshua Van Dyke Watzman.

Een speciaal woord van dank gaat uit naar onze early community adopters voor het leveren van waardevolle feedback om de taal beter te maken: James Miller, Simon Welsh, Nils Adermann, Fabien Potencier, en Alexander Mols.

Hack is voornamelijk geschreven in OCaml. We willen graag het Gallium team (INRIA) bedanken voor de ontwikkeling van de OCaml taal, en het Ocsigen team (CNRS – Universiteit van Parijs Diderot – INRIA) voor de ontwikkeling van het js_of_ocaml deel van Ocsigen.

En, natuurlijk, dank aan alle anderen die hebben geholpen Hack te maken tot de taal die het vandaag de dag is. De lijst is te uitputtend voor een blog post, maar jullie weten wie jullie zijn.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.