欢迎来到天天文库
浏览记录
ID:20632176
大小:251.75 KB
页数:26页
时间:2018-10-14
《基于c语言的javascript引擎探索》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、基于C语言的JavaScript引擎探索简介:JavaScript语言具有动态性,支持函数式编程,动态弱类型等等优点。作为一个脚本语言,可以很方便的脚本化需要高度可定制的应用程序。本文介绍基于C语言的JavaScript引擎SpiderMonkey,详细讨论如何通过该引擎,使得C语言和JavaScript语言进行交互。标记本文!发布日期:2011年2月17日级别:初级访问情况9726次浏览建议:0(添加评论)禽食食禽食平均分(共10个评分)基础知识SpiderMonkey简介和其他的JavaScript引擎一样,S
2、piderMonkey不直接提供像DOM这样的对象,而是提供解析,执行JavaSccript代码,垃圾回收等机制。SpidlerMonkey是一个在Mozilla之下的幵源项目,要使用SpiderMonkey,需要下载其源码,然后编译为静态/动态库使用。要在自己的应用程序中使用SpiderMonkey,首先需要了解以下三个核心概念:运行时环境运行时环境是所存JavaScript变量,对象,脚本以及代码的上下文所存在的空间。每一个上下文对象,以及所有的对象均存在于此。一般应用仅需要一个运行时即可。上下文上下文即脚本执
3、行的环境,在SpiderMonkey中,上下文可以编译执行脚本,可以存取对象的属性,调用JavaScript的函数,转换类型,创建/维护对象等。儿乎所存的SpiderMonkey函数都需要上下文作为其第一个参数(JSContext)o上下文与线程密不可分,一般来讲,单线程应用可以使用一个上下文来完成所有的操作,每一个上下文每次只能完成一个操作,所有在多线程应用中,同一时刻只能有一个线程来使用上下文对象。一般而言,多线程应用中,每个线程对应一个上下文。全局对象全局对象包含JavaScript代码所用到的所有类,函数,
4、变量。在DOM操作中,我们使用的:alter(”something”);事实上使用的是全局变量window的一个属性alter(这个属性正好是一个函数),事实上上边的语句在执行时会别解释为:window-alter(”something");三者的关系如下图所示:1.引擎内部结构依赖关系安装SpiderMonkey首先从SpiderMonkey的代码砟中下载其源码包js-1.7.0.tar.gz本文在Linux环境下编译,SpiderMonkey的编译安装很容易:林解压缩tarxvzfjs-1-7.0-tar.gz
5、并切换至源码冃录cdjs-1-7.0/src#编译make-fMakefiIe.ref编译完成之后,会生成一个新的目录,这个目录的名称依赖于平台,比如在Linux下,名称为:Linux一AILDBG.OBJ,其中包含静态链接库libjs.a和动态链接库libjs.so等。本文后续的编译环境就需要依赖于我们此处编译出来的库文件。应该注意的是,此处编译出来的库文件包含对调试的支持,体积较大,在应用程序发布时,可以去掉这些调试支持,使用下列重新编译库:#创建非debug模式的库makeBUILD_0PT=1-fMakef
6、ile.refWindows及其他平台的编译此处不再赘述,读者可以自行参考SpiderMonkey的官方文档。JavaScript对象与C对象间的转换关系JavaScript是一门弱类型的语言,变量的值的类型在运行时才确定,而且可以在运行时被修改为其他类型的变量;而C语言,是一门静态类型的语言,变量类型在编译时就己经确定。因此,这两者之问变量的互访就存了一定的难度,SpiderMonkey提供了一个通用的数据类型jsval来完成两者之间的交互。事实上,在C代码中定义的jsval类型的变量可以是JavaScript中
7、的字符串,数字,对象,布尔值,以及null或者undefined。基于这个类型,SpiderMonkey提供丫大景的类型判断及类型转换的宏和函数。可以参看下表:表1.JavaScript对象与C对象转换表jsval常量jsval车JavaScriptjsval类型判断类型UndefinedJSVAL—IS一VOID(v)JSVAL一VOIDBooleanJSVAL_IS_BOOLEAN(v)JSVAL_TRUE,JSVAL—FALSE,BOOLEAN_TO_JSVAL(b)JSVAL_TO_BCnumberJSVA
8、L_IS_NUMBER(v),JSVALJSJNT(v),JSVAL_IS_DOUBLE(v)INT_TO_JSVAL(i),DOUBLE—TO—JSVAL(d)JSVAL_TO_INJSVAL_TO_D(stringJSVAL—IS一STRING(v)STRING_TO_JSVAL(s)JSVAL_TO_S1JS_GetStringCJS_GetStrin
此文档下载收益归作者所有