Java字节码(编译语言,也称为目标代码)与机器码(本地计算机的代码)有何区别?我在书中读到它们将字节码称为二进制指令,但我不知道原因。
字节码是平台无关的,由Windows上运行的编译器编译的字节码仍然可以在Linux/Unix/Mac中运行。机器码是平台特定的,如果它在Windows x86中编译,则仅能在Windows x86中运行。
继续阅读您的书籍 =)
字节码是Java虚拟机的机器语言。当JVM加载一个类文件时,它会为类中的每个方法获取一个字节码流。字节码流储存在JVM的方法区中。当程序运行过程中调用某个方法时,该方法的字节码将被执行。它们可以通过解释,即时编译或者其他技术来执行,这取决于特定JVM的设计者所选择的方法。
每个方法的字节码流都是一系列Java虚拟机指令。每个指令由一个一字节opcode后面跟随着零个或多个操作数组成。opcode表示要执行的动作。如果在JVM可以执行该操作之前需要更多信息,则该信息被编码为一个或多个紧随opcode之后的操作数。
每种类型的opcode都有一个助记符。按照典型的汇编语言风格,Java字节码流可以由其助记符和任何操作数值来表示。例如,下面的字节码流可以通过助记符进行反汇编:
// Bytecode stream: 03 3b 84 00 01 1a 05 68 3b a7 ff f9
// Disassembly:
iconst_0 // 03
istore_0 // 3b
iinc 0, 1 // 84 00 01
iload_0 // 1a
iconst_2 // 05
imul // 68
istore_0 // 3b
goto -7 // a7 ff f9