Java字节码
编辑与Java的关系
编辑一个Java的程序员不需要知道或了解Java字节码的。但是,正如IBM developerWorks期刊中所建议的那样,“理解字节码以及Java编译器可能生成的字节码将以与汇编知识有助于C或C ++程序员相同的方式帮助Java程序员。”
指令集架构
编辑JVM既是堆栈机又是寄存器机。方法调用的每个帧都有一个“操作数堆栈”和一个“局部变量”数组。操作数堆栈用于计算操作数和接收被调用方法的返回值,而局部变量的作用与寄存器相同,还用于传递方法参数。由编译器计算的操作数堆栈和局部变量数组的xxx大小是每种方法的属性的一部分。每个值的大小可以从0到65535独立设置,其中每个值都是32位。long
和double
类型(均为64位)占用两个连续的局部变量(不需要在局部变量数组中进行64位对齐)或操作数堆栈中的一个值(但在操作数堆栈中计为两个单位)堆栈的深度)。
指令集
每个字节码由代表操作码的一个字节以及用于操作数的零个或多个字节组成。
截至2015年,在256种可能的字节长操作码中,有202种正在使用(〜79%),51种保留供将来使用(〜20%),3条指令(〜1%)xxx保留给JVM实现,以用于采用。其中两个(impdep1
和impdep2
)分别为实现特定的软件和硬件提供陷阱。第三个用于调试器实现断点。
说明分为以下几大类:
- 加载和存储(例如
aload_0
,istore
) - 算术和逻辑(例如
ladd
,fcmpl
) - 类型转换(例如
i2b
,d2i
) - 对象的创建和处理(
new
,putfield
) - 操作数栈管理(例如
swap
,dup2
) - 控制转移(例如
ifeq
,goto
) - 方法调用和返回(例如
invokespecial
,areturn
)
对于一些更专门的任务,也有一些说明,例如异常抛出、同步等。
一代
编辑通过生成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处理器。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/116412/