ラベル (プログラミング)
プログラミング言語において、ラベル(英: label)とは特定の文を表すために付けられる識別子である。一般に、goto文によるジャンプ先や、switch文による分岐先といった、処理制御の移動先を指定する場合などに用いられる。
概要
[編集]古典的BASICでは、行番号自体がラベルになっている。BASICのGOTO
文はジャンプ先の指定にこの行番号を利用し、サブルーチン呼び出しのGOSUB
文でも行番号を指定するが、goto文はサブルーチンを飛び越えた大域ジャンプも可能であるなど、制御の流れの把握が困難となる「スパゲッティプログラム」や不具合(バグ)の原因となりやすかった[1]。後発のPascalやCといった構造化プログラミングに対応した言語(構造化言語)では、if文やfor文、サブルーチン呼び出しと復帰といった制御構造の記述構文が高度に抽象化されたことによって、行番号が不要となり、ジャンプの意図が不明瞭になりがちなgoto文をほとんど必要としなくなった。ラベルを使用したgoto文自体は機能として提供されているものの、ジャンプ先として指定できるのは同じサブルーチン内に記述されたラベルのみであり、サブルーチンを飛び越える大域ジャンプはできなくなっている。なお、多重ループから一度に抜けるときや、サブルーチンを抜ける前の後始末処理を一か所でまとめて記述するときは、goto文を使ったほうが簡潔かつ低コストで書けることもある。
Javaにはgoto文は存在しないが、ラベル付きbreak文が用意されており、多重ループからの脱出などに限定して使うことができる(機能制限されたgoto文の一種とも言える)。
C系言語のswitch文による分岐では、比較対象である整数定数を持つcase
ラベルと、それ以外に該当するdefault
ラベルを文または複文に対して指定することができる[2]。
Pascalでの例:
procedure GotoExample(a: array of Integer);
label
100; { ラベルを宣言する }
var
i: Integer;
begin
for i := Low(a) to High(a) do begin
if a[i] < 0 then begin
WriteLn('Negative number found at: ', i);
WriteLn('Value = ', a[i]);
goto 100
end
end;
WriteLn('Negative number not found.');
100:
WriteLn('End of procedure.') { これがラベルのついた文 }
end;
ISO標準PascalにはCのreturn文に相当する構文がない。ただしモダンなPascal/Object Pascal処理系ではExit
手続きやBreak
手続きがサポートされるため、上記のようにラベルとgoto文を使う必要はない[3][4][5][6]。
procedure CaseExample(x: Integer);
begin
case x of
2, 3, 5, 7:
WriteLn('A prime number less than 10.');
42:
WriteLn('The answer.');
else { 処理系によっては otherwise も使用可能 }
WriteLn('The others.')
end
end;
また、サブルーチンのエントリポイントを明示しない言語では、ラベルが事実上サブルーチンのエントリポイントを示すことがある。
古典的REXXでの例:
/* An Example */
...
IF ... THEN SIGNAL fatalError ELSE CALL whatTodo
...
whatTodo: /* ラベル */
ARG ...
...
RETURN
fatalError: /* ラベル */
SAY 'もう駄目。落ちます。'
EXIT