HipHop Virtual Machine

From Infogalactic: the planetary knowledge core
Jump to: navigation, search
HipHop Virtual Machine
HHVM logo, featuring white uppercase "HHVM" letters on a black background, with stylized triangular geometric shapes on the left
Developer(s) Facebook
Initial release December 9, 2011; 12 years ago (2011-12-09)[1]
Stable release 3.13.0[2] / March 30, 2016; 8 years ago (2016-03-30)
Development status Active
Written in C++[3] and OCaml[4][lower-alpha 1]
License PHP License and Zend License[5]
Website www.hhvm.com

HipHop Virtual Machine (HHVM) is a process virtual machine based on just-in-time (JIT) compilation that serves as an execution engine for the PHP and Hack programming languages. By using the principle of JIT compilation, executed PHP or Hack code is first transformed into intermediate HipHop bytecode (HHBC), which is then dynamically translated into the x86-64 machine code, optimized, and natively executed.[1][6] This contrasts to the PHP's usual interpreted execution, in which the Zend Engine transforms the PHP source code into opcodes that serve as a form of intermediate code, and executes the opcodes directly on the Zend Engine's virtual CPU.[7]

HHVM is developed by Facebook, with the project's source code hosted on GitHub and licensed under the terms of PHP License and Zend License.[1][5]

Overview

HHVM was created as the successor of the HipHop for PHP (HPHPc) PHP execution engine, which is a PHP-to-C++ transpiler that has also been created by Facebook.[8][9] Based on the gained experience and aiming to solve issues introduced by HPHPc, Facebook decided in early 2010 to create a JIT-based PHP virtual machine.[10] Issues associated with HPHPc included its reaching of a plateau for further performance improvements, lack of full support for all features of the PHP language, and difficulties arising from specific time- and resource-consuming development and deployment processes required for PHP projects that used HPHPc.[8] In Q1 2013, the production version of facebook.com website stopped using HPHPc and switched to HHVM.

Following the JIT compilation principle, HHVM first converts the executed PHP or Hack code into a high-level bytecode, HHBC, which is also known as an intermediate language. HHBC is a bytecode format created specifically for HHVM, in a form that is appropriate for consumption by both interpreters and just-in-time compilers. As the next steps in execution, HHVM dynamically ("just-in-time") translates the HHBC bytecode into x86-64 machine code, performs its additional optimizations through a dynamic analysis of the translated bytecode, and executes the x86-64 machine code.[1][8][11] As a result, HHVM has certain similarities to the virtual machines used by other programming languages, including the Common Language Runtime (CLR, for the C# language) and Java virtual machine (JVM, for the Java language).[10]

HHVM brings many benefits in comparison with HPHPc, and one of them is almost complete support for the entire PHP language as defined by the official implementation of PHP version 5.4, including the HHVM's support for create_function() and eval() constructs.[12][13] Furthermore, HHVM uses the same execution engine when deployed in both production and development environments, while supporting integration between the execution engine and the HPHPd debugger in both environment types; as a result, maintaining HPHPi (HipHop interpreter) separately as a development utility is no longer needed as it was the case with HPHPc. HHVM also eliminates the lengthy builds required by HPHPc to run PHP programs, resulting in much simpler development and deployment processes than it was the case with HPHPc.[1]

Together with HHVM, Facebook also released Hack, which is a programming language specifically tailored for HHVM and can be seen as a new version of the PHP language.[14][15] Hack allows programmers to use both dynamic typing and static typing, which is a concept also known as gradual typing, and allows types to be specified for function arguments, function return values, and class properties; however, types of local variables cannot be specified. At the same time, Hack does not provide complete backward compatibility by not carrying on some of the PHP features, such as the goto statement and dynamic variable names.[16][17][18][19]

Performance

Studies of end-user behavior conclude that the lack of speed in website operation and even small delays in web server response time, lower than half of a second, can have significant negative impacts on the end-user experience and overall performance of the website.[20] Some formerly popular websites, such as Friendster, have suffered due to prolonged speed issues.[21]

As a process virtual machine that provides the execution environment, HHVM has the ability to use live type information to produce more efficient native code, leading to a higher web server throughput and lower latency. In Q4 2012, the execution of facebook.com's source code on HHVM achieved performance parity with HPHPc,[8] and in December 2013 HPHPc was even surpassed by around 15%.[22]

See also

Notes

  1. Only the Hack's type-checking (hh_server and hh_client) and code-formatting (hh_format) command-line utilities and daemons bundled together with the HipHop Virtual Machine are written in OCaml.

References

  1. 1.0 1.1 1.2 1.3 1.4 Lua error in package.lua at line 80: module 'strict' not found.
  2. Lua error in package.lua at line 80: module 'strict' not found.
  3. Lua error in package.lua at line 80: module 'strict' not found.
  4. Lua error in package.lua at line 80: module 'strict' not found.
  5. 5.0 5.1 Lua error in package.lua at line 80: module 'strict' not found.
  6. Lua error in package.lua at line 80: module 'strict' not found.
  7. Lua error in package.lua at line 80: module 'strict' not found.
  8. 8.0 8.1 8.2 8.3 Lua error in package.lua at line 80: module 'strict' not found.
  9. Lua error in package.lua at line 80: module 'strict' not found.
  10. 10.0 10.1 Lua error in package.lua at line 80: module 'strict' not found.
  11. Lua error in package.lua at line 80: module 'strict' not found.
  12. Lua error in package.lua at line 80: module 'strict' not found.
  13. Lua error in package.lua at line 80: module 'strict' not found.
  14. Lua error in package.lua at line 80: module 'strict' not found.
  15. Lua error in package.lua at line 80: module 'strict' not found.
  16. Lua error in package.lua at line 80: module 'strict' not found.
  17. Lua error in package.lua at line 80: module 'strict' not found.
  18. Lua error in package.lua at line 80: module 'strict' not found.
  19. Lua error in package.lua at line 80: module 'strict' not found.
  20. Lua error in package.lua at line 80: module 'strict' not found.
  21. Lua error in package.lua at line 80: module 'strict' not found.
  22. Lua error in package.lua at line 80: module 'strict' not found.

External links