Java必须编译为字节码吗?

pha*_*t0m 5 java bytecode language-implementation jls

Java语言规范是否要求将Java编译为Java字节代码?

据我所知,事实并非如此:

JLS 1

编译时通常包括将程序转换为与机器无关的字节代码[表示.

[...]

Java编程语言通常被编译为Java虚拟机规范Java SE 9 Edition中定义的字节码指令集和二进制格式.

(强调我的)

我在规范中找不到任何其他提到的"字节码"或"字节码".

这是否意味着所有字节码操作在技术上都不被JLS定义的"Java语言"所涵盖,并且在技术上依赖于实现细节?

Axe*_*elH 1

JSL 不必知道 JVM 如何读取它,它只描述Java 语言。JDK 中提供的编译器(JAVAC)进行链接,但它不是语言本身的一部分

\n\n
\n

Oracle的JDK软件包含一个编译器,从Java编程语言编写的源代码到Java虚拟机的指令集

\n
\n\n

《Java\xe2\x84\xa2 编程语言编译器》中,我们可以找到相同的解释:

\n\n
\n

Java 编程语言编译器 javac 读取用 Java 编程语言编写的源文件,并将其编译为字节码类文件。或者,编译器还可以使用可插入注释处理 API 处理源文件和类文件中的注释。该编译器是一个命令行工具,但也可以使用 Java 编译器 API 进行调用。编译器接受 Java 语言规范 (JLS) 定义的源代码,并生成 Java 虚拟机规范 (JVMS) 定义的类文件

\n
\n\n

所以 JAVAC 命令主要是规范之间的桥梁。

\n\n
    \n
  • 输入:JLS 中描述的 .java
  • \n
  • 输出:JVMS 中的 .class 描述。
  • \n
\n\n

您可以通过查看Jave 虚拟机规范来找到一些信息。

\n\n
\n

Java 虚拟机对 Java 编程语言一无所知,只知道一种特定的二进制格式,即类文件格式。类文件包含 Java 虚拟机指令(或字节码)和符号表,以及其他辅助信息。

\n
\n\n

(我想找到相反的说法,即Java语言对Java虚拟机语言一无所知......)

\n\n

在该规范的后面,我们找到了有关类格式以及如何将语言转换为指令列表的更多信息。

\n\n\n