Hack (Programmiersprache)
Hack ist eine Skriptsprache für die HipHop Virtual Machine (HHVM). Hack erweitert die Programmiersprache PHP u. a. um statische Typisierung und Generics. Jeder PHP-Code kann auch mit dem Hack-Compiler kompiliert werden. Entwickelt wurde Hack vom Unternehmen Meta Platforms (vormals Facebook Inc.), das schrittweise ihre ursprünglich in PHP geschriebene Social-Network-Webanwendung Facebook auf die neue Sprache Hack umstellt, da die ursprüngliche Verwendung von PHP zusammen mit der Zend Engine die hohen Performanceanforderungen von Facebook nicht mehr befriedigen konnte. Anfang April 2014 wurde die neue Sprache von Facebook Inc. offiziell vorgestellt und als Open Source frei verfügbar gemacht.
Hack | |
---|---|
Basisdaten | |
Erscheinungsjahr: | 2014 |
Designer: | Mark Zuckerberg |
Entwickler: | Facebook Inc. |
Aktuelle Version | 3.15.0[1] (28. September 2016) |
Typisierung: | schwach, dynamisch, statisch |
Beeinflusst von: | PHP, Java, C#, Objective CAML, Scala, Haskell |
Lizenz: | BSD-Lizenz |
hacklang.org docs.hhvm.com |
Syntax
Ähnlich wie PHP-Code steht auch Hack in Tags, jedoch wird hier <?hh ?> statt <?php ?> verwendet.
<?hh
echo 'Hello World';
?>
Hack nutzt weitestgehend dieselben Sprachkonstrukte und Funktionen wie PHP, daher würde obiger Code analog zu PHP folgende Ausgabe generieren:
Hello World
Features
Statische Typisierung
Ein Kernelement der Sprache ist die Typ-Prüfung. Obwohl PHP auf rund 80 % der Webseiten als serverseitige Sprache zum Einsatz kommt, kritisieren viele Entwickler die dynamische Typisierung der Sprache, die ihrer Meinung nach die Fehleranfälligkeit deutlich erhöht. Der in Hack verwendete Typ-Checker hält den Quellcode im Speicher und überwacht die Festplatte auf Änderungen an der Datei. Dadurch sind die Checks in 200 Millisekunden möglich und erzeugen keine merkbaren Verzögerung beim Programmieren, Fehler können schon vor der ersten Ausführung sichtbar gemacht werden. Da null ein Wert ist, der allen anderen verwendeten Typen nicht entspricht, muss seine Verwendung in Hack explizit durch ein vorangestelltes Fragezeichen erlaubt werden (Nullable). Auch müssen Eigenschaften einer Klasse initialisiert werden, wenn sie nicht optional sind. Sowohl für Variablen als auch für Eigenschaften und Methoden von Klassen und deren Parameter kann der Programmierer nun den Datentyp im Vorfeld festlegen:
<?hh
class typing
{
private int $zahl = 0;
protected string $text; // muss string sein
public ?string $optional; // kann null oder string sein
public function __construct()
{
$this->text = ''; // Jede Klasseneigenschaft muss initialisiert werden.
}
public function zeige Pi(): float
{
return round(pi(), 5);
}
public function ist null(?T $Wert): bool
{
return $wert is null;
}
public function nicht null(?T $T oder null Wert, T $default): T
{
if (nonnull is $T oder null Wert)
return $wert;
else
return $default;
}
}
Generics
Neben einfachen, untypisierten Arrays bietet die Sprache weitere, spezielle Felder – Generics. In Hack implementieren diese Feldtypen, wie auch die meisten anderen Typen in Hack, ein zugreifbares Interface, sodass Methoden auf diesen objektähnlichen Strukturen aufgerufen werden können. Auch eigene Generics können erstellt werden.
Vector
Ein Vector ist ein streng typisiertes Array. Der Typ der Einträge wird durch den ersten festgelegt. Der Typ kann bis auf die Wertebene streng festgelegt werden.
class Gedicht
{
protected Vector<string> $gedicht = Vector(
'Ein Schnupfen hockt auf der Terrasse',
'auf daß er sich ein Opfer fasse',
'und stürzt alsbald mit voller Grimm',
'auf einen Menschen namens Schrimm.',
'Paul Schrimm erwidert prompt: "Pitschü!"',
'und hat ihn drauf bis Montag früh.');
public function abgeben(): Vector<string>
{
return $this->gedicht;
}
public function aufsagen(): string
{
$rezitation = '';
foreach($this->gedicht as $zeile)
{
$rezitation .= $zeile."\n";
}
return $rezitation;
}
}
Set
Ein KeySet ist ein Array, in dem jeder Wert nicht mehr als ein einziges Mal vorkommt.
$karten = keyset["Bube", "Dame", "König", "Ass"];
$karten[] = "Bube"; // Ohne Effekt, denn Bube ist schon Teil des Sets.
$karten->remove("Dame");
$karten->add("Joker");
Map
Eine Map (dict) ist eine Sammlung von Schlüssel-Wert-Paaren, ähnlich einem Wörterbuch. Anders als assoziative Arrays behalten Werte in einer Map die Reihenfolge, in der sie eingefügt wurden.
$meine Map = dict["A" => 1, "E" => 5, "D" => 4, "B" => 2, "C" => 3];
foreach(($meine Map) as $schluessel => $wert)
{
echo $wert."\n"; // Gibt die Werte 1, 5, 4, 2, 3 aus.
}
Einzelnachweise
- Release 3.15.0. 28. September 2016 (abgerufen am 9. Februar 2021).
- HHVM 4.0.0. Abgerufen am 7. März 2021.
Weblinks
- Offizielle Website
- Offizielles Tutorial (Memento vom 30. März 2019 im Internet Archive)
- Sprachreferenz
- Source Code auf GitHub