版权声明:本文为博主原创文章。未经博主同意不得转载。

https://blog.csdn.net/wangyongxia921/article/details/28117155

 

一、对AVA的迷茫

 

曾经仅仅是一味的学习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源码——.CLASS文件字节码。是java的第一次编译。生成的这个.class文件就是能够到处执行的文件。

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


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

看完编译过程在这里说“到处执行”就毫不费力了。

由于第二次编译就是在JVM中执行的,也就是在不论什么一个装有“JVM”的操作系统中完毕的。

JAVA提供了各种不同平台上的虚拟机制。所以能够实现“到处”。

   

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lvbmd4aWE5MjE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" />

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

 

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

同一个程序。假设是解释执行的。那么它的执行速度通常比编译为可执行的机器代码的执行速度慢一些。

可是,对Java来说,二者的区别不太大。

下面是查到的解释:Java的字节码经过细致设计。非常easy便能使用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



JAVA的一次编译,到处执行,你知道多少?的更多相关文章

  1. java在cmd下编译和执行引用jar的类

    java编译和执行引用第三方jarcmd  1.将上面的ojdbc14.jar文件,与调用程序复制到系统D盘的根目录下,切记:因为调用程序在wym.database包下,所以需要将类其所在的包一起拷贝 ...

  2. 【Java编程】Java在dos窗口编译与执行的批处理

    最近在Java编程过程中,常用到dos窗口对程序进行编译与运行.但是不方便之处在于每次都要输入命令进入将要编译的程序的目录(其实也有简单的方法,在文章末尾给出).于是编写了一个配置文件,可以一次修改, ...

  3. 关于JAVA,特点,历史,编译式的语言&解释式的语言,什么是java?JDK?DOS?一次编译到处运行原理。

    1.java语言的特点: 简单的:面向对象的:跨平台(操作系统)的(一次编译,到处运行):高性能的: 2.类名的首字母大写,方法小写: 3.历史: java2(即java),为什么加个2呢?1998年 ...

  4. JVM(二),Java怎样实现一次编译到处运行(平台无关性)

    二.Java怎样实现一次编译到处运行(平台无关性) 1.java平台无关性原理 Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Jav ...

  5. 面试官:Java从编译到执行,发生了什么?

    面试官:今天从基础先问起吧,你是怎么理解Java是一门「跨平台」的语言,也就是「一次编译,到处运行的」? 候选者:很好理解啊,因为我们有JVM. 候选者:Java源代码会被编译为class文件,cla ...

  6. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  7. Java 代码编译和执行的整个过程

    Java 代码编译是由 Java 源码编译器来完成,流程图如下所示: Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示: Java 代码编译和执行的整个过程包含了以下三个重要的机制: ...

  8. 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类

    一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 pack ...

  9. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...

随机推荐

  1. elasticsearch java 索引操作

    1.添加maven依赖 <dependency> <groupId>org.elasticsearch</groupId> <artifactId>el ...

  2. Windows API 第20篇 SetVolumeMountPoint 设置卷挂载点参数错误

    函数原型:BOOL SetVolumeMountPoint(                                                   IN   LPCTSTR lpszVo ...

  3. windows API 第 18篇 FindFirstVolume FindNextVolume

    函数定义:Retrieves the name of a volume on a computer. FindFirstVolume is used to begin scanning the vol ...

  4. windwos API 第七篇 分离路径,组合路径 _splitpath _makepath

    函数原型: //Break a path name into components. void _splitpath( const char *path, char *drive, char *dir ...

  5. Python开发之MySQL安装

    MySQL下载安装后再安装破解版本的Navicat图形化数据库工具即可.   安装python后.再进行如下操作(也可以安装好虚拟环境virtualenv 或者增强工具pip install virt ...

  6. 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]

    主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是<Java Concurrency in Practice>,结合自己的理解和实际应用对锁机制进行一个小小的总结. 首先需要强调的一点 ...

  7. AppbarLayout的简单用法

    在许多App中看到, toolbar有收缩和扩展的效果, 例如:   appbar.gif 要实现这样的效果, 需要用到: CoordinatorLayout和AppbarLayout的配合, 以及实 ...

  8. i\'ll make a man out of you

    Let's get down to business To defeat the Huns Did they send me daughters When I asked for sons? You' ...

  9. Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和

    给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到叶子节点生成的所有 ...

  10. 支付宝单笔转账demo (改配置直接用)

    支付宝接口说明文档  https://docs.open.alipay.com/api_28/alipay.fund.trans.toaccount.transfer 需要注意的是:rsa的  公钥和 ...