Javaでは、メソッドが64KBを超えることはできないことを知っています。この制限により、 JavaCC 文法から生成されたコードで問題が発生します。 Java 6に問題があり、文法を変更することでこれを修正できました。 Java 7の制限は変更されましたか、またはJava 8の制限は予定されていますか?
明確にするためだけに。自分で64 KBを超えるメソッドは必要ありません。しかし、私は非常に大きなメソッドにコンパイルする文法を書きました。
良い質問。いつものように、答えを見つけるために ソース に移動する必要があります( "TheJava®Virtual Machine Specification" )。ただし、Java6 VM仕様)のように、このセクションでは明示的に制限について言及していませんが、多少慎重になっています。
メソッドの呼び出し時に作成されたフレームのローカル変数配列内のローカル変数の最大数(§2.6)は、コード属性(§4.7.3)のmax_localsアイテムのサイズにより65535に制限され、メソッド、およびJava Virtual Machine命令セットの16ビットローカル変数インデックス付けによる。
乾杯、
変更されていません。メソッドのコードの制限は、Java 7およびJava 8。
参照:
Javaクラスファイルの仮想マシンコードの静的制約は、Java仮想マシンの命令をコード配列に配置する必要があり、どのオペランドが個別の指示が必要です。
コード配列内の命令の静的制約は次のとおりです。
- コード配列は空にしないでください。そのため、code_lengthアイテムの値を0にすることはできません。
- Code_lengthアイテムの値は65536未満でなければなりません。
Code_lengthアイテムの値は、このメソッドのコード配列のバイト数を示します。
Code_lengthの値は、ゼロより大きく(コード配列が空であってはならないため)、65536未満でなければなりません。
AndremoniyはJava 7
すでにこの質問の一部ですが、その時点でJava 8
だから、その部分をカバーするために答えを完成させます。
jvms からの引用:
End_pcが排他的であるという事実は、Java仮想マシン:メソッドのJava仮想マシンコードが正確に65535バイトの場合コンパイラーの作成者は、生成されるJava Virtualの最大サイズを制限することにより、このバグを回避できます。任意のメソッド、インスタンス初期化メソッド、または静的初期化子(任意のコード配列のサイズ)のマシンコードは65534バイトです。
ご覧のように、この歴史的な問題は少なくともこのバージョン(Java 8)では改善されていないようです。