2016-07-19 6 views
-4

Javaには、同じ名前のファイルにファイルごとに1つのクラスしか持たないなど、構造化されているソースファイルにいくつかの厳しい規則があります。 そして、javacは各ソースファイルをバイトコード.classファイルでコンパイルします。 私の質問は、Javaバイトコードにコンパイルされ、Java(Scala、Rubyのいくつかのバージョン)として厳密な構造を持たない他の言語が存在することです。ソースコードがクラスファイル階層でも生成される必要がありますない?私はJVMのへのアプローチの話ではないJavaのバイトコードはJavaの構文構造に従わなければなりませんか?

UPDATE 、私はバイトコードファイルは、Javaソースファイルの構造(各ファイルに対して1つのクラスを)従わなければならないかどうかについて話しているか、それは他の構造に開いています。ファイル指定はそれについて何も言わない。

+2

Javaは、各ソースファイルを1つのバイトコードファイルにコンパイルしません。あなたの質問は、間違った前奏に基づいています。 – EJP

+0

それは私が言ったことではない、私は.classファイル内の各ソースファイルを言った。 – NoImaginationGuy

+0

EJPのポイントは、javacが各ソースファイルを少なくとも1つ、しかしおそらく複数のクラスファイルにコンパイルするということだと思います。ソース内のすべてのクラス(内部クラス、匿名クラス、すべての 'em'を含む)は、独自のクラスファイルを取得します。 – yshavit

答えて

1

バイトコードファイルには、1つのクラスが含まれています。これはJVM仕様で規定されています。多くのクラスを1つのファイルに保存したい場合、標準的な解決策は、それらを.jarファイルにパックすることです。これは事実上.zipファイルです。

Javaソースファイルには、複数のクラスが含まれる場合があります。ただし、ソースファイルには1つのパブリックトップレベルクラスが存在することがあります。

+0

Java以外のソースコードをJavaバイトコードにコンパイルする必要がある場合は、「フェイククラス」を作成する必要がありますか?つまり、パッケージにグローバル変数がある場合、その変数のクラスを作成し、それをクラスファイルに変換する静的フィールドとして配置する必要があります。 – NoImaginationGuy

+0

はい、または他の既存のクラスにその変数を配置します。 –

+0

Javaはグローバル変数を擬似クラス、すなわち 'package-info.class'にパッケージングしますが、グローバル変数は含まれません。パッケージ注釈。 – Holger

-3

Javaバイトコードの場合、任意のJVM(Java Virtual Machine)が理解できるように順序付けられています。

規格に準拠するJVMでJavaバイトコードを実行できない場合は、Javaバイトコードではありません。

JVMは多くの形式(Sun/Oracle、IBM、Googleなど)で提供されていますが、すべてのプラットフォームですべてのJavaコードを実行できるのであれば、Javaのみです。

答えはいいえです。 Java仕様がそれを許容しない場合、JVMは必要ありません。

+0

JVMのアプローチについては言及していませんが、私はバイトコードファイルがJavaソースファイル(各ファイルに1つのクラス)の構造、または他の構造に対して開いています。ファイル指定はそれについて何も言わない。 – NoImaginationGuy

+0

それはまさに私が話していたものです。バイトコードはJava仕様に従わなければなりません。それはもはやJavaではありません。 – schuttek

+0

質問は、Javaから解放される可能性のあるバイトコードと、「バイトコードにコンパイルできる言語」であるJavaについてです。そのため、Javaバイトコードが必ずしも「Java」であるとは限りません。例えば、ScalaはJVMバイトコードにコンパイルしますが、Javaとは何も関係ありません。 – NoImaginationGuy

0

ない、あなたが参照している仕様を確認しますが、Oracleの一つは、それ以外にも各クラスファイル内に正確にクラス(があること非常に明らかに:なぜあなたは彼らがクラスファイルと呼ばれていると思いますが、 )。

クラスファイルが単一クラスファイル構造で構成されています:

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

ので、非常に明らかに:hereから引用

クラスファイルごとに1つのそのような構造体。そのような構造体によって示されるちょうど1つのクラス。

レコードの場合:実際に有効なバイトコードファイルを作成するはずのコンパイラで作業するつもりなら、もっと勤勉にする必要があります。この種の仕事はちょっとです;あなたはすでに最初の一歩を踏み出しています。