narcissus 试用

narcissus 是一个由 javascript 自身实现的 javascript 解释器,最终效果和 spidermonkey 引擎保持一致,足以证明 javascript 本身就是一个完备的元循环语言。

运行@shell

narcissus 可以跑在 spidermonkey shell 以及浏览器 spidermonkey 引擎环境下,经过修改也可运行于最新的 firefox 4.0,其他浏览器待测,首先说下如何在 mac 下的 spidermonkey shell 中运行:

安装 spidermonkey shell

1.安装 xcode

2.安装 MacPorts,mac 下一个不错的软件依赖管理工具

3.安装 autoconf213 (build spidermonkey 必须要这个版本),运行 sudo port install autoconf213 安装

4.下载 spidermonkey 源码,推荐 1.85,不推荐 1.70

5.进入 spidermonkey 源码目录 js/src ,先运行 autoconf213 ,再运行 make

6.最后在 js/src 目录下生成 js 可执行文件,大功告成,可执行 ./js 进入javascript解释器交互模式。

在 shell 中运行 narcissus

1.git clone 一分 nacissus 到本地目录 /code/narcissus

2.硬链接上一大步生成 js 可执行文件到 /code/narcissus : ln spidermonkey/js/src/js /code/narcissus

3.最后执行 ./njs python 脚本即可进入 narcissus 解释器的交互模式。

运行@browser

查看 njs python 脚本,可发现其实内部是通过调用spidermonkey shell 的 js 载入 narcissus 代码文件来启动 narcissus,具体执行命令实际为:

'/Users/yiminghe/code/javascript/narcissus/js', '-f', '/Users/yiminghe/code/javascript/narcissus/lib/jsdefs.js', '-f', '/Users/yiminghe/code/javascript/narcissus/lib/jslex.js', '-f', '/Users/yiminghe/code/javascript/narcissus/lib/jsparse.js', '-f', '/Users/yiminghe/code/javascript/narcissus/lib/jsdecomp.js', '-f', '/Users/yiminghe/code/javascript/narcissus/lib/jsresolve.js', '-f', '/Users/yiminghe/code/javascript/narcissus/lib/jsexec.js', '-e', 'Narcissus.interpreter.repl();'
 

其中载入了一些 narcissus 的代码文件,最后执行表达式:

Narcissus.interpreter.repl();

 进入了 narcissu 引擎的 repl 模式,该函数中定义在 jsexec.js,进行建立执行环境,解析语法树并执行的过程。

同时 jsexec.js 还提供了一个

Narcissus.interpreter.evaluate

函数,效果同 eval 一样,可直接执行 javascript 字符串,那么就可以不调用依赖 shell io 的 repl,而直接调用 evaluate,载入必要的引擎代码文件后,narcissus 就可以直接运行在浏览器上了:

narcissus @ firefox 4

要注意的是:firefox4 采用的 JägerMonkey 似乎和 spidermonkey 并不完全一致,例如不支持 let 语法,如果要运行在 firefox 4 中的话,需要将所有的 let 替换为 var。