Java字节码
目录
Java字节码
Java字节码是指令集的的Java虚拟机(JVM)。
与Java的关系
一个Java的程序员不需要知道或了解Java字节码的。但是,正如IBM developerWorks期刊中所建议的那样,“理解字节码以及Java编译器可能生成的字节码将以与汇编知识有助于C或C ++程序员相同的方式帮助Java程序员。”

指令集架构
JVM既是堆栈机又是寄存器机。方法调用的每个帧都有一个“操作数堆栈”和一个“局部变量”数组。操作数堆栈用于计算操作数和接收被调用方法的返回值,而局部变量的作用与寄存器相同,还用于传递方法参数。由编译器计算的操作数堆栈和局部变量数组的xxx大小是每种方法的属性的一部分。每个值的大小可以从0到65535独立设置,其中每个值都是32位。long
和double
类型(均为64位)占用两个连续的局部变量(不需要在局部变量数组中进行64位对齐)或操作数堆栈中的一个值(但在操作数堆栈中计为两个单位)堆栈的深度)。
一代
通过生成Java字节码而针对Java虚拟机的最常见语言是Java。最初只有一个编译器,即Sun Microsystems的javac编译器,它将Java源代码编译为Java字节码。但是,由于Java字节码的所有规范现在都可用,因此其他各方已提供了产生Java字节码的编译器。其他编译器的示例包括:
- Jikes,从Java编译为Java字节码(由IBM开发,以C ++实现)
- Espresso,从Java编译为Java字节码(仅Java 1.0)
- GNU Java编译器(GCJ),从Java编译为Java字节码;它也可以编译为本地机器代码,并且一直是GNU Compiler Collection(GCC)的一部分,直到版本6。
一些项目提供了Java汇编器,以允许手动编写Java字节码。汇编代码也可以由机器(例如,针对Java虚拟机的编译器)生成。著名的Java汇编器包括:
- Jasmin用Java虚拟机指令集以类似于汇编的简单语法编写Java类的文本描述,并生成Java类文件
- 牙买加,一个宏 汇编语言的Java虚拟机。Java语法用于类或接口定义。方法主体是使用字节码指令指定的。
- Krakatau字节码工具当前包含三个工具:用于Java类文件的反编译器和反汇编器,以及用于创建类文件的汇编器。
- Lilac、Java虚拟机的汇编程序和反汇编程序。
其他人则针对不同的编程语言开发了针对Java虚拟机的编译器,例如:
- 冷融合
- JRuby和Jython,两种基于Ruby和Python的脚本语言
- Apache Groovy,一种基于Java的脚本语言
- Scala是一种类型安全的通用编程语言,支持面向对象和函数式编程
- JGNAT和AppletMagic,从语言Ada编译为Java字节码
- C到Java字节码编译器
- Clojure是Lisp系列中的一种功能性,不变的通用编程语言,特别强调并发性
- Kawa是Scheme编程语言的一种实现,也是Lisp的一种方言。
- MIDletPascal
- JavaFX脚本代码被编译为Java字节码
- Kotlin,一种具有类型推断的静态类型通用编程语言
- 使用Free Pascal 3.0+编译器将对象Pascal源代码编译为Java字节码。
Java字节码的执行
如果不希望在Java虚拟机中执行Java字节码,则开发人员还可以使用诸如Java的GNU编译器(GCJ)之类的工具将Java源代码或字节码直接编译为本机代码。一些处理器可以本地执行Java字节码。这种处理器称为Java处理器。