JavaSE0002_Java编程语言运行机制

JavaSE_02_Java编程语言运行机制


1.Java编程语言独特的运行机制 


计算机高级编程语言,按照程序执行的方式来分的话,主要分为两大类型:编译型语言和解释型语言。

1.编译型:

编译型语言是指使用专门的编译器、针对特定平台(操作系统)将某种高级语言源程序一次性“翻译”成可被该平台硬件运行的机器码(包括指令和操作数),并包装成该平台的操作系统所能识别和运行的格式。这一过程称为“编译”。最后生成的程序(可执行文件)可以脱离开发环境在特定平台上独立执行。我们常见的Windows系统中的可执行文件(以.exe为后缀的文件)都是使用编译型高级程序语言进行编写的。有时编译过程结束之后,还可能需要对其它编译好的目标代码模块进行链接,即组装两个以上的目标代码模块生成最终的可执行文件,以实现较低层次上的代码重用。通过这样的方式,就可以在已有代码的基础上进行软件开发,提高了最终开发程序的效率和稳定性。编译型高级语言的程序执行时效率较高,因为它被针对特定的平台一次性编译成机器码、且可以脱离开发环境而独立运行。但编译后生成的目标码文件也就无法再移植到不同的平台上,如要移植则必须修改源程序,或至少针对不同的平台,采用不同的编译器进行重新编译(比如大家都非常熟悉的QQ,就必须针对不同的操作系统,开发不同的客户端版本)。现有的大多数高级语言,如FORTRAN、C、C++、Pascal、LISP等都是编译型的。

2.解释型

解释型语言是指使用专门的解释器,将某种高级语言源程序逐条指令的解释成特定平台的机器码指令,并立即执行,解释一句执行一句,这类似于会场中的“同声翻译”,而不进行整体性的编译和链接处理。解释型语言相当于把编译型语言相对独立的编译和执行过程混合到一起,而且每一次执行时都要重复进行“解释”,因而执行的效率较低。且不能脱离解释器独自执行。但只要针对不同平台提供相应的解释器,就能方便的实现源程序级的移植,但这是以牺牲程序的执行效率为代价。比如现在最流行的互联网开发语言php、ruby、Python等,都是解释型语言。它们大都开发效率高于编译型语言,且在更换系统平台时基本不需要进行源代码的修改,就可以正常运行,非常适合互联网软件系统的要求,在当前互联网大热的时代,大行其道。


计算机编程语言发展到现在,已经从最初的机器语言(计算机唯一能够识别的由01组成的代码),经历了汇编、c、C++的由低级到高级的发展(这里的低级高级并不是我们通常意义上的高下之分,而是根据计算机编程语言距离计算机硬件的“距离”而言的),计算机编程语言逐渐的向人类的自然语言靠拢,离机器语言越来越远。但是计算机硬件终究只能识别机器语言,这样,如何让计算机能够识别高级编程语言编写的代码,就成了需要首先解决的问题。


这个问题与不同语言之间的人们如何交流类似。比如程序员使用高级程序语言编程,就像是中国人使用汉语一样。而不同的操作系统是不懂高级程序语言的,比如Windows就像是美国人,只懂英语;Linux是俄罗斯人,只懂俄语。如果我们直接把高级程序语言代码交给操作系统,就像是把一本中文书直接交个美国人或俄国人,它们根本看不懂,当然也就不会按照代码里面的要求去执行计算机指令了。这个时候,就需要对这本中文书进行翻译了。编译型与解释型就像是使用两种不同的翻译方式,让不懂中文的读者来读懂代码。

编译型语言是这么做的,编译器就像是一个译者,首先拿到了原文,然后开始进行翻译,直到全部翻译完成之后,在将译本交给读者,这个时候读者自然能使用自己的母语来读了。当然译本只是另外一种语言,比如英语。如果这时候换了另外一种语言,比如俄语的读者,就必须重新换个俄语翻译者,然后将原文翻译为俄语的译本,这样俄语的读者才能读懂。但是如果翻译完毕后,翻译的译本就可以给所有的英语或者俄语读者来读了,不需要译者进行重复的劳动。但是如果这个时候,原文进行重新编订修改,译本就和原版不同步了,这个时候读者拿到的译本就和原本有了出入,需要译者重新进行翻译,读者得等待新的译本。这就是编译型语言的优缺点举例。


那么解释型语言呢,就像前面说的,需要解释器,就像是同声传译。读者不懂汉语,没关系,找一个专业的同声传译,坐在读者旁边,逐字逐句的翻译给读者听。如果这个时候原本发生了变化,只要将原本交给译者,直接翻译给读者的就是最新版本,或者又来了一个俄语读者,那么只要找个俄语同声传译(找个俄语的解释器),同声传译就行了,读者不需要进行等待,这点相比编译型是有优势的。但是它的缺点也很明显,同声传译给这个读者翻译完了,又来了一个新的读者,即使译者刚刚给一个英语读者翻译完,来的还是一个英语读者,译者还得重复一次,这个就是解释型语言的缺点,效率是比较低的。每次都得重复一次译者劳动。所以一般来说,程序的编译效率和执行效率存在互斥关系、此消则彼长、难以同时达到最优。

那么Java是怎么做的呢?它是编译型语言呢,还是解释型语言?

答案是:都不是。

Java的独特的运行机制,在当时看来也算是一个创新,即使是现在,主流计算机编程语言中,也只有.Net平台采用了类似的机制,并且实现的效果也不如Java。那么Java的运行机制独特在哪里呢?它是解释型与编译型结合型的。如何结合的?下面来详细说明一下。

首先,Java的源代码在编写好之后,先采用通用的Java编译器对源代码进行编译,但是编译的结果并不是针对某一种具体的操作系统平台,比如C语言针对Windows平台编译好的exe可执行文件,而是一种叫做字节码的文件。字节码的文件内容相对于高级程序语言的源代码来说,更接近计算机机器语言,但是它并不是真正的编译好的机器语言,而仍然是与平台无关的,编译的结果针对的是一种称之为Java虚拟机(JVM—-Java Virtual Machine)的虚拟计算机技术。

JVM按照统一的标准来读取分析字节码文件,然后就像是解释型语言的解释器一样,将字节码指令翻译为具体的某操作系统平台的机器指令,然后去执行指令。

虽然JVM也是解释执行的,当相比于解释型语言,它不是直接解释执行源代码,而是经过处理后的字节码文件,将字节码文件解释为该JVM针对的特定平台的机器指令。这样解释执行的效率要远高于其他解释型语言(比如最常见的web开发,Jsp的运行效率是php的10倍以上)。并且JVM解释字节码的标准都是一样的,这样Java源代码就不需要针对不同的JVM(或者操作系统平台)重新进行编译或者改写,实现了像解释型语言那样,非常容易的实现了跨平台运行。

通过这种结合型的运行机制,Java既实现了跨平台运行,同时还是高效的跨平台运行。
这样看来,JVM在Java独特的运行机制中,起着举足轻重的作用,我们下一篇内容就来详细讲解JVM——Java虚拟机。


2.Java语言运行机制基础——JVM 


Java引进Java虚拟机技术,针对不同的平台,完全由软件模拟或由软件和硬件共同模拟,实现一台虚拟的计算机。在Java中引入了虚拟机的概念,即在机器和编译器之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译器一个共同的接口。编译器只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来执行。在一些JVM实现中,还可能会将虚拟机代码转换为特定系统的机器码执行,以提高执行的效率。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器, 解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 


可以说,Java虚拟机是Java语言的基础。它是Java技术的重要组成部分。Java虚拟机是一个抽象的计算机,和实际的计算机一样,它具有一个指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。Java解释器负责将字节代码翻译成特定机器的机器代码。

Sun公司制定的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了JVM的下述细节:

指令集(中央处理器[CPU])
寄存器
类文件格式

垃圾收集堆
存储区


制定这些的目的是为了提供一种统一的编译Java源代码的规范,最终实现Java软件的平台无关性。因为编译生成的字节码文件是针对JVM的,是平台无关的。接下来,任何不同的时间或场合下,都可以在JVM上采用Java运行时解释器解释执行该字节码文件,也就是由JVM将字节码指令解释为特定平台的机器码指令并执行。在这一过程中,JVM起到翻译的作用,针对不同平台,开发不同的JVM就好比多个翻译将一份某种语言的作品分别翻译成不同的语言版本,达到信息交流的目的。




3.Java语言运行机制深入——JRE与JDK 


Java运行时环境(Java Runtime Environment)提供了Java的运行环境。它主要由三部分组成:类加载器(class loader)、字节码校验器(bytecode verifier)以及运行时执行引擎(Java Runtime Execution Engine)组成。它们完成不同的功能:类加载器负责从一输入流加载Java字节代码;字节码校验器分析与Java类对应的字节代码流并验证字节代码流符合为该类定义的Java语言规范;而Java运行时执行引擎执行由类加载器加载的并由字节码校验器校验后的字节码。

Java开发包(Java SE Development Kit)是Sun提供的一套用于开发的Java应用程序的开发包,它提供了编译、运行Java程序所需的各种资源,包括Java编译器、JVM、Java运行时环境、以及常用的Java应用程序编程接口(API—-Application Programming Interface,常用Java类库)。它通常包括如下内容:

l         Java虚拟机(JVM);
l         Java运行时环境(JRE);
l         Java编译器:javac,可以通过执行这个命令来将Java源程序编译成可执行的字节码代码class文件;
l         Java运行时解释器:java,可以通过这个命令来执行编译好的字节码class文件;
l         Java应用程序编程接口:API,提供了大量的应用编程接口。可以使用这些应用编程接口来缩短开发时间,提高开发效率;
l         Java文档化工具:javadoc,用于从java源文件中提取符合javadoc规范的注释来生成HTML格式的帮助文件;
l         其它工具及资源:如用于程序打包的jar等。

-----------------------------------------------------------------------------------------------------------------------------
Java SE:Java StandardEdition  标准版
Java ME: Java Micro Edition  微型版
Java EE:Java EnterpriseEdition  企业版
 
Java的基础,学完之后有两个发展方向,java ME 和 java EE
 
Java由Sun公司推出
Sun公司是一个纯高科技公司,但是由于市场营销经营不善连年亏损,因此于
2009年04月20日被甲骨文以74亿美金收购收购。
 
J2SE、J2ME、J2EE
 
目前,Java 2平台有3个版本:它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform MicroEdition,Java ME)、适用


于桌面系统的Java 2平台标准版(Java 2 Platform StandardEdition,Java SE)、适用于创建服务器应用程序和服务的Java 2平台企业


版(Java 2 Platform EnterpriseEdition,Java EE)。
 
JDK:Java DevelopmentKit
java 开发包,是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。
 
JRE:Java RuntimeEnvironment
java 运行环境,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
 
JDK包含了JRE,JRE只能运行不能编译。
 
Jdk 1.4, jdk 1.5(5.0), jdk 1.6(6.0) ,jdk 1.7 (jdk 7) 最新版本
没有JDK4.0 
为什么JDK1.5 和 JDK 5.0 是一样的呢?
因为JDK1.5和JDK 1.4相比,有很多新的更新,为了能表示后者的新特性,把原来定位JDK1.5的说法换成了JDK 5.0.
jdk 1.5(5.0):别名:Tiger,老虎
jdk 1.6(6.0):别名:Mustang,野马
 
1.      下载JDK
2.      安装JDK
3.      设定环境变量(可以是用户变量,也可以是系统变量),指向JDK安装目录中的bin目录
Path = C:\ProgramFiles\Java\jdk1.6.0_25\bin
在运行里输入:
Calc  启动计算器
Wordpad  记事板
Notepad   记事本
4.      通过运行,输入cmd打开命令行窗口,输入java –version,显示出Java版本信息
装完后,进入目录可以看到:
在JDK目录bin下有java.exe 和javac.exe两个文件
在JRE 目录bin 下只有 java.exe 文件
接下来就可以编写Java程序了。
 
可以直接使用windows记事本来编写Java程序,也可以使用Editplus,UltraEdit等高级文本编辑工具编写Java程序,还可以使用专业的IDE


(Integrated DevelopmentEnvironment)编写。
 
编辑器介绍:
 
Windows: notepad(记事本), editplus,ultraedit, gvim(类似于linux下的vi)
Linux: vi, vim(vi增强版), gedit
Mac: Emacs
 
第一节课,我们使用记事本实现一个Hello World的Java程序。
[HelloWorld.java]
所有的Java代码,其后缀都是以java结尾。
 
Java程序的执行过程分为两步:
1.      编译
2.      执行
 
Class文件是字节码文件,程序最终执行的就是这个字节码(bytecode)文件。
编译命令:java HelloWorld.java
执行命令:java HelloWorld(注意,HelloWorld后面没有.class)
Java编译,即javac后面跟的是文件名。但java执行,即java后面跟的不一定是文件名,而是包含MAIN方法的那个类的名字。
 
Java是跨平台的语言,真正执行的不是二进制代码,而是字节码。
 
JVM(Java Virtual Machine,Java虚拟机):是用C语言写的。
 
Java是跨平台的,而JVM不是跨平台的(JVM是由C语言编写的)
 
Java之所以能够做到跨平台,本质原因在于JVM不是跨平台的。
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值