Java为什么可以一次编写,到处运行?

一、对JAVA的迷茫
 

以前只是一味的学习VB,.NET,c#。现在轮到学习java了。迷惑了?书上说:JAVA是一种跨平台语言,最大的优势就是它实现了,一次编译,到处运行的机制。这是什么?跟平台无关?我以前做的VB,.NET,c#程序也没有考虑过平台呀?

学过编译原理的同学或许都知道“语言处理程序”,其实就是编译器。java的“一次编译,到处运行”就跟这个编译器有关。

在具体说之前,我们先要理清楚几个概念,以及它们之间的关系。

 

1、编写阶段——程序设计语言

VB,.NET,c#,java等都是程序设计语言,这个不用多说。

 

2、编译阶段——程序处理语言 

程序处理语言包含编译器,解释器。它的作用就是把程序设计语言翻译成目标语言。

以上两者的关系就是“语言”和“翻译者”的关系。在使用语言时,我们只能说,使用这种语言去书写一段程序。编译器则是能够将某种语言的源程序进行翻译,然后生成目标程序。

不同的设计语言有不同的编译器。我们通常会说,某个编译器支持了什么语言,正如一个翻译者只懂翻译英语,法语,但是不会日语,所以翻译不了日语一样,这个编译器只识别能识别得语言并翻译这种语言。

 

3、运行,调试阶段——集成开发环境(IDE)

在程序的运行阶段则是在一个特定的平台上,由这个平台来执行编译生成的程序。编译器的作用就是沟通源程序和程序的运行平台。源程序相对于一个运行平台来说是不可识别的,但当编译器将源程序编译成为这个平台所能够识别的目标语言以后,程序就可以在这个平台上运行了。Java虚拟机是一个平台,DOS 和 Windows 也是平台。 

看来以上三个概念,就明了了,为什么我们编写程序的时候,我们甚至可以只用一个简单的记事本就可以搞定,但是要运行的时候,就需要在“vs”或者“vb”等IDE中进行了。 

那么我们进入正题,JAVA的特殊在哪?

二、一次编译,到处运行 

上面三个概念中已经指出了程序从源代码到运行的三个必经阶段:编码——编译——运行,调试。

所有的高级语言都需要进过这三个阶段。

本身JAVA语言的最大特点是面向对象,跟今天的主题无关,不做介绍。JAVA的特殊特殊在哪里?——在编译阶段。 

1、一次编译是宏观的一次编译。

我们来看一下JAVA的编译过程:

    Java为什么可以一次编写,到处运行?_第1张图片

分解过程:

第一步:Java源代码——.CLASS文件字节码,是java的第一次编译。生成的这个.class文件就是可以到处运行的文件。

Java为什么可以一次编写,到处运行?_第2张图片

第二步:Java字节码——到目标机器代码;执行是由JVM执行引擎来完成,JAVA的第二次编译。

Java为什么可以一次编写,到处运行?_第3张图片

2、到处运行的隐含条件——这里的“到处”的前提是“装有JVM”。 

看完编译过程在这里说“到处运行”就毫不费力了。因为第二次编译就是在JVM中执行的,也就是在任何一个装有“JVM”的操作系统中完成的。JAVA提供了各种不同平台上的虚拟机制,所以可以实现“到处”。

    Java为什么可以一次编写,到处运行?_第4张图片

注意:java并不是编译机制,而是解释机制。 

看过了JAVA的两次编译,不要以为JAVA是编译机制,在java中有第一次编译,还有第二次解释来适应不同平台;根据不同的平台进行解释执行。在JVM中的第二次编译过程中(从字节码向机器码转换过程中)真正采用的是“解释”机制。即翻译一句,执行一句,不产生整个的机器代码程序。翻译过程如果不出现错误,就一直进行到完毕,否则将在错误处停止执行。

同一个程序,如果是解释执行的,那么它的运行速度通常比编译为可执行的机器代码的运行速度慢一些。但是,对Java来说,二者的差别不太大。

以下是查到的解释:Java的字节码经过仔细设计,很容易便能使用JIT 即时编译方式 编译技术将字节码直接转化成高性能的本地机器码,Sun 公司在 Java 2发行版中提供了这样一个字节码编译器——JIT(Just InTime),它是Java虚拟机的一部分。Java运行系统在提供JIT的同时仍具有平台独立性,因而“高效且跨平台”对Java来说不再矛盾。如果把 Java的程序比做“汉语”的话,字节码就相当于“世界语”,世界语不和具体的“国家”关,只要这个“国家”提供了“翻译”,就可以再快速地把世界语翻译成本地语言。 

三、总结

1、JAVA有这么的强大的特点,不是仅仅指的是“狭义”的JAVA程序设计语言,而是整个JAVA体制,从编译器开始发生改革。所以平时我们所说的JAVA特点是一种广义上的JAVA。开始,迷惑的我,是不清楚这些IDE,这些编译器,这些开发环境(jdk),运行环境(jre)都被融合在一起,放在了一个继承环境中(IDE)。这本是一个很好的开发,运行,调试的一条龙服务,可是缺让我想当然的把程序设计语言,编译器,等这些单独的工具给模糊了。只是一味的再使用,却不知道,这些东西的底层确实这般联系。

2、这篇文章中的编译知识,可以更好的理解,也是得益于软考中学习的“编译原理”。不得不说,知识环环相扣。

博客推荐:http://blog.csdn.net/cutesource/article/details/5904542
 ———————————————— 
版权声明:本文为CSDN博主「_Cassie」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangyongxia921/article/details/28117155

你可能感兴趣的:(Java为什么可以一次编写,到处运行?)