用 C++ 实现了一个 jvm

2018-02-05 18:48:40 +08:00
 wind2412

wind jvm:一个 java 虚拟机( C++)

  1. 仅支持 Linux 以及 macOS 系统,因为底层用了各种操作系统函数,pthread,stat 啥的。我的机器是 mac,所以就不支持 Windows 了。然后呢,我们需要 boost 库。用 brew 安装和 apt-get 啥的,yum 啥的都行。mac 就是 brew install boost,然后 ubuntu 应该是 sudo apt-get install libboost-all-dev。
  2. 这样我们就有了 boost 支持了。于是我们应该去 Makefile 修改一下,因为我配置的是我机器的环境,而且没用 cmake。所以要手动修改,把我机器上的 boost 路径目录换成你的就可以了。比如如果是 mac 的话,把 ifeq 中的 $(CC) $(LINK_FLAGS) -L/usr/local/Cellar/boost/1.60.0_2/lib/ .... 里边的目录换成你自己的就行。如果是 linux,就把 else 中的 $(CC) $(LINK_FLAGS) -L/usr/lib/x86_64-linux-gnu/ 换成你自己的。不过如果是 ubuntu,八成不需要改,因为目录的版本无关。其他的 linux 就不知道了。
  3. 然后呢,你需要知道你的 jdk class 文件路径。mac 上,一般在 /Library/Java/JavaVirtualMachines/jdk1.8xxx.jdk/Contents/Home/jre/lib/ 下的 rt.jar 文件。如果是 linux,一般在 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ 下。配置到 config.xml 中相应位置就可以了。
  4. 于是应该就完事了。直接跑 make -j 8 啥的 8 线程编译就可以。当然如果你是虚拟机,虚拟内存没配置够的话就算了,直接跑 make -j 2 或者 make -j 3 这种就行了。
  5. 之后 bin 目录会出现 wind_jvm 这个 executable file。注意:一定要在 wind_jvm/ 目录运行 ./bin/wind_jvm Test1 这样的命令。因为内部我的 system lib path 是通过当前路径来获取的。如果不在 wind_jvm/ 目录下跑,就应该会报错。然后我给了十几个 TestX.java 文件,执行 make test 就能编译。有一个 Test7.java 是不行的。那个只有 debug version jvm 的工具才能编译。所以我编译好了直接放上去了。然后运行 ./bin/wind_jvm Test1 这种命令就好。不加 .class 后缀,参数必须有且仅有一个。
  6. 然后就可以玩了。不过只支持特定实现好的库,你要 socket 什么的都是没有的。不过日后实现看情况可以往上加,你也可以来 pull request 哦。
  7. 如果有 issue 请在 github 上上传 issue。^_^

注:后来清理了项目,把无用的中文注释全都清理掉了。如果想看到代码细节的各种中文注释,请看这个 commit: https://github.com/wind2412/wind_jvm/tree/9113cb1af484f082f76c1668de3ca970a9c957f1

7450 次点击
所在节点    Java
32 条回复
p64381
2018-02-05 18:56:51 +08:00
佩服大佬
owenliang
2018-02-05 19:00:10 +08:00
不明觉厉。
mio4kon
2018-02-05 19:01:08 +08:00
膜拜大佬
ChiangDi
2018-02-05 19:02:46 +08:00
大佬大佬
rails3
2018-02-05 19:03:52 +08:00
大佬您好
waruqi
2018-02-05 19:05:29 +08:00
赞。可以考虑下用 xmake 来维护项目构建哈。: )
wujunze
2018-02-05 19:08:14 +08:00
很赞 有没有在生产环境用过?
Cooky
2018-02-05 19:08:24 +08:00
膝盖给你
wind2412
2018-02-05 19:08:51 +08:00
@waruqi 谢谢建议~去学习一番 QAQ
wind2412
2018-02-05 19:10:35 +08:00
@wujunze 只是个人玩具项目而已,其实只是为了学习虚拟机原理而写的。和工业级别的没有可比性(
yhzwy
2018-02-05 19:31:41 +08:00
dtgio
2018-02-05 19:33:09 +08:00
Mark
maxco292
2018-02-05 19:51:47 +08:00
准备 fork 下来看代码
wweir
2018-02-05 19:55:00 +08:00
服 && 期待 JAVA 实现的版本
Sanko
2018-02-05 20:00:43 +08:00
orz
boywhp
2018-02-05 20:02:04 +08:00
简单翻看了一下, 确实只是一个玩具级别的, C++看着头大
neilp
2018-02-05 20:14:35 +08:00
膝盖.....
TangMonk
2018-02-05 20:22:14 +08:00
牛啊
Simontune
2018-02-05 20:52:19 +08:00
膜拜大佬
xrlin
2018-02-05 20:57:31 +08:00
给大佬递茶

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/428670

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX