【第二章】Java重学之路 - Java语言运行机制及其为什么被称为混合型语言

解释型语言和编译型语言的具体区别于特征

1.解释型语言和编译型语言特征的个人理解

一般来说,语言分为解释型和编译型,按照我查阅的资料以及个人的理解来说,两者的根本性特点在于:

编译型语言的特征与具体运行机制

程序会自动进行编译,比如我们在vc中书写c语言时,每次按下保存都会生成一个机器码文件,实际上就已经进行了一次编译
这个编译过程所做的,通常定义下是把已经书写好的语句翻译为计算机可以看懂的语言,也就是可以直接控制操作系统的语句
并且,因为只要有保存的动作就会进行一次编译,实际流程上,代码在执行前就已经由编译器生成了一个计算机可以看懂的可以复用的编码文件,所以此类语言在运行前就已经被编译完毕,在运行时,调用的实际上是那个编码文件
由于编译文件可以复用,每次运行不需要经过源码直接调用编译文件即可,从而使得代码运行速度相对较快
然而,一次写成后编译器编译出的文件实际上只能适应当前平台,因此跨平台性较差,而且,我们书写的源代码直接和操作系统接触,有一定的危险性

解释型语言的特征与具体运行机制

程序没有编译的过程,而是在运行时,由解释器对代码进行翻译
比起编译型语言在运行时直接对现成的系统可以看懂的编译文件进行调用,解释型语言在运行时是把源码交给解释器,再由解释器交给系统进行运行
解释型语言通常对于解释器翻译出的代码不会进行保存,而是每次运行时现场翻译,因此,其速度比起编译型要慢,但是由于是运行时现场翻译,此类语言都有较为优秀的夸平台性,而且,源码不会和操作系统直接接触,相对来说有更好的安全性

总结

可以说,两种类型语言的区别实际上在于有没有在运行前通过编译器生成机器码文件,这个过程是他们两者的其他区别的核心原因,包括运行速度,跨平台性以及安全性都是由这个操作决定的

2.语言中的奇葩,Java

了解以上两种语言的清楚定义后,我们再看向java,他被称为半解释半编译语言,那么其实际的运行过程到底如何?
一.首先,我们在运行环境中书写java源代码时,每次保存实际上都是自动运行了javac,而这个javac就是java使用的编译器,看到这里似乎可以说java是编译型语言了?但是实际上,javac所做的并不是把源码翻译为机器语言,而是翻译为一种字节码文件,即bytecode,也就是每次保存后我们可以看到文件中生成的.class文件

二.实际运行时,我们是把class文件交给jre,再由jre对字节码文件翻译为机器码交给操作系统进行运行,从这一步看来,似乎java比起别的普通的解释型语言只是他会提前编译为一个class文件,运行时任然是现场交个解释器进行解释而已

三.但是,class文件在翻译为机器码的过程又具体是怎样的呢,这就要看jvm具体是如何实现的了,一般来说是以下形式
1.运行时,字节码文件会由jvm交给jre,再由jre中的解释器逐条翻译为机器码,再给操作系统进行翻译,和普通的解释型一样
2.运行时,引入实时编译器JIT(Just In Time compiler),class文件中的部分字节码会被该种特殊编译器实时编译为机器码,而且还会储存起来,由于对所有的编码进行编译反而会降低速度,她通常只会去编译那些经常使用的部分,比如循环等
可以说,JIT实际上是java为了提高自己的速度而引入的一项特征,也正是他的引入,使得java现在的运行速度在某些情况下不会比纯编译型语言慢多少
3.rtsj(Real Time Specification for Java),对于javac直接进行二次编译并生成静态的机器码

一般来说,字节码文件的解释过程通常是默认同时使用1和2两种方式,在特殊命令下,会执行第三种方式
所以说,在解释型特征的基础上,java为了提升性能还有编译型的特征,因此,被我们称为两种特征语言的混种

总结

总而言之,理解java的运行过程后,我们可以知道同时拥有两种语言的特征,其具体运行模式实际上是java——>jre——>操作系统的模式,其语言的众多特征其实来自于jre的处理方式,那么,什么是jre呢?

jdk,jre与jvm

总体来说,这三者的关系可以概括为:jdk包含jre,jre包含jvm

1.jvm

就是java虚拟机,java能够多平台高效运行的功臣,其主要构成我们会在之后在分析一个java程序的具体运行过程时内存的处理过程详细谈到,开发者们为不同的平台都提供了其对应的java虚拟机,因此java代码可以做到一次编写处处运行,跨平台后对语言的翻译全部交给jvm去处理
一般来说,我们书写的源码会被编译器(可以理解javac.exe,没错,就是大家用文本编辑器书写程序时需要运行的那个)转换为字节码文件被喂给它,jvm中的解释器(可以理解为java.exe,没错,使用命令行运行java时我们就是用它来运行javac编译后的java文件的,他会通过jvm中内含的类装载器自动找到class文件,并运行它)会将其翻译为机器码递交给操作系统

2.jre

其全称为java运行环境,包括jvm虚拟机在内,它还包含一些函数和java应用运行时必须用到的文件,其大小非常的小,对于jre名下的这些文件之所以被称为java运行环境,我想是因为它囊括了java程序需要运行时所需要的所有方法和文件,同时,包括javac编译器在内的各类开发者需要的部分则完全没有放进来
也就是说,如果你只是想要运行java程序,有一个jre就够了

3.jdk

其全称为java开发工具包,实际上,在安装jdk时,我们可以看到在安装目录下生成了两个文件夹,一个是jdk,一个是jre,而打开jdk我们可以看到其中就包含了一个完整的jre文件夹
除了jre中所包含的必需品,jdk的目录下还有:

bin目录

用于放各类二进制文件,比如编译器javac,打包器jar.exe

db目录

这其实是一个jdk自带的关系型数据库derby
对于java自带数据库的使用详解.

include目录

用于存放头文件,如果是学过c的朋友应该会对他们很眼熟,java的底层有许多地方需要c的支持

lib目录

用于存放封装好的类的jar包,也就是所谓的依赖文件

src

源码目录,我们常用的java.lang等类的源码都打包存放在这里

你可能感兴趣的:(【第二章】Java重学之路 - Java语言运行机制及其为什么被称为混合型语言)