V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
skydiver
V2EX  ›  Java

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

  •  
  •   skydiver · 2012-09-18 11:28:33 +08:00 · 4551 次点击
    这是一个创建于 4448 天前的主题,其中的信息可能已经有所发展或是发生改变。
    18 条回复    1970-01-01 08:00:00 +08:00
    bhuztez
        1
    bhuztez  
       2012-09-18 11:33:06 +08:00
    gcj啊gcj
    reus
        2
    reus  
       2012-09-18 11:33:29 +08:00
    gnu的GCJ貌似可以,搜java native compiler出来挺多的
    skydiver
        3
    skydiver  
    OP
       2012-09-18 11:36:38 +08:00
    @bhuztez 原来是 GNU 出品。。。我out了。。
    不过看官方网站,这个貌似09年之后就不更新了。。
    fly2never
        4
    fly2never  
       2012-09-18 11:38:48 +08:00
    不知道能不能弄到llvm上去
    bhuztez
        5
    bhuztez  
       2012-09-18 11:44:58 +08:00
    @skydiver 只是有些新的语法不支持而已,那些都可以用ecj编译成class之后,再把class文件丢给gcj去编译。
    skydiver
        6
    skydiver  
    OP
       2012-09-18 11:56:03 +08:00
    @bhuztez ecj是什么?
    bhuztez
        7
    bhuztez  
       2012-09-18 12:26:01 +08:00
    @skydiver Eclipse Compiler for Java
    yuelang85
        8
    yuelang85  
       2012-09-18 12:30:28 +08:00
    语言与实现无关这话到底是什么意思?

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


    @reus 结合 @Alex_L ,貌似了解你在说啥了 \(V.V)/
    yyfearth
        12
    yyfearth  
       2012-09-18 13:46:05 +08:00
    有个比较麻烦的问题就是很多动态语言有动态特性需要运行时的支持,这样就不是简单的编译成静态的机器码就可以解决的,除非编译出来的代码自身带上这个运行时。
    xuan_lengyue
        13
    xuan_lengyue  
       2012-09-18 16:50:41 +08:00
    gcj啊 巨慢无比
    vicalloy
        14
    vicalloy  
       2012-09-18 17:50:22 +08:00
    gcj有限制,并不是所以程序都可以编译。而且编译后也不会比sun的jdk快多少(编译了个简单的for循环程序,比sun jdk慢),可能会省些内存。
    bhuztez
        15
    bhuztez  
       2012-09-18 18:23:21 +08:00
    @vicalloy 没啥限制吧。连SWT程序都是可以编译的,没遇到啥问题,就是参数比较奇怪,折腾过一次后来就忘了,再也没想起来。for循环两个几乎是一样快的,估计是你gcj编译的时候没-O2吧
    skydiver
        16
    skydiver  
    OP
       2012-09-18 18:59:23 +08:00
    @yyfearth 估计gcj也是这么干的,编译出的文件巨大。。
    vicalloy
        17
    vicalloy  
       2012-09-18 20:07:52 +08:00
    @bhuztez 你编译一个swing看看-_-。
    应当加o2了,很早以前玩过具体不太记得了。
    pppcat
        18
    pppcat  
       2012-09-18 21:15:35 +08:00
    因为jvm够快了。再编译字节码没有很多实际意义。jvm现在的性能瓶颈不在这里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5360 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:56 · PVG 15:56 · LAX 23:56 · JFK 02:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.