原文链接:http://coderoncode.com/2013/07/24/introduction-hhvm.html

“HHVM(HIpHop Virtual Machina)把PHP代码转换成高层次的字节码(普遍认为是一种中间语言)。然后这样的字节码在运行时被JIT(just-in-time)编译器动 态地转换成x64机器码。基于这样的考虑,HHVM和包括C#/CLR和Java/JVM在内的其他语言中的虚拟机类似。”

有点长的历史

在2008年早期Facebook网站便工作在HipHop(一个PHP执行引擎,现在是HPHP)上。其原始的动机便是把Facebook网站中 大量的PHP代码转换成C++代码,以便节约资源和提升应用性能。其原始版本便是HPHPc(一个把PHP代码转换成C++代码的编译器)。

在接下来的两年时间里Facebook网站继续工作在HipHop上,这时候的HipHop增加了HPHPi(一个HPHP的”开发模式”版本)和 HPHPd(HipHop debugger)。运行在HipHop平台上的PHP应用程序允许开发者查看和单步执行代码并且可以交互式地调试。

在巅峰时期,运行在HipHop上的PHP代码在性能上是运行在ZEND引擎上的PHP代码的6倍。然而,在HipHop的第一次迭代版上仍然有几个缺点:

1、HPHPc不是完全的支持PHP语言,最明显的便是不支持create_function和eval这两个函数。诚然,我并不认为对于不支持eval这个函数是件坏事。

2、Facebook的开发者必须维护两个不同的引擎(HPHPc和HPHPi),这样的结果便是导致重复的工作和浪费资源。

3、最后,HPHPc需要完全不同的部署过程,这样会妨碍到它被PHP开发者所采纳。

鉴于这些问题,Facebook公司在2010年早期采取了两个关键行动。其一便是把HipHop平台开源了,开源这样的一个项目是一个伟大的方 式,便于构建一个围绕着这个项目的社区并且可以从社区中获取到来自外界的帮助。其二,Facebook公司开始了HipHop在现代版本上的发展,这便是 HHVM(HipHop virtual Machine)。HHVM提升了HPHPc的健壮性并且修正了许多关键性的问题。

HHVM建立在HPHPc的顶端,其工作方式便是把PHP代码转换成高层次的字节码(一种中间语言)。这样的字节码在运行时被JIT(Just-In-Time)编译器动态地转换成机器码。

如果你像我一样,你可能对字节码、机器码和Just-In-Time编译器还有着模糊的记忆。所以,让我们暂时偏离一下主题快速地回顾下这些概念,然后讲解下他们是如何在HHVM中扮演关键性的角色。

字节码、机器码以及JIT,哦,我的…!

字节码:它是一个人们读不懂的代码,被设计来让解释器或者编译器高效执行的。当HHVM第一次导入我们的项目,它把所有的PHP代码转换成字节码这样的中间形式。产生的字节码和特定类型的计算机结构无关,因此可以很方便地在不同的系统间移植。

机器码:它是一组被设计成可以由CPU直接执行的指令。如果你曾经玩过Assembly(谁没玩过呢?),你一定能很好的理解什么是机器码。对于没有兴趣玩assembly或者类似语言的极少数的你们来说,机器码是由编译器或者解释器产生的并且可以直接被CPU执行的代码。

JIT(Just In Time)编译器:Just in time编译技术是用来提升软件性能的一项技术。它的实现原理便是在执行期间编译存储在内存中字节码,JIT编译器导入这些字节码并且编译成所需要的部分。

通过应用这些技术所获得的性能和速度便能给HipHop及随后的HHVM提供核心优势。保持一个PHP代码库,同时实现性能上堪比编译过的应用程序。

目前的HHVM基本上支持整个的PHP5.4版本,然而HHVM仍然有妨碍到一些应用程序执行的许多bugs。基于这样的原因,Facebook公 司设置的目标便是能让开源的顶尖的前20个PHP应用程序运行在HHVM上。第一个运行在其上的最流行的应用便是Wordpress。

接下来

现在我们对于HHVM究竟是做什么的及其优势有了很好的了解,并且对于运行在其上的应用程序我们可以很方便的开始测试了。在接下来的文章里,我会介 绍到如何在虚拟机上安装HHVM,以及在你的应用程序上运行基准测试,最后(双手合十),介绍如何在HHVM上运行Magento。

更多文章请关注我的个人博客:http://www.nomoneynowife.com

HHVM简介(译)的更多相关文章

  1. 常用数据结构及复杂度 array、LinkedList、List、Stack、Queue、Dictionary、SortedDictionary、HashSet、SortedSet

    原文地址:http://www.cnblogs.com/gaochundong/p/data_structures_and_asymptotic_analysis.html  常用数据结构的时间复杂度 ...

  2. [转]swift 学习资源 大集合

    今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...

  3. PHP ~与各加速工具的性能对比~

    参与测试的加速器:Xcache,Opcache,hhvm   Xcache简介 前面已经介绍了PHP加速器的原理和功用(参见LAMP架构之PHP-FPM 服务器),xcache作为目前使用广泛的PHP ...

  4. 爬虫开发python工具包介绍 (1)

    本文来自网易云社区 作者:王涛 本文大纲: 简易介绍今天要讲解的两个爬虫开发的python库 详细介绍 requests库及函数中的各个参数 详细介绍 tornado 中的httpcilent的应用 ...

  5. 【译】Android系统简介—— Activity

    续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面( ...

  6. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  7. 现代3D图形编程学习-基础简介(2) (译)

    本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...

  8. 现代3D图形编程学习-基础简介(1) (译)

    本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...

  9. 【译】用jQuery 处理XML-- DOM(文本对象模型)简介

    用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...

随机推荐

  1. java中synchronized使用方法

    synchronized的一个简单样例 public class TextThread { /**  * @param args  */ public static void main(String[ ...

  2. OpenOffice的安装与启动2

    1.tar -zxvfApache_OpenOffice_4.1.0_Linux_x86-64_install-rpm_zh-CN.tar.gz  2.cd zh-CN  3.rpm -Uvh RPM ...

  3. SOAP web service用AFNetWorking实现请求

    问: This is my current call to (asmx) SOAP web service: NSString *soapMessage = [NSString stringWithF ...

  4. android94 样式和主题

    style.xml <resources xmlns:android="http://schemas.android.com/apk/res/android"> < ...

  5. c++ 数据持久层研究(一)

    C++ORM框架自动生成代码数据库  用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis ...

  6. C# - 转换

    无论什么类型 它们存储的其实都是一系列的位 在将A类型转换为B类型时 如果能完整转换 那么系统会将两个操作数自动进行隐式转换 但也有可能因为A类型的存储位数比B类型的存储位数大 那么B类型可能就没有足 ...

  7. Maven Build Profiles--reference

    What is Build Profile? A Build profile is a set of configuration values which can be used to set or ...

  8. 谈谈Javascript线程

          其实,大家都知道Javascript的语言执行环境是单线程的,浏览器无论在什么时候都有且只有一个线程在运行Javascript程序.那Ajax发送异步请求怎么解释,setTimeout/s ...

  9. dom4j中对xml的查增

    package dom; import java.io.FileWriter;import java.util.Iterator; import org.dom4j.Document;import o ...

  10. Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...