A virtual machine designed for executing programs written in Hack and PHP.
C++ PHP Hack OCaml C CMake Other
Latest commit cf2b6bb Oct 25, 2016 @dabek dabek committed with Hhvm Bot Split failed_naming set from failed_parsing and update it during lazy…
… incremental check

I though that all the failed_* sets are there just because we always rebuild the full error list from the scratch, so we need to know which files to check to get all the errors. If we are not interested in full error list (as it is in lazy incremental mode), then we can leave those sets out of date (provided that we will recompute them later).

I found one case where this is not correct, since we use failed_naming as kind of a dependency tracking mechanism. If we have a duplicate definition of a class, Hack chooses the one it will use arbitrarily. If we later delete it, we need to choose back to the other one, and recheck everything that depends on it. Both files containing the duplicate class being inside failed_naming is the only place where we track this information.

Note: this is a little bit of giving up on "each keystroke results in parsing/naming only of the file that was edited" principle of lazy incremental mode - if you have duplicate identifiers we will keep reparsing/naming them with each check until you don't fix the ambiguity. I don't feel like adding more complexity to handle this edge case - I doubt it happens often, and parsing/naming are blazingly fast so it doesn't hurt that much.

Reviewed By: dlreeves

Differential Revision: D4024506

fbshipit-source-id: 6fc540a1e7c38ca89361e9c299d040c1908cb7d3



HHVM page | HHVM documentation | Hacklang page | General group | Dev group | Twitter

HHVM is an open-source virtual machine designed for executing programs written in Hack and PHP. HHVM uses a just-in-time (JIT) compilation approach to achieve superior performance while maintaining the development flexibility that PHP provides.

HHVM supports Hack, PHP 5 and the major features of PHP 7. We are aware of minor incompatibilities, so please open issues when you find them. HHVM also supports many extensions as well.

HHVM should be used together with a webserver like the built in, easy to deploy Proxygen, or a FastCGI-based webserver on top of nginx or Apache.


If you're new, try our getting started guide.

You can install a prebuilt package or compile from source.


You can run standalone programs just by passing them to hhvm: hhvm my_script.php.

If you want to host a website:

  • Install your favorite webserver. Proxygen is built in to HHVM, fast and easy to deploy.
  • Install our package
  • Start your webserver
  • Run sudo /etc/init.d/hhvm start
  • Visit your site at http://.../index.php

Our getting started guide provides a slightly more detailed introduction as well as links to more information.


We'd love to have your help in making HHVM better. If you're interested, please read our guide to contributing.


HHVM is licensed under the PHP and Zend licenses except as otherwise noted.

The Hack typechecker (hphp/hack) is licensed under the BSD license (hphp/hack/LICENSE) with an additional grant of patent rights (hphp/hack/PATENTS) except as otherwise noted.

Reporting Crashes

See Reporting Crashes for helpful tips on how to report crashes in an actionable manner.

Reporting and Fixing Security Issues

Please do not open GitHub issues or pull requests - this makes the problem immediately visible to everyone, including malicious actors. Security issues in HHVM can be safely reported via HHVM's Whitehat Bug Bounty program:


Facebook's security team will triage your report and determine whether or not is it eligible for a bounty under our program.


Our user FAQ has answers to many common questions about HHVM, from general questions to questions geared towards those that want to use.

There is also a FAQ for contributors to HHVM.