一、Java基础_入门-7_Java程序运行机制-编译型&解释型

{插入:Java有两种核心机制:Java虚拟机(JVM -> JavaVirtual Machine)、垃圾收集机制(GC -> Garbage collection),这两种机制在支持着Java程序的运行。}

高级编程语言按照 程序的执行方式 分为 编译型 和 解释型 两种。简单来说,编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。

编译型:类似于把一本中文书直接全文翻译成英文版出售(编译器:对操作系统要求比较低,执行速度快): C/C++语言都是编译型语言;

解释型:类似于请一位翻译官,要看外文书时才帮助翻译(代价比较大,麻烦):网页,服务器脚本:对于速度要求不高,就可以边执行边解释,JavaScript/VB等都是解释型语言;

区别:时机不同;

而Java两个过程都有,既有编译型也有解释型的特点:Java程序先经过编译,最后到操作系统的时候才解释;随着硬件技术的发展,硬件设备运行程序越来越快,对程序运行的影响也越来越小,编译型和解释型的区分越来越模糊,所以解释型的效率也越来越高。

 

简单来说Java程序的运行机制分为编写编译运行三个步骤。

1.编写:编写是指在Java开发环境中进行程序代码的编辑,最终生成后缀名为“.java”的Java源文件。

2.编译:编译是指使用Java编译器对源文件进行错误排查的过程,编译后将生成后缀名为.class的字节码文件,该文件可以被Java虚拟机(JVM)的解释器正常读取。

3.运行:运行是指使用Java解释器将字节码文件翻译成机器代码,执行并显示结果。字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的Java解释器来解释执行,因此Java是一种在编译基础上进行解释运行的语言。

  在运行Java程序时,首先会启动JVM,然后由它来负责解释执行Java的字节码,并且Java字节码只能运行于JVM之上。这样利用JVM就可以把Java字节码程序和具体的硬件平台以及操作系统环境分隔开来,只要在不同的计算机上安装了针对于特定具体平台的JVM,Java程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的。JVM把这种不同软硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级的跨平台移植。JVM是Java平台无关的基础,Java的跨平台特性正是通过在JVM中运行Java程序实现的。java源程序经过java编译器编译而成且由JVM执行的二进制文件 —— .class文件,因此可以通过拥有一份.class文件在不同的操作系统平台上的JVM执行,实现跨平台运行的特性

接下来了解一下Java运行流程,如图所示。(两张图是一个意思,那个看着舒服看那个)

    

Java运行流程

图中,从编写出来的Java源文件,到编译为字节码文件,再到通过JVM执行程序,然后将程序的运行结果展示给用户,这是一个完整的Java运行流程。

 1.机器码:

首先,我们知道一段程序要想在电脑上运行,必须“翻译”成电脑能够听懂的。由0,1组成的二进制代码(计算机可以直接执行),这种类型的代码即称为机器码,电脑CPU直接读取运行的机器码,运行速度最快,但是非常晦涩难懂,同时也比较难编写;

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。现在,除了计算机生产厂家的专业人员外,绝大多数的程序员已经不再去学习机器语言了。

机器语言是微处理器理解和使用的,用于控制它的操作二进制代码。
8086到Pentium的机器语言指令长度可以从1字节到13字节。
尽管机器语言好像是很复杂的,然而它是有规律的。
存在着多至100000种机器语言的指令。这意味着不能把这些种类全部列出来。

2.字节码
字节码是一种中间状态的(中间码)的二进制代码(文件),编写好的程序即通常的.java文件需要经过编译器编译成.class文件,这段.class文件是一段包含着虚拟机指令、程序/代码、数据片段/数据 组成的二进制文件,即字节码。需要直译器转译后才能成为机器码;字节码通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。字节码与特定的硬件环境无关;字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java bytecode

字节码bytecode: 简单说不是文件,而是JVM操作的指令格式,通常我们通过javap -c -v xx.class生成的文件称为字节码文件,是属于可阅读的字节码指令文件,能够让我们清楚地知道java文件编译成.class文件之后显示的执行指令,便于程序员理解jvm的相关的知识

3.对比字节码与机器码

机器码就是说计算机能读懂的代码,简单点说就是给计算机执行的二进制代码.
字节码,是JAVA语言专有的,它是让JVM来执行的二进制代码
虽然都是二进制代码,但是由于执行它的环境不一样,所以它们存在一些指令集上的区别

一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~
二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论那种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~

位(bit):1位表示一个二进制数。 位是计算机中存储数据的最小单位,其值为“0”或“1”。一个二进制数就是一位(1bit)

字节(byte):1字节表示8个二进制数。字节是计算机存储容量的基本单位。在计算机内部,一个字节可以表示一个数据,也可以表示一个英文字母,两个字节可以表示一个汉字。1B=8bit 2B = 16bit

字(word):计算机进行数据处理时,一次存取、加工和传送的数据长度称为字。一个字通常由一个或多个(一般是字节的整数位)字节构成。

在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)
在32位的系统中(比如win32) 1字(word)= 4字节(byte)=32(bit)
在64位的系统中(比如win64)1字(word)= 8字节(byte)=64(bit)

64位是相对于32位而言的,这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。


 

参考:

https://blog.csdn.net/WJW2713718810/article/details/119086729

https://blog.csdn.net/qq_35810838/article/details/99294636

https://blog.csdn.net/xiaoqiu_cr/article/details/86654843

posted @   YanMingShun  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示