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 就可以直接运行在浏览器上了:
要注意的是:firefox4 采用的 JägerMonkey 似乎和 spidermonkey 并不完全一致,例如不支持 let 语法,如果要运行在 firefox 4 中的话,需要将所有的 let 替换为 var。