Java

Java 知识量:11 - 45 - 220

1.2 Java程序中的概念><

字节码是什么- 1.2.1 -

Java字节码是Java虚拟机(JVM)可以执行的一种中间代码表示形式。它是Java源代码的一种抽象表示,由Java编译器从Java源代码编译而成。

Java字节码是一种平台独立的二进制格式,可以在任何设备上运行,只要该设备上安装了适当的Java虚拟机。这使得Java成为一种“编写一次,到处运行”的编程语言。

Java字节码由一系列的字节码指令构成,每个指令对应一种操作,例如加法、减法、乘法等。这些指令在操作数栈上执行,操作数栈是JVM用于存储操作数的一种数据结构。

在运行时,Java虚拟机将字节码转换为与特定硬件和操作系统相关的本机代码,从而实现程序的执行。这个过程称为“解释执行”或“即时编译”。

为什么叫“字节码”- 1.2.2 -

在Java中,被称为“字节码”是因为这些代码是以字节为单位进行编写的。Java编程语言的指令集被称为字节码集,每一个指令都对应一个字节码。因此,当Java源代码通过编译器编译成目标代码时,这些目标代码就是字节码。

javac是什么- 1.2.3 -

javac是Java编程语言的编译器,全称是java compiler。它位于jdk/bin目录下,用于读取使用Java编程语言编写的源文件(.java),并编译成字节码类文件(.class)。

除了编译源代码,编译器还会一并编译源代码中的注解(annotations),但是会移除注释。另外,javac还可以隐式编译一些没有在命令行中提及的源文件。

字节码优化与JIT编译- 1.2.4 -

Java字节码是针对JVM优化过的机器码形式。Java编译器会对源代码进行优化,将其编译成更高效、更易于JVM解释执行的字节码形式。JIT编译出现后,优化重点转向JIT编译。

JIT编译是指在运行时进行编译,也就是在程序第一次执行的时候进行编译,因此也被称为“即时编译”。JIT编译是动态编译的一种特例,主要应用于Java虚拟机(JVM)中。

在JVM中,当某个Java方法被首次调用时,JIT编译器会将该方法的字节码编译成与特定硬件和操作系统相关的本机代码,以实现更高效的执行。这个过程是透明的,不需要程序员进行显式的编译操作。

除了将Java字节码编译成本地代码,JIT编译器还会对代码进行各种优化,以提高程序的性能和效率。例如,JIT编译器可以删除未使用的代码、内联小型方法、优化循环等。

Java的语言类型- 1.2.5 -

Java既是编译型语言,也是解释型语言。

大多数解释性语言(例如PHP、Perl、Ruby和Python)都直接从源码解释程序(通常都会基于输入的源码文件构建一个抽象句法树)。而JVM解释器需要的是类文件,因此需要一步额外操作,即使用javac编译源码。

Java编译型语言的特点是:大部分Java程序都需要通过编译器将Java源代码编译成字节码(bytecode),然后由Java虚拟机(JVM)解释执行。编译后产生的字节码文件可以脱离开发环境独立运行,实现代码的可移植性。

Java解释型语言的特点是:JVM在执行Java字节码时,会直接解释执行字节码,不需要预编译成为机器语言。在Java中,程序员编写程序使用的是Java源代码,而不是直接使用与计算机硬件相关的机器代码。

因此,从程序执行的角度来看,Java确实是一种解释型语言。但是从开发的角度来看,Java需要先被编译器编译成字节码,然后由JVM解释执行,因此它又具有编译型语言的特性。

在JVM中运行其他语言- 1.2.6 -

除了Java,还有许多其他编程语言可以在JVM上运行,例如Scala、Groovy、Kotlin、Clojure等。它们可以访问Java类库和API,并且可以与Java代码进行交互。同时,它们也可以利用JVM的性能优化和垃圾回收等功能。

JVM是一种虚拟机,可以运行任何符合规范的类文件。Java之外的语言可以通过两种方式在JVM中运行:

  • 第一种方法是提供源码编译器(类似javac),用于生成类文件,以与Java代码类似的方式在JVM中运行。

  • 第二种方法是其他语言使用Java实现解释器和运行时,然后直接对该语言源码进行解释。