日期:2014-05-16  浏览次数:20376 次

功能强大的JavaScript引擎--SpiderMonkey与实现

JavaScript是由Netscape开发的对象脚本语言,其特点是开发简单、功能灵活,目前已广泛应用于WEB页面及服务器应用程序中。HTML本身是静态的、不允许用户干预,但用JavaScript编写的脚本程序就可以在用户的浏览器端运行,可以同用户进行交互,从而实现动态页面。可以将JavaScript与嵌入WEB的大多数对象的事件(如鼠标点击、移动等)相关联,然后用自己的方式处理这些事件。JavaScript提供了丰富的内置函数及命令,能在浏览器中显示HTML、数值计算、多媒体播放、超级链接以及简单的交互窗口等,还可以使在浏览器中运行的小Java应用程序的性质改变从而很容易地改变控件或其它对象的行为而不必深入研究其本身的结构。

JavaScript虽然是为Internet而开发的,但它的应用却不仅仅局限于Internet,事实上由于其面向对象的特性使得其适用范围非常广泛,只要我们的应用程序具有良好的对象机制,我们就可以借用JavaScript,从而实现很好的交互功能。

SpiderMonkey是由C语言操作的JavaScript引擎,它支持JS1.4和ECMAScript-262规范。该引擎分析、编译和执行脚本,根据JS数据类型和对象的需要进行内存分配及释放操作。利用该引擎可以让你的应用程序具有解释JavaScript脚本的能力,目前已有若干个项目都采用了SpiderMonkey引擎,像K-3D、WebCrossing、WebMerger等。K-3D是用C++实现的3D建模与仿真系统,该系统内嵌SpiderMonkey引擎来提供自定义脚本(用户创建脚本生成像齿轮一样具有重复特性的复杂形体),也可用来驱动交互式的教学系统(用户可以使用一段JS脚本程序记录其交互过程,如移动鼠标、选择菜单、点击鼠标等)。WebCrossing利用SpiderMonkey实现了服务器端的脚本环境,提供了完全的Web-server脚本环境,服务器端的实现允许你在内置的、面向对象的数据库中创建永久对象,这样即可根据自己的需要扩展服务器环境。

下面简要介绍在自己的应用程序中如何使用SpiderMonkey,最后给出一个简单的例子程序。

如何使用引擎

JS引擎一般作为共享库使用,应用程序调用引擎提供的API函数。引擎API函数大致分为以下几种:数据类型操作、RunTime控制、类与对象的创建和维护、函数与脚本执行、字符串操作、错误处理、安全控制、Debug支持。 一般情况下,在你的应用程序中只需使用某几类函数。例如,在进行JS调用之前你必须调用JS_NewRuntime函数来创建并初始化JS引擎。有些类型的函数,象安全控制类,提供可选择的特征。

从概念上讲,JS引擎是你系统上的一个共享资源。通过将引擎API调用嵌入到应用程序中(包含jsapi.h文件),你可以请求JS引擎进行操作。接下来,引擎处理你的请求,并将结果或状态信息返回给你的应用程序。

例如,假定你在使用JS引擎自动化应用程序,脚本应用程序鉴别用户并设置权限。首先,应用程序创建JS对象,该对象描述用户信息,包括姓名、ID、权限和可用的函数列表。在这种情况下,应用程序首先调用JS_NewObject创建对象。当JS引擎创建对象后,返回一个指针给应用程序。应用程序再调用JS引擎执行脚本。在创建用户对象后,应用程序即刻传递脚本给JS_EvaluateScript以便编译和运行。脚本或许取得并效验用户信息,然后建立用户存取的权利。

JS引擎收到初始化请求后,给JS RunTime分配内存,应用程序使用的变量、对象和上下文(上下文)都保存在RunTime中。一个上下文是脚本的执行状态(JS引擎使用的)。每个同时存在的脚本或线程都必须有自己的上下文。单个的JS RunTime可以包含多个上下文、对象和变量。 几乎所有的JS引擎调用都需要一个上下文变量,应用程序在创建RunTime后,首先应调用至少一次JS_NewContext来创建一个上下文。上下文的实际数量依赖于程序中同时使用的脚本数。程序中每个同时存在的脚本都需要一个上下文。另一方面,如果某个时刻只有一个脚本编译和运行,那么你只需一个上下文给每个脚本重复使用即可。