HipHop Virtual Machine ( HHVM ) — это виртуальная машина с открытым исходным кодом , основанная на компиляции just-in-time (JIT) , которая служит в качестве движка выполнения для языка программирования Hack . Используя принцип JIT-компиляции, код Hack сначала преобразуется в промежуточный байт-код HipHop ( HHBC ), который затем динамически транслируется в машинный код x86-64 , оптимизируется и выполняется в исходном коде. [7] [8] Это контрастирует с обычным интерпретируемым выполнением PHP , при котором Zend Engine преобразует исходный код PHP в коды операций , которые служат формой байт-кода , и выполняет коды операций непосредственно на виртуальном процессоре Zend Engine . [9]
HHVM разработан компанией Meta , исходный код проекта размещен на GitHub ; [10] он лицензирован в соответствии с условиями PHP License и Zend License . [1] [6]
HHVM был создан как преемник PHP-движка исполнения HipHop for PHP (HPHPc), который является транспилятором PHP-to- C++, также созданным Facebook. [11] [12] Основываясь на полученном опыте и стремясь решить проблемы, представленные HPHPc, Meta решила в начале 2010 года создать виртуальную машину PHP на основе JIT . Проблемы, связанные с HPHPc, включали достижение плато для дальнейшего улучшения производительности, фундаментальную неспособность поддерживать все функции языка PHP и трудности, возникающие из-за определенных затрат времени и ресурсов на разработку и развертывание. [11] В первом квартале 2013 года производственная версия веб-сайта facebook.com прекратила использовать HPHPc и перешла на HHVM.
Следуя принципу JIT-компиляции, HHVM сначала преобразует исполняемый код в промежуточный язык , высокоуровневый байт-код HHBC. HHBC — это формат байт-кода, созданный специально для HHVM, подходящий для использования как интерпретаторами , так и компиляторами just-in-time. Затем HHVM динамически («just-in-time») транслирует HHBC в машинный код x86-64, оптимизированный посредством динамического анализа транслированного байт-кода. Наконец, он выполняет машинный код x86-64. [1] [11] [13] В результате HHVM имеет определенные сходства с виртуальными машинами, используемыми другими языками программирования, включая Common Language Runtime (CLR, для языка C# ) и виртуальную машину Java (JVM, для языка Java ).
HHVM имеет много преимуществ по сравнению с HPHPc. HHVM использует один и тот же механизм выполнения при развертывании как в производственной среде, так и в среде разработки, поддерживая при этом интеграцию между механизмом выполнения и отладчиком HPHPd в обоих типах среды; в результате поддержка HPHPi (интерпретатора HipHop) отдельно как утилиты разработки больше не требуется, как это было в случае с HPHPc. HHVM также устраняет длительные сборки, необходимые HPHPc для запуска программ, что приводит к гораздо более простым процессам разработки и развертывания, чем это было в случае с HPHPc. [1] Наконец, версии HHVM до 4.0 имеют почти полную поддержку всего языка PHP (как определено официальной реализацией PHP версии 5.4), включая поддержку конструкций и , что было невозможно в HPHPc. [14] [15]create_function()
eval()
Вместе с HHVM 3.0 [16] Meta также выпустила Hack , производную от PHP [17] [18] , которая позволяет программистам использовать как динамическую , так и статическую типизацию (концепция, также известная как постепенная типизация ), и позволяет указывать типы для аргументов функций , возвращаемых значений функций и свойств классов . Однако Hack не обеспечивает полной обратной совместимости , поскольку удаляет несколько функций PHP, таких как оператор и динамические имена переменных . [19] [20] [21] [22]goto
В сентябре 2017 года было объявлено, что версия 3.30 станет последней версией HHVM, официально поддерживающей PHP, и что в дальнейшем HHVM будет поддерживать только Hack. [23] Это было связано с различиями и несовместимостями в PHP 7. [24] HHVM 4.0, выпущенная в феврале 2019 года, стала первой версией без поддержки PHP. [25]
Как виртуальная машина процесса, которая обеспечивает среду выполнения, HHVM имеет возможность использовать информацию о типах в реальном времени для создания более эффективного собственного кода , что приводит к более высокой пропускной способности веб-сервера и меньшей задержке . В четвертом квартале 2012 года выполнение исходного кода facebook.com на HHVM достигло паритета производительности с HPHPc, [11] а в декабре 2013 года HPHPc был даже превзойден примерно на 15%. [26]