二进制
- 二进制 是计算技术中广泛采用的一种 数制,是以2为基数代表系统的二进位制,二进制由0或1来表示。
- 二进制是由1和0两个数字组成的,它可以表示两种状态,即开(通电) 和 关(断电) 。
它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制在计算机科学中特别重要,因为计算机内部的信息都是由二进制表示的。
二进制数
- 二进制数 是计算机内部信息处理的 基本单位, 二进制数就是一串由0和1组成的数值,计算机的底层零件用通电来表示1,断电表示0,这样便于存储和处理数据 。
- 二进制数也是计算机中所有数据的基础,包括数字、字符、图像等。
- 二进制数是由数字0和1组成的数值,它们的每一位都代表着2的幂次方。
例如,二进制数1011表示为:
1×23+0×22+1×21+1×20 = 11。
二进制编码
二进制编码是一种数字系统,二进制编码中每个数字用0或1表示,每一个0或1代表一位 (bit)。
字节码
字节码(Byte-code)是一种包含执行程序,由一序列 op (操作码) 代码 / 数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位,1字节(B)= 8位(b)。
Java编译器在不同的操作系统下编译Java源代码,生成的字节码文件是相同的,因为Java编译器与操作系统无关,是面向JVM进行编译的。Java语言是一次编译,处处运行。
上面划线句子解答:
①因为Java编译器和 JVM都是为了实现跨平台性 / 一次编写,处处运行 的特性而设计,源代码是面向JVM 来编译的 (编译成字节码文件),它是被要求符合JVM语法的,而不是面向操作系统进行编译,正是因此才能通过字节码文件 + JVM实现跨平台性。②同时字节码文件是与操作系统无关的中间代码,它不用看自身是否符合操作系统的要求,只要符合JVM语法要求就好啦,那为什么不让它相同呢,相同还更省时省力,效率更高呢! 相同了我就能通过移植字节码文件 + 系统装的 JVM来一样的运行,多方便、多跨平台!
注意 :
字节码 和 本地机器码都是==二进制==的,但是字节码不能直接在操作系统上运行,本地机器码则可在对应的操作系统运行。 可通过 JVM 来将字节码解释转换成具体操作系统的本地机器码,这也体现了java的一个特性:
跨平台性 / 一次编写,到处运行。 (字节码文件属于二进制文件,但是不能被操作系统直接识别和执行的二进制文件)拓展 :
在字节码中,"op"是指操作码 (Operation Code),操作码是一种指示计算机执行特定操作的指令,例如加法、减法、乘法、除法、跳转等。在字节码中,操作码用于指示字节码指令序列中的每个指令应该执行什么操作。
字节码文件
字节码文件是二进制文件。二进制文件不限于1010的形式,还有其他形式的二进制文件。字节码文件是不能被计算机识别和执行的。可通过 Java解释器来解释成具体操作系统的本地机器码,最后被操作系统执行,产生效果。
不同操作系统下编译相同的源码得到的字节码 (文件)是相同的 。
为什么 不同操作系统下编译相同的源码得到的字节码 (文件)是相同的呢 ? 。
答: ①因为Java编译器和 JVM都是为了实现跨平台性 / 一次编写,处处运行 的特性而设计,源代码是面向JVM 来编译的 (编译成字节码文件),它是被要求符合JVM语法的,而不是面向操作系统进行编译,正是因此才能通过字节码文件 + JVM实现跨平台性。
②同时字节码文件是与操作系统无关的中间代码,它不用看自身是否符合操作系统的要求,只要符合JVM语法要求就好啦,那为什么不让它相同呢,相同还更省时省力,效率更高呢! 相同了我就能通过移植字节码文件 + 系统装的 JVM来一样的运行,多方便、多跨平台!
可移植性 / 跨平台性
可移植性也被叫做跨平台性,Java程序可以在任何操作系统 (例如Windows、Linux、macOS等)
和硬件平台上运行,而不需要重新编译。这是通过JVM将Java字节码转换成不同操作系统的本地机器码来实现的。
(大功臣是:Java字节码 + JVM,字节码能被 JVM解释成本地机器码,本地机器码被操作系统识别且执行,最后运行,实现了一次编写,处处运行。不同的操作系统装不同的JVM,在一个操作系统上编译而来的字节码文件 ( .class),可放在其他操作系统上被识别且执行。
例子如:
windows操作系统上编译得到的 Student.class ( 字节码文件),可以直接放在linux操作系统上运行,linux上的Java解释器 ( java.exe )会将字节码文件----解释成本地机器码------运行。从而达到一次编写,处处运行。
当然也可以通过移植 java源码 ( .java) +JVM的方式来达到一次编写,处处运行,但这是效率不高的表现,当代码过多时,编译的时间成本太高,且原理还是 字节码 + JVM来实现跨平台性。注意 :
不同的操作系统,装的JVM是不一样的。同一份Java源码 (.java)在不同的操作系统下编译而成的字节码 ( .class)是 一样 的,不同操作系统解释的各自的本地机器码是不一样的。
Java虚拟机
Java虚拟机 (JVM) 是进行Java程序执行的唯一通道,现在的Java程序本质上属于虚拟机语言,所有的语法都按照虚拟机的标准进行编写,在执行的时候由虚拟机(JVM)负责与操作系统进行交互,这是不同的操作系统下编译的字节码文件是一样的原因之一。
字节码文件 + Java虚拟机 让Java语言拥有了 “跨平台性” ,从而实现一次编写,多处运行。
注意点:
同一份 Java源代码 在不同的 操作系统 下,编译出来的的 Java字节码文件 是 一样 的。
原因:①因为Java编译器和 JVM都是为了实现跨平台性 / 一次编写,处处运行 的特性而设计,源代码是面向JVM 来编译的 (编译成字节码文件),它是被要求符合JVM语法的,而不是面向操作系统进行编译,正是因此才能通过字节码文件 + JVM实现跨平台性。
②同时字节码文件是与操作系统无关的中间代码,它不用看自身是否符合操作系统的要求,只要符合JVM语法要求就好啦,那为什么不让它相同呢,相同还更省时省力,效率更高呢! 相同了我就能通过移植字节码文件 + 系统装的 JVM来一样的运行,多方便、多跨平台!
不同的操作系统装的 JVM是 不一样 的, 因为不同操作系统的内核和硬件架构不同,需要不同的 JVM来适配和优化 。
不同的操作系统下,由字节码解释成的本地机器码是 不一样 的。
ps: 不同的操作系统,Java源码一样,Java字节码一样,JVM不一样,生成的本地机器码将Java字节码转换为本地机器码,以便在特定的硬件平台上运行 。
Java程序可以在任何操作系统和硬件平台上运行,而不需要重新编译。这是通过JVM将Java字节码转换成本地机器码来实现的。(大功臣是:字节码文件 + JVM,不同的本地有不同的JVM,都用同一份Java源代码,源代码被编译成字节码----解释成具体的本地机器码,运行且达到达到同样的效果,从而实现一次编写,到处运行)。
中间码
- 中间码是Java虚拟机(JVM)的一种特性,是一种字节码。
Java中的中间码通常与JVM有关,Java的中间码通常是指在JVM中运行的字节码。这种字节码是Java程序在运行时使用的特殊编码方式。- Java编译器( javac.exe )将Java 源代码 编译成JVM识别的Java 字节码。
- Java解释器( java.exe )将Java字节码 解释转换成 本地机器码。
(体现了Java的 “一次编写,多处运行”,Java字节码 + JVM实现跨平台性)
Java中的中间码包括但不限于以下几种:
1.字节码(Byte Code):
Java的字节码是一种平台无关的中间码,可以在任何支持Java虚拟机(JVM)的平台上运行。Java编译器将Java源代码编译成字节码,以便在JVM上执行。2.本地机器码(Native Machine Code):
本地机器码是JVM将中间码编译成本地机器码的结果,这种代码可以直接在计算机硬件上运行,效率更高,但需要特定的编译器。3.常量池(Constant Pool):
常量池是Java虚拟机中的一种数据结构,用于存储Java程序中的常量,包括类、方法、字段等的信息。4.堆栈帧(Stack Frame):
堆栈帧是JVM中的一个内存区域,用于存储方法调用的参数、局部变量和返回地址等信息。5.操作数栈(Operand Stack):
操作数栈也是JVM中的一个内存区域,用于存储中间计算结果和临时变量等信息。总而言之,Java中的中间码是Java程序在运行时使用的特殊编码方式,它可以在不同的平台上运行,并且可以提高Java程序的安全性和可移植性。
机器指令
- 机器指令是指计算机硬件能够识别和执行的指令,它们是由0和1组成的二进制序列。机器指令通常由操作码和操作数两部分组成,
- 操作码 指出该指令所要完成的操作,即指令的功能。
- 操作数 指出参与运算的对象,以及运算结果所存放的位置等。
机器码
机器码指的是将指令以二进制形式表示,可被计算机直接识别和执行的代码。机器码是特定的硬件平台所对应的指令集的二进制表示,可以简单地理解为机器语言。不同的硬件平台所对应的机器码可能不同,因此在实际使用中需要考虑到不同的硬件平台所对应的机器码。
注意点:
机器指令和机器码都能直接被计算机识别和执行。
Java编译器
Java编译器 ( Javac.exe),Java开发工具,将Java源代码文件编译成字节码文件。
Java解释器
Java 解释器 ( Java.exe ),Java开发工具,启动虚拟机,执行字节码文件,翻译字节码文件,翻译成系统能直接识别和执行的本地机器码。