基于jvm的编程语言
Java能不能像C语言不通过JVM虚拟机直接编译成二进制机器码,让计算机直接运行?
目前来说是不可能的,为什么要搞一个JVM 虚拟机?你应该回看一下这个JAVA的JVM诞生历史,当初搞一个虚拟机目的很简单,做为一个中间层向下与近硬件打交道,向上这是我们的程序层,屏蔽了向下的复杂性、兼容性等,提供一个跨平台windows、linux、Unix的基础平台,然后我们写代码就不需要考虑代码的移植问题。
你要直接机器码跳过JVM虚拟机层,那么不是又回到当初搞一个JVM的问题么?这样太折腾人了,不是不能做。
肯定是可以的,而且目前就有成熟的解决方案,不过,在回答这个问题之前,需要先明确一点,就是为什么J***a 需要JVM虚拟机?然后再来讨论可行的实现方案。
众所知周,J***a 是跨平台的,能够实现程序代码的“一次编译,到处运行”,无论在哪个操作系统上,J***a 代码都会被编译为统一的J***a 字节码文件,然后再交由JVM虚拟机来运行;J***a 程序员只要编写一套程序,便同时能在Linux,Windows和Mac x等不同操作系统上运行,JVM在其中扮演了一个不可或缺的重要角色。
不同操作系统的实现方式不一,各个操作操作都有自己的一套处理方式和规范,J***a 的跨平台功能就是基于不同操作系统实现不同JVM,在哪个操作系统上运行就调用哪个操作系统的JVM来运行J***a 程序。
正式由于JVM虚拟机的存在,J***a 跨平台才得以实现,也才会有那么多的企业、组织和开发者青睐J***a 语言,让J***a 语言二十多年来长盛不衰,更是有衍生了不少除J***a 之外的,基于JVM运行的优秀编程语言,比如:Kotlin、Scala、Groovy、Clojure、Ceylon等。
GCJ 是GNU Compiler for the J***a Programing Language 的简称,翻译过来就是“为J***a 语言实现的GNU编译器”,GCJ编译工具就包含在包含在GCC中,只要下载了GCC,就能使用GCJ。
使用GCJ编译工具可以把J***a 源程序编译为字节码文件,也能将J***a 字节码文件编译为本地机器码,更是能实现J***a 源程序直接编译为本机可运行的本地机器码。而本地机器码就可在本机直接运行。
各有各的优缺点,J***a目前很多人使用,就在于它的通用性好,可以跨平台直接移植,只要编译一次,不管你是什么操作系统,windows,mac,linux等等,只要有安装J***a虚拟机(JVM)就可以了。而且目前J***A整个生态圈比较完备,JDK和开发平台和工具也很多,开发的效率高,但是成也萧何败萧何,正因为JVM的存在,生成的机器码效率没有汇编和C的高。再说说C语言,本人上大学其实接触最早的就是C语言,目前的嵌入式系统中,C语言仍然是使用最广泛的语言。后来C语言发展而来的C++,目前也有大热的趋势,比如现在大热的深度学习开发平台tensorflow和pytorch,底层就是用C++开发的,因为C/C++的运行效率确实很高。给你张配图。
非常感谢有机会回答你的问题
不能的,原因要从J***a和c语言的特性去分析
1.C语言一样直接编译成了可执行程序,让计算机直接运行,但是其需要高度依赖编译链,不能跨平台,如果你有接触过嵌入式就懂了,一个开发板就对应一个编译链,必须用指定的编译链编译出来的可执行程序,才能跑起来的
2.
一次开发,一次编译,多平台执行,J***a语言最大的特点就是跨平台可移植,这一特性就是靠JVM(J***a虚拟机)实现的,编译一次,只要装有JVM的平台,都可以运行,比如window,Linux,Android等平台,如果改写编译器像C语言一样直接编译成了可执行程序,就失去了跨平台特性。从语言设计的角度看是可以的,重新设计一下编译器就能实现,但从工程实践的角度看是不可行的。
其一,J***a语言最大的特点就是跨平台可移植,一次开发,一次编译,多平台执行,这一特性就是靠JVM(J***a虚拟机)实现的,如果改写编译器像C语言一样直接编译成了可执行程序,就失去了跨平台特性。
其二,J***a语言设计之初就设计成为了一款严重依赖JRE(J***a运行时环境)的语言,有部分语言设计上的缺陷必须依赖JVM来解决,比如GC(垃圾回收),我们知道,J***a语言是没有内存回收能力的,因此还得靠JVM,在工程实践中,如果软件不能进行内存回收,后果将是灾难性的。
其三,J***a语言是面向对象的,区别于同是面向对象的C++,J***a还有一个动态特性。
它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一种成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。J***a从如下几方面***取措来解决这个问题。J***a编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将[_a***_]引用信息在字节码中保存下传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,一个在存储器生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定的。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。而这一切同样依赖JRE。
以上几点决定了J***a不能像C语言一样直接编译成机器码,当然,还有一些其它因素,但我认为上面几点是最主要的。
[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系邮箱:83115484@qq.com,我们会予以删除相关文章,保证您的权利。转载请注明出处:http://www.wnpsw.com/post/15418.html