非
構造化プログラミングとは、プログラムの制御フローを、構造化された
制御構造(if文、for文、while文など)ではなく、ラベルとジャンプ命令(goto文など)を直接用いて記述する
プログラミングパラダイムです。
構造化プログラミングが登場する以前のプログラミングでは一般的な手法でしたが、現在では可読性や保守性の低さから、多くの場面で推奨されていません。
非
構造化プログラミングの最も顕著な特徴は、プログラムの流れが直感的でなく、複雑になりやすい点です。goto文を多用することで、プログラムの制御が飛び飛びになり、「スパゲティコード」と呼ばれる、理解しづらいコードになりがちです。そのため、デバッグや修正が非常に困難になります。
さらに、非
構造化プログラミングでは、プログラムの構造が明確に表現されないため、プログラムの規模が大きくなると、全体像を把握することが難しくなります。これは、チームでの開発や、長期的な保守において大きな問題となります。
歴史と現代における利用例
非
構造化プログラミングは、
コンピュータ黎明期から用いられてきました。
アセンブリ言語や、初期の
BASIC、FORTRAN 66などの
プログラミング言語では、構造化された
制御構造が十分に提供されていなかったため、goto文などを用いた非
構造化プログラミングが一般的でした。
現代においては、
構造化プログラミングや
オブジェクト指向プログラミングが主流となり、非
構造化プログラミングはほとんど使用されなくなりました。しかし、
アセンブリ言語など、低レベルのプログラミングでは、ハードウェアを直接制御する必要があるため、依然として非
構造化プログラミングが用いられる場合があります。また、一部の
スクリプト言語や、特定の状況下での効率性向上を目的としたプログラムにおいて、限定的に使用されることもあります。
非
構造化プログラミングは、
構造化プログラミングと対比される概念です。
構造化プログラミングは、プログラムをモジュール化し、
制御構造を明確に定義することで、プログラムの可読性と保守性を高めることを目指すプログラミング手法です。
構造化プログラミングでは、goto文の使用を制限し、if文、for文、while文などの構造化された
制御構造を用いることで、プログラムの流れを分かりやすく、予測しやすくします。これにより、プログラムのデバッグや修正が容易になり、大規模なプログラム開発にも適しています。
現代のプログラミングにおいても、非
構造化プログラミングの要素が完全に排除されているわけではありません。例えば、例外処理や、関数からの早期リターンなどは、プログラムの流れをある程度非構造的に変更する機能です。しかし、これらの機能は、適切に制御することで、プログラムの可読性を損なうことなく、柔軟なプログラム設計を可能にします。
純粋関数型プログラミングにおいては、状態を持たない関数の性質上、あらゆる箇所で「途中リターン」が発生しても、プログラムの理解や保守に問題が生じません。手続き型言語でも、純粋な関数であれば、途中リターンは可読性向上に繋がり、むしろ構造化されているとも言えます。従って、コーディング規則で安易に「途中リターン禁止」とするのは、
構造化プログラミングの本質を理解していない証拠と言えるでしょう。
まとめ
非
構造化プログラミングは、歴史的には重要なプログラミング手法ですが、現代では可読性と保守性の問題から、一般的には推奨されていません。
構造化プログラミングや
オブジェクト指向プログラミングなど、より高度なプログラミング手法が主流となっています。しかし、
アセンブリ言語など、低レベルのプログラミングや、特殊な状況下では、依然として非
構造化プログラミングが用いられる場合があります。現代のプログラミングにおいても、例外処理や関数からの早期リターンなど、非
構造化プログラミングの要素は存在しますが、適切な制御が求められます。
関連項目
goto文
構造化プログラミング
オブジェクト指向プログラミング
スパゲティプログラム
*
プログラミングパラダイム