Hack (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:27, 8 июня 2016.
Hack
fraimed
Парадигма язык программирования
Спроектировано Брайан О’Салливан, Жюльен Верлаг и Алок Менхраджани
Печать дисциплины статическая, динамическая, слабая
OS кроссплатформенный
Лицензия BSD License
Портал: hacklang.org

Hack — (произносится [ hæk ])PHP-подобный язык программирования общего назначения со статической типизацией, разработанный компанией Facebook и представленный 20 марта 2014 года. Код, написанный на языке Hack, исполняется на виртуальной машине HHVM (англ. HipHop Virtual Machine), созданной на базе транслятора HipHop, и поддерживающей одновременно и Hack, и PHP. Целью создания языка стало совмещение быстрого цикла разработки PHP с надёжностью и производительностью, которые обеспечивает статическая типизация.

История

Hack был представлен 20 марта 2014 года. К тому моменту Facebook уже ввела и протестировала большую часть его кода на своем веб-сайте.

Описание

Hack свободно взаимодействует с PHP, что очень удобно для веб-разработки и вставок в HTML: большинство (хоть и не все) обычных скриптов PHP будут работать и в Hack.

Hack расширяет контроль типов (type hinting), представленный в PHP 5, с помощью статистических типов, добавления возможности использования контроля типов с иными типами (например, с int и string).

Также были внедрены следующие фичи из современных языков программирования: асинхронное программирование, обобщенное программирование, псевдонимы типов, обнуляемые типы и ограничения на параметры типов, коллекции, лямбда-выражения, а также проверка возвращаемых типов и типов параметров во время выполнения. Типы проверяются специальным сервером (сервисом, демоном), который следит за изменением файлов исходного кода на диске.

Синтаксис

Структура скрипта Hack похожа на PHP'шную. Скрипт открывается тэгом <?hh, например:

    <?hh
    echo 'Hello World';
При этом нужно заметить, что Hack нельзя смешивать с HTML, как это делается с PHP: нужно либо использовать XHP, либо систему веб-шаблонов.

Функции

Hack позволяет определять типы для аргументов функций и возвращаемых значений функций. Функции описываются в Hack следующим образом:

    <?hh
    // Hack functions are annotated with types.
    function negate(bool $x): bool {
        return !$x;
    }

Классы

В Hack класс описывается следующим образом:

    <?hh
    class MyClass {
      public function alpha(): int {
        return 1;
      }

      public function beta(): string {
        return 'hi test';
      }
    }

Типы

В Hack представлены следующие типы:

Тип Пример Функции Метод класса Свойство класса Возврат функции Параметр Nullable

Примитивы


Num


Arraykey


void


noreturn


Объекты


Смешанные


this


XHP


Nullable


Generics


Перечисляемые


Callable


Tuple


Псевдонимы


Формы

int, array


num


arraykey


void


noreturn


Foo, IBar


mixed


this


XHPRoot, XHPChild


?int, ?Vector<string>


Box<T>


MyEnum


(function(int, string):

string)


(int, string)


MyAlias


MyShape

Да


Да


Да


Да


Да


Да


Да


Нет


Да


Да


Да


Да


Да


Да


Да


Да

Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да

Да


Да


Да


Нет


Нет


Да


Да


Нет


Да


Да


Да


Да


Да


Да


Да


Да

Да


Да


Да


Нет


Нет


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да


Да

Да


Да


Да


Нет


Нет


Да


Да


Нет


Да


Да


Да


Да


Да


Да


Да


Да

Да


Да


Да


Нет


Нет


Да


Нет


Да


Да


Да


Да


Да


Да


Да


Да


Да

Проверщик типов

В Hack встроенный автоматический проверщик типов (typechecker). Он статически анализирует программу и выдает возможные ошибки, при которых бы скрипт не сработал бы при запуске. Typechecker не является компилятором: он только анализирует код в реальном режиме и дает отзывы о нем.

Например, без typechecker'а следующий код бы провалился при запуске:

  <?php
  namespace Hack\UserDocumentation\TypeChecker\Intro\Examples\RuntimeFail;
  class A {
    public function foo() { return 2; }
  }
  function failing($x) {
    $a = new A();
    if ($x === 4) {
      $a = null;
    }
    // $a being null would only be caught at runtime
    // Fatal error: Uncaught exception 'BadMethodCallException' with message
    // 'Call to a member function foo() on a non-object (NULL)'
    $a->foo();
  }
  failing(4);

Вывод:

Fatal error: Uncaught exception 'BadMethodCallException' with message 'Call to a member function foo() on a non-object (null)' in /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/runtime-fail.php:17
Stack trace:
#0 /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/runtime-fail.php(20): Hack\UserDocumentation \TypeChecker\Intro\Examples\RuntimeFail\failing()
#1 {main}

Следующий же код отловит ошибку еще до запуска, сохраняя пользователю время и работу над фатальными ошибками:

  <?hh
  namespace Hack\UserDocumentation\TypeChecker\Intro\Examples\TypecheckerCatch;
  class A {
    public function foo() { return 2; }
  }
  function failing($x) {
    $a = new A();
    if ($x === 4) {
      $a = null;
    }
    // $a being null would only be caught BEFORE runtime
    //   typechecker-catch.php:21:7,9: You are trying to access the member foo
    //                                 but this object can be null. (Typing[4064])
    //   typechecker-catch.php:12:10,13: This is what makes me believe it can be
    //                                   null
    //
    $a->foo();
  }
  failing(4);

Вывод:

Fatal error: Uncaught exception 'BadMethodCallException' with message 'Call to a member function foo() on a non-object (null)' in  /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/typechecker-catch.php.type-errors:20
Stack trace:
#0 /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/typechecker-catch.php.type-errors(23):  Hack\UserDocumentation\TypeChecker\Intro\Examples\TypecheckerCatch\failing()
#1 {main}

Полезные ссылки

  1. Документация
  2. Головной сайт
  3. Гитхаб проекта
  4. Обучалка
  5. Установка