Hack (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Hack
Logo
Basisdaten
Erscheinungsjahr: 2014
Designer: Julien Verlaguet, Alok Menghrajani, und andere[1]
Entwickler: Facebook Inc.
Typisierung: schwach, dynamisch, statisch
Beeinflusst von: PHP, OCaml, Java, C#, Scala, Haskell
Lizenz: BSD-Lizenz
hacklang.org

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 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[Bearbeiten | Quelltext bearbeiten]

Ä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 PHP folgende Ausgabe generieren:

Hello World

Features[Bearbeiten | Quelltext bearbeiten]

Statische Typisierung[Bearbeiten | Quelltext bearbeiten]

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;
     public ?string $optional;      // ...muss nicht initialisiert werden

     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 === null;
     }

}
?>

Generics[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

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[Bearbeiten | Quelltext bearbeiten]

Ein Set ist ein Array, in dem jeder Wert nicht mehr als ein einziges Mal vorkommt.

$karten = Set {"Bube", "Dame", "König", "As"};

$karten[] = "Bube"; // Ohne Effekt, denn Bube ist schon Teil des Sets.

$karten->remove("Dame");
$karten->add("Joker");

Map[Bearbeiten | Quelltext bearbeiten]

Eine Map ist eine Sammlung von Schlüssel-Wert-Paaren, ähnlich eines Wörterbuchs. Anders als assoziative Arrays behalten Werte in einer Map die Reihenfolge, in der sie eingefügt wurden.

$map = Map {"A" => 1, "E" => 5, "D" => 4, "B" => 2, "C" => 3};

foreach($map as $schluessel => $wert)
{
     echo $wert."\n"; // Gibt die Werte 1, 5, 4, 2, 3 aus.
}

Lizenz und Bezug[Bearbeiten | Quelltext bearbeiten]

Hack wird unter der BSD-Lizenz vertrieben. Die Software kann kostenlos aus dem Internet geladen werden, der Code wird auf GitHub verwaltet.

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Contributors to facebook/hhvm. Github.com. Abgerufen am 25. März 2014.

Weblinks[Bearbeiten | Quelltext bearbeiten]