メインコンテンツまでスキップ

書き方の指針

このページは文法上の制約ではなく,コードを読み返しやすくするための書き方を示します。

一行に一命令を書く

クラス,メソッド,命令の順にインデントを下げます。ラベルは命令より一段上げ,メソッド宣言と同じ深さに置きます。

public class Example (major_version=55, minor_version=0) {
public static positive(I)Z {
iload_0
ifle NonPositive
iconst_1
ireturn
NonPositive:
iconst_0
ireturn
}
}

この例は,引数が正なら 1,0 以下なら 0 を返します。

NonPositive のように条件や役割を表すラベル名にすると,ジャンプ先の意味を確認しやすくなります。自動生成された L1 などの名前を必ず変える必要はありません。

保存する値に名前を付ける

public static length()I {
ldc "ready"
astore_0 [Ljava/lang/String; -> message]
aload message
invokevirtual java/lang/String->length()I
ireturn
}

引数,ループ変数,例外など,何度も参照する値には名前が役立ちます。直後に一度使うだけのスタック上の値を,名前を付けるためだけにローカル変数へ保存する必要はありません。

コメントには理由を残す

iconst_3
newarray I
// 要素への代入後にも配列を使うため,参照を残す。
dup
iconst_0
bipush 42
iastore

dup を「複製する」と言い換えるより,この位置で複製する理由を書くと読み手の助けになります。学習用の例では,スタックの並びや Java での対応を書くことも有用です。

合流点を見失わない

分岐先では,どの経路から来ても必要な値がそろうようにします。多くの値をスタックに残したまま分岐させて追いづらくなる場合は,途中結果をローカル変数へ保存する方法もあります。

まとまった計算を別メソッドへ分けると,記述子で入力と出力を表せます。ただし,命令数を減らすこと自体が目的ではありません。呼び出しを追う手間と,メソッド内部を読む手間の両方を考えて分けます。

Jaspera の整形コマンドで空白やインデントをそろえられます。整形は命令列の誤りを修正しないため,分岐や型の確認は 検証の説明と合わせて行ってください。