非構造化プログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

非構造化プログラミング(ひこうぞうかぷろぐらみんぐ)は全てのコードが一つの連続したブロックに含まれているプログラミングパラダイムの一種。プログラムのタスクが必要に応じていつでも呼び出せる小さな部分(関数やサブルーチン)に分けられている構造化プログラミングとは逆である。非構造化プログラミング言語はgoto文のような実行フロー文に依存し、多くの言語で指定されたコードの部分へ飛ぶのに使われている。

非構造化ソースコードは可読性が低くデバッグすることが難しい。そのため、何らかの構造をサポートするプログラミング言語では使われない手法である。しかし、条件文とgoto文の組合せによって任意のプログラム構造が実装可能であり、理論上はプログラミング言語にそれ以外の制御構造は必要ない。非構造化プログラミングはまだMS-DOSバッチファイルのようなスクリプト言語やBASICFORTRAN 66のような古いプログラミング言語で使われている。goto文(ジャンプ)は呼び出し手続きより僅かに性能が高いとはいうものの、現在のCPUアーキテクチャでは無視して良い程度になった。実際、不適切なそのような文の使用はコードを混乱させたりコンパイラ最適化を阻害してしまい、有害である場合がある。

アセンブリ言語はほとんどが非構造化言語である。なぜなら基本的な機械語には構造が決して無いからである。それが持つ唯一の構造は、基本的な(スタックベースのマシンによくある)「サブルーチンジャンプ; Jump to Subroutine」命令や、関数の始めと終わりを示すなどのコンパイラなどが必要とする記述だけである。

現代の用途[編集]

現代のプログラミングの多くは構造化されている。しかし、構造化パラダイムでは制限が強すぎることがあり、一部のロジックは非構造化の方が簡単に表現できる(構造化プログラミングを参照)。

例として、リターン文がある。関数からのリターンは残りのコードを実行せずに当該関数から復帰させる。これは非構造化パラダイムの一種であり、構造化プログラミング言語でも広く採用されている。同様のことはループからの脱出などにも当てはまる。

また、例外処理継続も非構造化パラダイムの例である。継続は Goto 文の機能を汎用化したものと言える。

構造化プログラムの構造を関数の木構造として捉えた場合:

  • リターンによって現在いるノードからひとつ上に脱出する
  • 例外によってキャッチされるまでノードを上に辿る
  • 継続によって以前訪れた別のノードに移動する

といった捉え方ができる。

関連項目[編集]