ラベル (プログラミング)

プログラミング言語において、ラベル: label)とは特定のを表すために付けられる識別子である。一般に、goto文によるジャンプ先や、switch文による分岐先といった、処理制御の移動先を指定する場合などに用いられる。

概要 編集

古典的BASICでは、行番号自体がラベルになっている。BASICのGOTO文はジャンプ先の指定にこの行番号を利用し、サブルーチン呼び出しのGOSUB文でも行番号を指定するが、goto文はサブルーチンを飛び越えた大域ジャンプも可能であるなど、制御の流れの把握が困難となる「スパゲッティプログラム」や不具合(バグ)の原因となりやすかった[1]。後発のPascalCといった構造化プログラミングに対応した言語(構造化言語)では、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;

Cでの例はgoto文およびswitch文を参照のこと。

また、サブルーチンのエントリポイントを明示しない言語では、ラベルが事実上サブルーチンのエントリポイントを示すことがある。

古典的REXXでの例:

/* An Example */
...
IF ... THEN SIGNAL fatalError ELSE CALL whatTodo
...
whatTodo:  /* ラベル */
ARG ...
...
RETURN

fatalError:  /* ラベル */
SAY 'もう駄目。落ちます。'
EXIT

脚注 編集

関連項目 編集