Hack (programming language)

From Wikipedia, the free encyclopedia
Jump to: navigation, search
Not to be confused with Haxe (programming language).
Hack
Logo of Hack
Designed by Julien Verlaguet, Alok Menghrajani, and others[1]
Developer Facebook
Appeared in 2014
Typing discipline static, dynamic, weak
Influenced by PHP, Java, C#
OS Cross-platform
License BSD License[2]
Website hacklang.org

Hack is a programming language for the HipHop Virtual Machine (HHVM), created by Facebook. The language is open source, licensed under the BSD License.[2][3][4]

Hack can be seen as a new version of PHP that also runs on the HHVM, but it allows programmers to use both dynamic typing and static typing. This kind of a type system is called gradual typing, which is also implemented in other programming languages such as ActionScript.[5] Hack's type system allows types to be specified for function arguments, function return values, and class properties; however, types of local variables cannot be specified.[3][6][7]

History[edit]

Hack was introduced on March 20, 2014.[8] Before the announcement of the new programming language, Facebook had already implemented the code and "battle tested" it on a large portion of its web site.

Features[edit]

Hack interoperates seamlessly with PHP, which is a widely used open source general-purpose scripting language that is especially suited for web development and can be embedded into HTML. A majority of the valid PHP scripts is also valid in Hack; however, numerous less frequently used PHP features and language constructs are not supported in Hack.[9]

Hack extends the type hinting available in PHP 5 by making types mandatory through the introduction of static typing, by adding new type hints (for example, for scalar types such as integer or string), as well as by extending the use of type hints (for example, for class properties or function return values). However, types of local variables cannot be specified.[6][7]

Syntax and semantics[edit]

The basic file structure of a Hack script is similar to a PHP script with a few changes. A Hack file starts with <?hh as opposed to <?php for a PHP script:

<?hh
echo 'Hello World';

The above script, similar to PHP, will be executed and the following output is sent to the browser:

Hello World

An important point to note is that unlike PHP, Hack and HTML code do not mix. Normally you can mix PHP and HTML code together in the same file, like this:

<html>
    <head>
        <title>PHP Test</title>
    </head>
    <body>
        <!-- hh and html do not mix -->
        <?php echo '<p>Hello World</p>'; ?> 
    </body>
</html>

This type of code is not supported by Hack; either XHP or a template engine need to be used.[9]

Functions[edit]

Hack allows types to be specified for function arguments and function return values. Functions in Hack are thus annotated with types like the following:

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

See also[edit]

References[edit]

  1. ^ "Contributors to facebook/hhvm". Github.com. Retrieved 2014-03-25. 
  2. ^ a b "hhvm / hphp / hack / LICENSE". "facebook/hhvm". github.com. Facebook. 2014-03-20. Retrieved 2014-08-11. 
  3. ^ a b Josh Lockhart (2014-04-03). "Facebook’s Hack, HHVM, and the future of PHP". O'Reilly Media. Retrieved 2014-08-02. 
  4. ^ Cade Metz (2014-03-20). "Facebook Introduces 'Hack,' the Programming Language of the Future". Wired. Retrieved 2014-04-15. 
  5. ^ Aseem Rastogi; Avik Chaudhuri; Basil Hosmer (January 2012). "The Ins and Outs of Gradual Type Inference" (PDF). Association for Computing Machinery (ACM). Retrieved 2014-09-23. 
  6. ^ a b "Hack and HHVM: Type Annotations". "Hack Manual". docs.hhvm.com. Retrieved 2014-03-25. 
  7. ^ a b "Hack and HHVM: Type Inference". "Hack Manual". docs.hhvm.com. Retrieved 2014-03-25. 
  8. ^ "Hack: a new programming language for HHVM". code.facebook.com. Facebook. Retrieved 2014-03-23. 
  9. ^ a b "Hack and HHVM: Unsupported PHP Features in Hack". "Hack Manual". docs.hhvm.com. Retrieved 2014-04-02. 

External links[edit]