[发明专利]一种在JavaScript脚本语言中预生成机器码指令的方法和装置有效
申请号: | 201210379940.7 | 申请日: | 2012-10-09 |
公开(公告)号: | CN103077011A | 公开(公告)日: | 2013-05-01 |
发明(设计)人: | 张振龙 | 申请(专利权)人: | 华为技术有限公司 |
主分类号: | G06F9/44 | 分类号: | G06F9/44 |
代理公司: | 北京中博世达专利商标代理有限公司 11274 | 代理人: | 申健 |
地址: | 518129 广东*** | 国省代码: | 广东;44 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 javascript 脚本语言 生成 机器码 指令 方法 装置 | ||
技术领域
本发明涉及动态语言编译领域,特别涉及一种在JavaScript脚本语言中预生成机器码指令的方法和装置。
背景技术
JS(JavaScript)是一种可以嵌入Web页面中的基于对象和事件驱动的解释性的脚本语言。主要在Web浏览器上解释执行,可以使网页有动态的效果(如:图片、文字的滚动;层的动态切换,显示及隐藏;对HTML(HypertextMarkup Language,超文本标记语言)元素的操作);可以进行表单的输入验证(如:邮箱、电话、邮编的合法性,输入内容长度及内容验证等)。
当Web浏览器进行JS引擎操作时,会从网上下载JavaScript脚本,然后根据脚本中的源程序进行解析生成语法树,根据语法树生成中间代码即字节码,根据中间代码生成机器码,最后运行机器码。中间代码到机器码生成的步骤包括:
1申请128字节的连续内存空间,此内存空间称为buffer,用来存放机器代码。
2解析中间代码,生成对应的机器码指令,其中每条中间代码可以生成多条机器码指令。
3计算机器码指令的长度为code_length,确定buffer中是否有code_length的空间。
4如果buffer中仍然有code_length的空间,将机器码指令保存到buffer中。
5如果buffer中之前所申请的内存空间不足,将会重新进行申请buffer_length+buffer_length/2的内存空间,即192字节的内存空间。
6将当前buffer的内容拷贝到新申请的buffer中。
7回到上面第2步,继续进行下一条机器码指令的内存申请以及计算机器码指令长度的动作,并确定是否需要重新申请内存并且保存该机器代码。
在实现上述根据中间代码生成机器码的过程中,发明人发现现有技术中存在两个缺陷:一方面,如果两条中间代码的指令类型相同,那么其生成的 机器码指令会出现对相同的机器码指令的重复生成动作,效率不高。另一方面,一条中间代码可能生成很多条机器码指令,这样当申请的内存空间不足时会导致进行若干次重新申请指令存储空间的动作,并且需要拷贝旧的指令存储空间的内容到新的指令存储空间,导致耗时较高。
发明内容
本发明的实施例提供一种在JavaScript脚本语言中预生成机器码指令的方法和装置,以简化机器码指令的生成过程,提高机器码指令的生成效率,减少耗时。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,提供了一种在JavaScript脚本语言中预生成机器码指令的方法,包括:
获取JavaScript脚本的中间代码;所述中间代码通过对JavaScript脚本的源程序解析得到;
从机器码模板中查询与所述中间代码对应的机器码指令的指令总长度,并申请能容纳所述机器码指令的指令存储空间;所述指令存储空间用于保存所述中间代码对应的机器码指令;所述机器码模板包含有所述机器码指令和所述机器码指令的指令总长度;
将所述中间代码对应的机器码指令复制到所述指令存储空间;
根据所述中间代码中的立即数和/或伪寄存器,对与伪寄存器和立即数信息相关的机器码指令进行修改;所述与伪寄存器和立即数信息相关的机器码指令,包含在复制到所述指令存储空间的、与所述中间代码对应的机器码指令中;
继续执行上述将所述中间代码对应的机器码模板中的机器码指令复制到所述指令存储空间,以及更改与伪寄存器和立即数信息相关的机器码指令的动作,直至生成所有中间代码对应的机器码指令。
在第一方面的第一种可能的实现方式中,所述机器码模板还包含:需要修改的机器码指令偏移地址,所述方法还包括:
根据所述中间代码中的立即数和/或伪寄存器,以及所述当前中间代码对应的机器码模板中的需要修改的机器码指令偏移地址,更改与伪寄存器和立即数信息相关的机器码指令。
在第一方面的第二种可能的实现方式中,所述根据所述中间代码中的立即数和/或伪寄存器,对与伪寄存器和立即数信息相关的机器码 指令进行修改,具体包括:
获取所述中间代码的操作数以及目标寄存器;所述操作数包括伪寄存器或立即数,所述目标寄存器包括伪寄存器;
将所述机器码指令中的伪寄存器修改为所述中间代码的伪寄存器;和/或
将所述机器码指令中的立即数修改为所述中间代码的立即数。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华为技术有限公司,未经华为技术有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201210379940.7/2.html,转载请声明来源钻瓜专利网。