HHVM简介(译)
原文链接: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简介(译)的更多相关文章
- 常用数据结构及复杂度 array、LinkedList、List、Stack、Queue、Dictionary、SortedDictionary、HashSet、SortedSet
原文地址:http://www.cnblogs.com/gaochundong/p/data_structures_and_asymptotic_analysis.html 常用数据结构的时间复杂度 ...
- [转]swift 学习资源 大集合
今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 ...
- PHP ~与各加速工具的性能对比~
参与测试的加速器:Xcache,Opcache,hhvm Xcache简介 前面已经介绍了PHP加速器的原理和功用(参见LAMP架构之PHP-FPM 服务器),xcache作为目前使用广泛的PHP ...
- 爬虫开发python工具包介绍 (1)
本文来自网易云社区 作者:王涛 本文大纲: 简易介绍今天要讲解的两个爬虫开发的python库 详细介绍 requests库及函数中的各个参数 详细介绍 tornado 中的httpcilent的应用 ...
- 【译】Android系统简介—— Activity
续上一篇,继续介绍Android系统.上一篇: [译]Android系统简介 本文主要介绍构建Android应用的一些主要概念: Activity Activity是应用程序中一个单独的有UI的页面( ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 现代3D图形编程学习-基础简介(2) (译)
本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...
- 现代3D图形编程学习-基础简介(1) (译)
本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...
- 【译】用jQuery 处理XML-- DOM(文本对象模型)简介
用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...
随机推荐
- Rediss_基本介绍
Redis是典型的NoSQL数据库( Not Only SQL) NoSQL数据库: NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起, 传统的关系数据库在应付web2.0网站, 特 ...
- Effective Java:Ch4_Class:Item13_最小化类及其成员的可访问性
要区别一个模块是否设计良好,最重要的因素是,对于其他模块而言该模块隐藏其内部数据和其他实现细节的程度.设计良好的模块应该隐藏所有实现细节,将API与其实现清晰地隔离开来.这样,模块之间通过他们的API ...
- myeclipse中使用gradle开发项目
gradle可以直接使用maven的代码库,并且支持编程,可以说是maven的加强版.今天我们学习下,如何在MyEclipse下使用gradle开发项目.我们的开发环境:myeclipse 2015, ...
- 适用于cocos2dx的编辑器:Texture,Tilemap,Particle,Action,Level etc
原文:http://www.cocos2d-x.org/wiki/Editors_for_cocos2d-x_TextureTilemapParticleActionLevel_etc Action ...
- 在文件地理数据库中使用 SQL 进行报告和分析 (转)
================以下摘自ArcGIS10.1帮助=================== 文件地理数据库允许在 QueryDef 中通过 SubFields(字段列表)方法使用表达式和别 ...
- 字符的截取方法使用的是Substring 和三目运算符
substring(0,m.title.length>11?11:m.title.length)
- 文件处理-Directory类 (C#)
转http://skybirdzw.blog.163.com/blog/static/7257062620099751329403/ 文件处理-Directory类 (C#) Directory.Cr ...
- Android开发JDBC连接mysql数据库导入驱动方法
在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...
- Prepare a Nexus Maven private repository
1. port nat mapping #ssh VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port_5002 ...
- jedis应用实例
最近将redis整合到项目中,将redis作为cache使用,未来进一步作为消息推送使用.我通过jedis和spring配置实现操作redis. spring配置 <!-- redis配置 -- ...