Javaはメソッド内のローカル変数の個数が65534個までならコンパイルできる
JVMの仕様書の4.11節に,
The greatest number of local variables in the local variables array of a frame created upon invocation of a method (§2.6) is limited to 65535 ... (メソッド呼び出し時に生成されるフレームは local variables arrayを持っており,そこにローカル変数が含まれていますが,そのローカル変数の個数は最大で65535個に制限されています.)
と書いてあったので,実際のところメソッド内でローカル変数は幾つまでならコンパイルできるのか,調べてみます.
メソッド内に定義できるローカル変数の最大の個数を調べる
今回は AdoptOpenJDK 16.0.0.hs
を使います.
指定した個数のローカル変数定義を含むようなJavaコードを,以下のpythonの簡単なスクリプトで生成します.
ではまず,65535個のローカル変数定義を含む場合です.
$ mkdir main $ python make_code_with_many_local_variables.py -n 65535 --out main/Main.java && javac main/Main.java && java main.Main main/Main.java:5: エラー: ローカル変数が多すぎます public static void main(String[] args) { ^ エラー1個
確かにコンパイルエラーが出ます.
次に,一つ減らして65534個の場合を試してみます.
$ python make_code_with_many_local_variables.py -n 65534 --out main/Main.java && javac main/Main.java && java main.Main hello, world!
コンパイルが通り,実行も出来ました.メソッド内では65534個までローカル変数を定義できるようです.
仕様書よりも一つ数が小さい件については,現在調査中です. local variable arrayの一つは,メソッド内のローカル変数以外に使われているのかなと想像しています.