上次我们介绍了node-jvm,一个很酷的Node.js上的JVM实现。它的代码比较直白,很容易理解。可惜的是它用CPS变换来实现每个opcode的handler。这种实现方式是编译器的常见做法。然而由于JavaScript没有尾递归优化,因此爆栈很容易发生。然后实现的细节上也有一点瑕疵,例如long类型、checkcast指令等。

Doppio是一个基于TypeScript实现的JVM,可以在Node.js和浏览器里直接运行。Doppio比node-jvm要完善许多。

doppio

你可以直接在浏览器里体验 Doppio

安装

如果你想在本地安装的话,需要安装node >= 0.10wget

git clone https://github.com/int3/doppio.git
cd doppio
tools/setup.sh
make

使用

在本地运行服务器:

make dev
tools/server.coffee --dev

以上使用dev版,如果你打算使用release版,则使用:

make release
tools/server.coffee --release

然后通过 http://localhost:8000/ 访问

如果你想在浏览器里包含自己的代码,可以把.class文件放在classes/目录下,然后再次运行make devmake release

目前Doppio还不支持从JARs中加载类文件,以后会增加支持。目前需要先解压缩JAR。

终端下一样可以使用:

make dev-cli
node build/dev-cli/console/disassembler.js classes/demo/Fib
# doppio-dev -> node build/dev/console/runner.js
./doppio-dev classes/demo/Fib
./doppio-dev classes/demo/Fib 7        # 向JVM传递参数
./doppio-dev -jar my_application.jar   # 解压缩并运行JAR

使用make release-cli构建程序的优化版本,生成的代码可以在build/release-cli中找到。使用./doppio可以调用运行时环境。

测试

运行所有测试

make test -j4

运行特定测试

sh node build/dev-cli/console/test_runner.js -h node build/dev-cli/console/test_runner.js classes/test/Strings

Doppio项目主页


编译 SegmentFault


weakish
24.6k 声望844 粉丝

a vigorously lazy deadbeat with matured immaturity