上次我们介绍了node-jvm,一个很酷的Node.js上的JVM实现。它的代码比较直白,很容易理解。可惜的是它用CPS变换来实现每个opcode的handler。这种实现方式是编译器的常见做法。然而由于JavaScript没有尾递归优化,因此爆栈很容易发生。然后实现的细节上也有一点瑕疵,例如long
类型、checkcast
指令等。
Doppio是一个基于TypeScript实现的JVM,可以在Node.js和浏览器里直接运行。Doppio比node-jvm要完善许多。
你可以直接在浏览器里体验 Doppio。
安装
如果你想在本地安装的话,需要安装node >= 0.10
和wget
。
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 dev
或make 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
编译 SegmentFault
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。