非構造化プログラミング
非構造化プログラミング(ひこうぞうかプログラミング)とは、いわゆる「構造化プログラミング」に対するレトロニムのようなものであり、「構造化された制御構造」ではないラベルと分岐命令を直接使うようなプログラミングパラダイムである。
非構造化プログラムは可読性が低くデバッグすることが難しい。そのため、何らかの構造をサポートするプログラミング言語では使われない手法である。しかし、条件文とgoto文の組合せによって任意のプログラム構造が実装可能であり、理論上はプログラミング言語にそれ以外の制御構造は必要ない。非構造化プログラミングはまだMS-DOSのバッチファイルのようなスクリプト言語やBASICやFORTRAN 66のような古いプログラミング言語で使われている。goto文(ジャンプ)は呼び出し手続きより僅かに性能が高いとはいうものの、現在のCPUアーキテクチャでは無視して良い程度になった。実際、不適切なそのような文の使用はコードを混乱させたりコンパイラ最適化を阻害してしまい、有害である場合がある。
アセンブリ言語はほとんどが非構造化言語である。なぜなら基本的な機械語には構造が決して無いからである。それが持つ唯一の構造は、基本的な(スタックベースのマシンによくある)「サブルーチンジャンプ; Jump to Subroutine」命令や、関数の始めと終わりを示すなどのコンパイラなどが必要とする記述だけである。
現代の用途
[編集]現代のプログラミングの多くは構造化されている。しかし、構造化パラダイムでは制限が強すぎることがあり、一部のロジックは非構造化の方が簡単に表現できる(構造化プログラミングを参照)。
例として、リターン文がある。関数からのリターンは残りのコードを実行せずに当該関数から復帰させる。これは非構造化パラダイムの一種であり、構造化プログラミング言語でも広く採用されている。同様のことはループからの脱出などにも当てはまる。
一方で、純粋関数型言語では、あらゆる場所が「途中リターン」になっているようなものと言え、手続き型言語中でも純粋な関数であれば、むしろ途中リターンで書いたほうが単純でわかりやすくむしろ構造化されているとも言える。つまり表面的なコーディング規則で教条的に「途中リターン禁止」などとするのは、構造化というものを全くわかっていない証拠でもある。
また、例外処理や継続も非構造化パラダイムの例である。継続は Goto 文の機能を汎用化したものと言える。