Java语言规范是否要求将Java编译成Java字节码?
据我所知,情况并非如此:
编译时通常由将程序转换成与机器无关的字节码[表示形式]。 ..。 编程语言是,通常编译到JavaVirtualMachineSpecificationJavaSE9Edition中定义的字节码指令集和二进制格式。
(强调地雷)
我在规范中找不到任何其他提到“字节码”或“字节码”的地方。
这是否意味着所有字节码操作在技术上没有被JLS定义的"Java语言“所涵盖,并且在技术上依赖于实现细节?
发布于 2017-11-29 12:25:22
您正确地注意到,术语“normally”以及JLS中没有任何字节代码描述是为了尽可能地独立于执行环境来定义Java编程语言。尽管如此,这并不容易:
与预定义类和接口的关系 如上所述,该规范经常引用Java平台API的类。特别是,一些类与Java编程语言有着特殊的关系。示例包括
Object、Class、ClassLoader、String、Thread等类,以及包java.lang.reflect中的类和接口。该规范限制了此类类和接口的行为,但没有为它们提供完整的规范。读者可以参考文档。 因此,本规范没有详细描述反射。许多语言结构在核心反射API (java.lang.reflect)和语言模型API ( Language,javax.lang.model)中都有类似之处,但是这里通常不讨论这些。例如,当我们列出可以创建对象的方式时,我们通常不包括核心反射API可以完成这一任务的方式。即使文本中没有提到这些附加机制,读者也应该知道这些机制。
所以Java编程语言比JLS更多,它也是Java平台API。在这里,我们有上述defineClass类的ClassLoader方法,接受类文件格式的输入。因此,即使我们使用字节码格式的类文件以外的其他部署方式,完全兼容的环境也必须在这里支持这种格式。请注意,Java 9引入了另一种接受类文件格式输入的方法,它甚至不需要反射或实现自定义类加载器。
这就排除了JavaME,它没有JLS提到的这些API工件,否则,我们已经有了一个不支持字节码操作的Java环境的例子。
但是,这仍然不能完全回答字节码操作是否是非语言的问题,比如JavaSE还是EE。即使由标准API提供对字节码格式的支持,字节码操作也取决于实现细节,要么是支持非强制性的仪表API,要么是以部署形式处理已编译的类文件,如文件层次结构、jar文件或模块文件,但它们都不一定是应用程序的部署形式(正如前面所说的)。因此,确实不可能实现一个字节码操作工具,确保它能够与每个可能的Java环境一起工作,尽管您必须竭尽全力创建一个名为完全兼容,但不使用这些工具…的环境。
发布于 2017-11-29 11:20:49
JSL不需要知道JVM将如何读取,它只描述了Java语言。JDK中提供的编译器(JAVAC)执行链接,但它不是语言本身的一部分。
Oracle的JDK软件包含一个编译器,从用Java编程语言编写的源代码到Java虚拟机的指令集
在Java™编程语言编译器,中,我们可以找到同样的解释:
Java编程语言编译器javac读取用Java编程语言编写的源文件,并将它们编译成字节码类文件。此外,编译器还可以使用可插拔注释处理API处理源文件和类文件中的注释。编译器是一个命令行工具,但也可以使用调用。编译器接受Java规范(JLS)定义的源代码,并生成由()定义的类文件。
所以JAVAC命令主要是到规范之间的桥梁。
您可以通过签入Jave虚拟机规范找到一些信息。
Java虚拟机对Java编程语言一无所知,只知道特定的二进制格式,即类文件格式。类文件包含Java虚拟机指令(或字节码)和符号表以及其他辅助信息。
(我想找到相反的说法,Java语言对Java虚拟机语言一无所知.)
在后面的规范中,我们发现了更多关于类格式的信息,以及它是如何被翻译到指令列表中的。
.class格式:第4章.类文件格式。https://stackoverflow.com/questions/47550837
复制相似问题