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

时间:2016-07-19 03:26:19

标签: java bytecode

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

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

3 个答案:

答案 0 :(得分:1)

字节码文件只包含一个类。这是由JVM规范规定的。如果要在单个文件中保留许多类,标准解决方案是将它们打包在.jar文件中,该文件实际上是.zip文件。

相反,

Java源文件可能包含多个类。但是,源文件中最多只能有一个公共顶级类。

答案 1 :(得分:0)

不确定您指的是哪个规范,但是来自Oracle的规范使得非常明确表明每个类文件中都有一个类(除此之外:为什么你认为它们被称为文件。)

引自here

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

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];
}

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

只是为了记录:如果你真的打算在一个应该创建有效字节码文件的编译器上工作......那么你需要更加勤奋。这种工作有点高级;你已经在第一步磕磕绊绊了。

答案 2 :(得分:-3)

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

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

JVM有多种形式(Sun / Oracle,IBM,Google等),但如果他们可以在所有平台上运行所有Java代码,那么它们只是真正的Java。

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