Hack (Programmiersprache)

Hack
Logo
Basisdaten
Erscheinungsjahr: 2014
Designer: Mark Zuckerberg
Entwickler: Facebook Inc.
Aktuelle Version 4.172[1] (2. November 2022)
Typisierung: schwach, dynamisch, statisch
Beeinflusst von: PHP, Java, C#, Objective CAML, Scala, Haskell
Lizenz: BSD-Lizenz
hacklang.org docs.hhvm.com

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.

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

Syntax seit HHVM 4.0

Seit der HHVM Version 4.0[2] sollten Hack-Scripte wie folgt geschrieben werden:

#!/usr/bin/env hhvm

<<__EntryPoint>>
function main(): noreturn
{
  print("Hello, world!\n");
  exit(0);
}

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

  1. Release 4.172. 2. November 2022 (abgerufen am 15. April 2024).
  2. HHVM 4.0.0. Abgerufen am 7. März 2021.

Weblinks