Java 字节码是否必须遵循 Java 语法结构?

Does Java Bytecode have to follow Java syntax structure?

Java 对其构成的源文件有一些严格的规则,例如在同名文件中每个文件只需要一个 class。 而 javac 将每个源文件编译成一个 Bytecode .class 文件。 我的问题是,存在其他编译为 Java 字节码并且没有像 Java 那样严格的结构的语言(Scala,Ruby 的某些版本),是否需要生成字节码文件在 class 文件层次结构中,即使源代码不是?

更新 我不是在谈论 JVM 的方法,我是在谈论字节码文件是否必须遵循 Java 源文件的结构(每个文件一个 class)或者它是否对其他结构开放。文件规范对此没有任何说明。

如果它是 Java 字节码,它的排序方式使得任何 JVM(Java 虚拟机)都可以理解它。

如果任何遵守标准的 JVM 不能 运行 您的 Java 字节码,那么它就不是 Java 字节码。

JVM 有多种形式(Sun/Oracle、IBM、Google 等),但它们只有在 运行 ALL Java 所有平台上的代码。

答案是否定的。如果 Java 规范不允许,那么 JVM 也不应该。

一个字节码文件正好包含一个class。这是由 JVM 规范规定的。如果您想将许多 class 保存在一个文件中,标准解决方案是将它们打包到一个 .jar 文件中,这实际上是一个 .zip 文件。

Java 源文件,相反,可能包含多个 classes。但是,源文件中最多可以有一个 public 顶级 class。

不确定您指的是哪个规范,但是来自 Oracle 的规范非常清楚地表明 一个 class 在每个 class 文件中(此外:你认为它们为什么被称为 class 文件)。

引用自here

一个class文件由一个单个类文件结构组成:

ClassFile {
u4             magic;
u2             minor_version;
u2             major_version;
u2             constant_pool_count;
cp_info        constant_pool[constant_pool_count-1];
u2             access_flags;
u2             this_class;
u2             super_class;
u2             interfaces_count;
u2             interfaces[interfaces_count];
u2             fields_count;
field_info     fields[fields_count];
u2             methods_count;
method_info    methods[methods_count];
u2             attributes_count;
attribute_info attributes[attributes_count];
}

所以,非常明显:每个 class 文件一个这样的结构;并且恰好有一个 class 由这样的结构表示。

郑重声明:如果您真的打算使用一个应该创建有效字节码文件的编译器……那么您需要更加勤奋。这种工作有点高级;而你已经在第一步绊倒了。