Hack (язык программирования)
Последнее изменение этой страницы: 23:27, 8 июня 2016.
Парадигма | язык программирования |
---|---|
Спроектировано | Брайан О’Салливан, Жюльен Верлаг и Алок Менхраджани |
Печать дисциплины | статическая, динамическая, слабая |
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 позволяет определять типы для аргументов функций и возвращаемых значений функций. Функции описываются в 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}
ISSN 2542-0356
Следуй за Полисом
Оставайся в курсе последних событий
Лицензия
Если не указано иное, содержание этой страницы доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» 4.0, а примеры кода – по лицензии Apache 2.0. Подробнее см. Условия использования.