mofumofu1729の計算機日記

プログラミングの勉強メモや日々の雑記など

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個に制限されています.)

と書いてあったので,実際のところメソッド内でローカル変数は幾つまでならコンパイルできるのか,調べてみます.

docs.oracle.com

メソッド内に定義できるローカル変数の最大の個数を調べる

今回は AdoptOpenJDK 16.0.0.hs を使います.

指定した個数のローカル変数定義を含むようなJavaコードを,以下のpythonの簡単なスクリプトで生成します.

gist.github.com

ではまず,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の一つは,メソッド内のローカル変数以外に使われているのかなと想像しています.