JAVA基本概念梳理

程序语言运行过程理解

首先,计算机无法理解除机器语言之外的任何语言。所以任何语言,都必须将其翻译成机器语言,计算机才能运行高级语言编写的程序。翻译的方式分为编译解释,不同的方式适用于不同的用途。

编译型语言

编译型语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件)。

解释型语言

解释型语言的程序不需要编译,解释性语言在运行程序的时候才翻译,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次。脚本语言一般都需要解释器才能运行。

编译

利用编译程序(编译器)从用源语言编写的源程序产生目标程序的过程。产生目标程序的动作。Java的编译只到字节码。
其中目标程序包括机器语言代码和汇编语言代码,前者可直接执行或由连接装入程序使之与某些运行程序连接后执行,
后者须经汇编程序汇编后才可执行。

汇编

汇编指令通过汇编过程转换成机器指令。汇编语言的主体是汇编指令。
汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。在底层广泛应用。

Eg:

操作:寄存器BX的内容送到AX中
1000100111011000              机器指令
mov ax,bx                     汇编指令


JAVA程序的可移植性

由此引出JAVA的一个重要特性,可移植性。下文是C/C++与JAVA关于编译过程的对比:

  • C/C++代码——编译(不同的系统编译出不同的机器码,所以同一个C/C++文件不一定可以在某些系统执行,因为编译出的机器码不同)——机器码————在操作系统中由硬盘读取到内存中运行——内存——CPU——输出结果
  • Java代码————编译得到字节码文件(.class)————JVM执行字节码文件(字节码在虚拟机上运行,虚拟机相当于翻译官,不同的系统JVM不同,转换规则不同,把同一个字节码文件转换为相应的系统的机器码)————机器码在相应系统运行——内存——CPU——结果

由于JVM的存在,只需在不同的系统上安装相应的JVM,同一个.class文件在相应的系统的JVM运行就会输出相应系统能解析的机器码,从而成功运行。这就是,一次编译,到处运行。

一本汉字写的书(源码),去到不同的国家(系统),每个国家有相应的翻译官(JVM虚拟机)把汉字翻译成其所在国家的文字
(比如这本书传到英国被翻译成英文书),之后就可以在这个国家流传开了(相当于程序成功运行)。


JAVA各种名词具体梳理

Java编译器

将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件)。javac.exe可以简单看成是Java编译器。

Java解释器

是JVM的一部分。Java解释器用来解释执行Java编译器编译后的字节码。java.exe可以简单看成是Java解释器。

JVM

JAVA虚拟机(JAVA Virtual Machine)有自己完善的硬件架构,如处理器、堆栈(Stack)、寄存器等,还具有相应的指令系统(字节码就是一种指令格式)。**JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。**JVM是Java平台无关的基础。JVM负责运行字节码:**JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解释器执行。**JVM解释执行字节码文件就是JVM操作Java解释器进行解释执行字节码文件的过程。

JIT

即时编译(Just-in-time compilation):又叫实时编译、及时编译。是指一种在运行时期把字节码编译成原生机器码的技术,一句一句翻译源代码,但是会将翻译过的代码缓存起来以降低性能耗损。这项技术是被用来改善虚拟机的性能的。
JIT编译器是JRE的一部分。原本的Java程序都是要经过解释执行的,其执行速度肯定比可执行的二进制字节码程序慢。为了提高执行速度,引入了JIT。在运行时,JIT会把翻译过来的机器码保存起来,以备下次使用。而如果JIT对每条字节码都进行编译,则会负担过重,所以,JIT只会对经常执行的字节码进行编译,如循环,高频度使用的方法等。它会以整个方法为单位,一次性将整个方法的字节码编译为本地机器码,然后直接运行编译后的机器码。

JDK

JAVA开发工具包(JAVA Development Kit),JDK的安装目录下面有六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的是以下四个文件夹:binincludelibjre

  • bin:最主要的是编译器(javac.exe)
  • include:java和JVM交互用的头文件
  • lib:类库
  • jre:java运行环境(注意:这里的bin、lib文件夹和jre里的bin、lib是不同的,下文可见。
  • include和lib的区别:头文件和库文件的区别:
    简单来说:库文件通过头文件向外导出接口。用户通过头文件找到库文件中。
    头文件中有函数的申明,库文件实现函数的定义。
    库文件可以包含头文件,头文件不可包含库文件。
    头文件可视,库文件不可视。

    比如,printf函数。使用时应包括stdio.h,打开stdio.h你只能看到,printf这个函数的申明,却看不到printf具体是
    怎么实stdio.h头文件。链接器就能根据头件中的信息找到printf这个函数的实现并链接进这个程序代码段里。 
    

严格意义上讲,lib是静态库文件,dll是动态库文件。两种库的区别在于静态库被调用时直接加载到内存,而动态库再是在需要的时候加载到内存,不使用的时候再从内存释放。

JRE

JAVA运行环境(JAVA Runtime Environment),是指java运行环境。光有JVM还不能完成.class的执行,因为在解释.class的时候JVM需要调用解释所需要的类库lib。在JDK的安装目录里你可以找到jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件和jre一起打包发给朋友,这样你的朋友就可以运行你写的程序了。(jre里有运行.class的java.exe

参考帖子

https://blog.csdn.net/qq_33530388/article/details/60138971
https://www.cnblogs.com/chengdabelief/p/6576320.html
https://www.cnblogs.com/Aha-Sanding/p/5333282.html
http://www.cnblogs.com/ygj0930/p/5827273.html

猜你喜欢

转载自blog.csdn.net/u013453787/article/details/82385606