能不能把java搞成编译型语言? 有没有人设计一种编译器直接把java源码编译为机器指令?

如题所述

1. java已经是编译型语言,因为不编译源程序是没法直接运行的。只不过java是编译成中间的二进制代码,不是最终的机器代码。

2.已经有这种编译器,免费的如gnu的gcj,收费的如Excelsior JET。不过没有太大必要使用,java在运行时也会把中间代码动态优化成本地机器代码,这种优化的结果一般会优于预先编译的结果,因为动态优化可以因地制宜,根据程序运行情况和计算机硬件的状况来动态选择优化策略。追问

gcj的所谓编译为本地代码是骗人的,不过是把jvm以静态库的形式link到程序里,一个hello world程序几十兆。我试过的。Excelsior JET貌似也类似,编译出来的exe文件的进程里仍然有jvm.dll

追答

可能是这样吧,毕竟就算是c,c++也是要用到运行时库来支持的,只不过绝大多数机器上都已装了这些运行时所以程序体积比较小,如果是纯静态编译的话体积也会很大。不过像hello world这样的程序确实java没有办法做到像c静态编译那样的小体积。因为c静态编译只需要把用到的部分编译进来,用得越少体积越小。Excelsior JET里面的jvm.dll我没研究,这里完全是个人臆测,jvm.dll就充当了c++运行时库的角色,jvm.dll本身里面的东西都是已经编译成本地代码的,跑在jvm.dll上面的java程序也是编译成本地代码的,也就是整个java程序不再采用动态优化方式,不然Excelsior JET是没法取得标称的那样的加速程度的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-21
1. 不能
2. JVM
java之所以强大的其中一个重要原因就是不直接编译成最终结果,这样借助JVM的环境,才能实现其跨平台的效果。其实JVM也是在解释Java而已。
第2个回答  2011-04-21
如果按照你的想法的话,那java与C++等语言就相差无几了,jave当初的设计理念是适应互联网的编程的需要,因为互联网上存在不同的机器,不但硬件不同,操作系统等也可能不同,如果使得某个针对互联网应用而编写的程序,尤其是web应用等应用一次编写,到处运行的理念。sun公司设计jave编程语言,当初设计构思是:在硬件和操作层用java虚拟机屏蔽各种不同体系的系统,java虚拟机是一个软件实现的统一指令的虚拟机器,并不是硬件意义上的机器,这种机器采用了通用指令,实现由源代码指令到机器指令上的映射,也就是说你编写java的源代码先被翻译成java虚拟机指令(即是.class文件),再由虚拟机执行,虚拟机执行可以看作将虚拟机指令转成相对应的机器指令,这样就实现了对不同系统细节上的屏蔽,基本上实现了一次编写,到处运行的梦想,但是即使这样,java在很多时候,在不同的平台上运行时候,源代码还是要修改的,不过要修改的幅度大为减少,是某种程度上的“通用”语言!!!
第3个回答  2011-04-21
不会有人这样做的。其一,当初开发Java语言的时候,肯定是一个团队,而不是一个人。其二,没有任何团队会做这么无聊的事情,这样又花时间,又没有任何的好处。
楼主,不要幻想了,既然你想要直接编译,就去搞C,C++,当然,搞汇编就更直接了,嘿嘿。可能你对Java最熟悉,或者没有学过C,C++之类的。在这里要给你一个建议:不同的语言,不同的优势和用途,不要在一棵树上吊死。
相似回答