大家好,今天小编关注到一个比较有意思的话题,就是关于Java和C语言一样的问题,于是小编就整理了1个相关介绍JAVA和C语言一样的解答,让我们一起看看吧。
Java能不能像C语言不通过JVM虚拟机直接编译成二进制机器码,让计算机直接?
目前来说是不可能的,为什么要搞一个JVM 虚拟机?你应该回看一下这个JAVA的JVM诞生历史,当初搞一个虚拟机目的很简单,做为一个中间层向下与近硬件打交道,向上这是我们的程序层,屏蔽了向下的复杂性、兼容性等,提供一个跨平台Windows、Linux、Unix的基础平台,然后我们写代码就不需要考虑代码的移植问题。
你要直接机器码跳过JVM虚拟机层,那么不是又回到当初搞一个JVM的问题么?这样太折腾人了,不是不能做。
肯定是可以的,而且目前就有成熟的解决方案,不过,在回答这个问题之前,需要先明确一点,就是为什么Java 需要JVM虚拟机?然后再来讨论可行的实现方案。
众所知周,Java 是跨平台的,能够实现程序代码的“一次编译,到处运行”,无论在哪个操作系统上,Java 代码都会被编译为统一的Java 字节码文件,然后再交由JVM虚拟机来运行;Java 程序员只要编写一套程序,便同时能在Linux,Windows和Mac x等不同操作系统上运行,JVM在其中扮演了一个不可或缺的重要角色。
不同操作系统的实现方式不一,各个操作操作都有自己的一套处理方式和规范,Java 的跨平台功能就是基于不同操作系统实现不同JVM,在哪个操作系统上运行就调用哪个操作系统的JVM来运行Java 程序。
正式由于JVM虚拟机的存在,Java 跨平台才得以实现,也才会有那么多的企业、组织和开发者青睐Java 语言,让Java 语言二十多年来长盛不衰,更是有衍生了不少除Java 之外的,基于JVM运行的优秀编程语言,比如:Kotlin、Scala、Groovy、Clojure、Ceylon等。
GCJ 是GNU Compiler for the Java Programing Language 的简称,翻译过来就是“为Java 语言实现的GNU编译器”,GCJ编译工具就包含在包含在GCC中,只要下载了GCC,就能使用GCJ。
使用GCJ编译工具可以把Java 源程序编译为字节码文件,也能将Java 字节码文件编译为本地机器码,更是能实现Java 源程序直接编译为本机可运行的本地机器码。而本地机器码就可在本机直接运行。
从语言设计的角度看是可以的,重新设计一下编译器就能实现,但从工程实践的角度看是不可行的。
其一,Java语言最大的特点就是跨平台可移植,一次开发,一次编译,多平台执行,这一特性就是靠JVM(Java虚拟机)实现的,如果改写编译器像C语言一样直接编译成了可执行程序,就失去了跨平台特性。
其二,Java语言设计之初就设计成为了一款严重依赖JRE(Java运行时环境)的语言,有部分语言设计上的缺陷必须依赖JVM来解决,比如GC(垃圾回收),我们知道,Java语言是没有内存回收能力的,因此还得靠JVM,在工程实践中,如果软件不能进行内存回收,后果将是灾难性的。
其三,Java语言是面向对象的,区别于同是面向对象的C++,Java还有一个动态特性。
它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一种成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从如下几方面采取措来解决这个问题。Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,一个在存储器生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定的。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。而这一切同样依赖JRE。
以上几点决定了Java不能像C语言一样直接编译成机器码,当然,还有一些其它因素,但我认为上面几点是最主要的。
到此,以上就是小编对于Java和C语言一样的问题就介绍到这了,希望介绍关于Java和C语言一样的1点解答对大家有用。