既然语言与实现无关,那么有没有一个编译器,可以把java编译成原生代码,而不是在jvm里面运行?

2012-09-18 11:28:33 +08:00
 skydiver
4501 次点击
所在节点    Java
18 条回复
bhuztez
2012-09-18 11:33:06 +08:00
gcj啊gcj
reus
2012-09-18 11:33:29 +08:00
gnu的GCJ貌似可以,搜java native compiler出来挺多的
skydiver
2012-09-18 11:36:38 +08:00
@bhuztez 原来是 GNU 出品。。。我out了。。
不过看官方网站,这个貌似09年之后就不更新了。。
fly2never
2012-09-18 11:38:48 +08:00
不知道能不能弄到llvm上去
bhuztez
2012-09-18 11:44:58 +08:00
@skydiver 只是有些新的语法不支持而已,那些都可以用ecj编译成class之后,再把class文件丢给gcj去编译。
skydiver
2012-09-18 11:56:03 +08:00
@bhuztez ecj是什么?
bhuztez
2012-09-18 12:26:01 +08:00
@skydiver Eclipse Compiler for Java
yuelang85
2012-09-18 12:30:28 +08:00
语言与实现无关这话到底是什么意思?

至少python和C同逻辑的实现就完全不一样,因为python原生支持更多更复杂的数据结构,而c只支持原始的那几个
Alex_L
2012-09-18 12:54:09 +08:00
@yuelang85 CPython解释器就是用C写的。语言与实现无关的意思是……严格来说,语言只包含语法层面上的东西(GC、闭包、反射等特性也是在这个层面,你说的数据结构也是在这个层面),而一门语言的编译器或解释器可以有不同实现方式。比如Python就有CPython、Jython,IronPython,PyPy等实现。
reus
2012-09-18 12:58:44 +08:00
@yuelang85 specification和implementation的区别……
yuelang85
2012-09-18 13:31:41 +08:00
@Alex_L 原来是这样,谢谢。


@reus 结合 @Alex_L ,貌似了解你在说啥了 \(V.V)/
yyfearth
2012-09-18 13:46:05 +08:00
有个比较麻烦的问题就是很多动态语言有动态特性需要运行时的支持,这样就不是简单的编译成静态的机器码就可以解决的,除非编译出来的代码自身带上这个运行时。
xuan_lengyue
2012-09-18 16:50:41 +08:00
gcj啊 巨慢无比
vicalloy
2012-09-18 17:50:22 +08:00
gcj有限制,并不是所以程序都可以编译。而且编译后也不会比sun的jdk快多少(编译了个简单的for循环程序,比sun jdk慢),可能会省些内存。
bhuztez
2012-09-18 18:23:21 +08:00
@vicalloy 没啥限制吧。连SWT程序都是可以编译的,没遇到啥问题,就是参数比较奇怪,折腾过一次后来就忘了,再也没想起来。for循环两个几乎是一样快的,估计是你gcj编译的时候没-O2吧
skydiver
2012-09-18 18:59:23 +08:00
@yyfearth 估计gcj也是这么干的,编译出的文件巨大。。
vicalloy
2012-09-18 20:07:52 +08:00
@bhuztez 你编译一个swing看看-_-。
应当加o2了,很早以前玩过具体不太记得了。
pppcat
2012-09-18 21:15:35 +08:00
因为jvm够快了。再编译字节码没有很多实际意义。jvm现在的性能瓶颈不在这里。

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

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

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

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

© 2021 V2EX