命令型プログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

命令型プログラミング: Imperative Programming)は、総称的に用いられるプログラミングパラダイムであり、プログラミング言語の分類用法のほか、特定の言語仕様を指す用語としても使われる。対義語である宣言型プログラミングとの対比概念としてよく用いられる。数学形式論理の性質を引き継いでいる宣言型とは異なり、命令型はコンピュータプログラミングに特化した計算機科学特有の性質を持つ。オートマタ理論的には非決定性チューリングマシンに沿っている。

「プログラム内のあらゆるオペレーションは、外的状態の影響を無制限に受け、入力に対する処理内容と出力結果は一定でなく、入力や出力を持たずに外的状態に依存した処理も行われ、外的状態も変更されて新たな影響内容になる」といった計算性質のプロセス全般を指して手続き的(procedural)と言われ、その手続き的性質に沿ったプログラム基本文であるステートメントを採用した言語仕様を指して命令的(imperative)と言われた事がこのパラダイム名の由来になっている。外的状態の変更によるプロセスへの影響波及は副作用と呼ばれるものである。引数と返り値に重点を置いている宣言型に対して、命令型ではサブルーチン処理内容に焦点を当てているとも言える。

来歴[編集]

命令型プログラミングは、プログラミング言語のための分類用語としての性格が強い総称的なプログラミングパラダイムなので、どうしてそのような分類が必要になったのかという視点から解釈するのが理解への早道になる。宣言型と対をなす命令型という概念が生まれた背景には、数学や形式論理学数理論理学)をバックボーンにしたコンピュータ原理とプログラミング言語理論の成立過程がある。あらゆる問題への解法において、数学や形式論理学の性質を引き継いでいる従来の方式は宣言的または平叙的と言われ、計算機科学が持つようになった特有の方式は命令的または手続き的と言われた。宣言的な計算は問題と解答の二者限定の平叙関係であるのに対して、その平叙関係に状態(state)というものが加えられて平叙で無くなった計算の方は手続き的とされた。平叙な計算は問題への解答が一定であるのに対し、手続きな計算では同じ問題でも状態によって解答が変わった。”状態”の影響が無い平叙な計算と、”状態”に影響される手続き的な計算はコンピュータ計算性質の根本的な分かれ目になったので、前者の宣言型と後者の命令型というプログラミング理論上の二大分類が生まれた。

オートマタ理論的には、計算は遷移関数(transition function)、問題は入力値、解答は出力値、状態は遷移関数の非決定性に読み替えられる。プログラム的には、計算はサブルーチン、問題は引数、解答は返り値、状態はサブルーチン内外の静的メモリデータに読み替えられる。状態による計算の複雑性の拡充は、ノイマン型のコンピュータ機構に適したものだったので機械語低水準言語アセンブラ)はその必要性から命令型で構築された。また最初期の高水準言語FORTRANCOBOLALGOL)もノイマン型の性質に適した命令型になった。BASICPascalC言語といった広く普及した言語も命令型であり、1980年代半ばから隆盛したオブジェクト指向言語も命令型であるので、命令型はプログラミング言語の主流であり続けた。

命令型に対する宣言型というプログラミング理論構図が世間に認識され、また重視され始めたのは1970年代半ばからであり、前述の「状態による計算の複雑性」がもたらしたサブルーチンのブラックボックス化偏重に対する見直しがその主な動機になっている。副作用に寛容な命令型プログラミングに対して、入力に対する出力の一貫性を保証する参照透過性を中心にしたプログラミングが宣言型と呼ばれた。

概要[編集]

ほとんど全てのコンピュータのハードウェア実装は命令型である。ほぼ全てのコンピュータハードウェアは機械語を実行するよう設計されており、機械語は命令から構成される。このような低レベルから見た場合、プログラムの状態はメモリの内容によって定義され、文としては機械語の命令が相当する。高級な命令型言語は変数や他の複雑な構文を使用可能となっているが、基本的に同じパラダイムである。レシピやチェックリストはプログラムではないが、命令型プログラミングのスタイルに似たコンセプトである。それらのステップが命令であり、実世界が状態を保持している。命令型プログラミングの基本的考え方はハードウェアの実装に近く、概念的にもなじみ深いため、多くのコンピュータ言語が命令型のスタイルである。

代入文は一般にメモリ上のある位置に存在する情報への操作であり、結果を後で使用するためにメモリ上に格納する。高級命令型言語ではさらに複雑な式の評価が可能となっており、算術操作や関数評価の組み合わせによる式が可能で、その計算結果をメモリに格納する。ループ文は文の並びを繰り返し実行させる。ループは、事前に決められた回数だけ繰り返す場合と、指定された条件が変化するまで繰り返す場合がある。条件分岐文は、何らかの条件が成り立ったときだけ指定された文の並び(ブロック)を実行する。条件が成り立たない場合、そのブロックはスキップされ、その次の文から処理が続行される。無条件分岐文は制御をプログラム内の別の箇所に転送する。無条件分岐には、多くの言語にあるGoto文、サブプログラム、プロシージャ呼び出しなどがある。

命令型言語[編集]

最初の命令型言語はコンピュータ本来の機械語であった。機械語の命令は非常に単純であり、ハードウェアの実装は容易になっていたが、複雑なプログラムの作成は困難だった。IBMジョン・バッカスは1954年からFORTRANの開発を開始した。FORTRAN は機械語での複雑なプログラム作成の困難さを克服した最初の主要なプログラミング言語である。FORTRAN はコンパイル言語であり、名前付きの変数、複雑な式、サブプログラムといった命令型言語に共通の各種機能が利用可能であった。その後20年間、様々な高級命令型プログラミング言語が開発された。1950年代末から1960年代にかけて、数学的アルゴリズムをより表現し易くする目的で ALGOL が開発された。ALGOL は一部のコンピュータではオペレーティングシステムを記述するのにも使われた(バロース B5000)。COBOL(1960年)やBASIC(1964年)はどちらも文法をより英語的にしようとした。1970年代には、ニクラウス・ヴィルトの開発したPascalベル研究所デニス・リッチーの開発したC言語が登場した。ヴィルトはその後、Modula-2Modula-3Oberonなどを設計している。アメリカ国防総省での必要性から、Jean Ichbiah とハネウェルのチームは1978年からAdaの設計を開始し、4年後に言語の要求仕様を定義した。言語仕様は1983年に公表され、その後1995年と2005年に改訂されている。

1980年代、オブジェクト指向プログラミングが急成長を遂げた。オブジェクト指向言語の多くは命令型のスタイルであるが、オブジェクトを扱う機能が追加されている。1960年代後半から開発されていた世界初のオブジェクト指向言語 Simula や、C言語に基づいてビャーネ・ストロヴストルップが設計したC++がある。C++の最初の実装は1985年である。1980年代末から1990年代にかけてはオブジェクト指向のコンセプトを導入した命令型言語が次々と登場した。

参考文献[編集]

  • Pratt, Terrence W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation, 3rd ed. Englewood Cliffs, N.J.: Prentice Hall, 1996.
  • Sebesta, Robert W. Concepts of Programming Languages, 3rd ed. Reading, Mass.: Addison-Wesley Publishing Company, 1996.

関連項目[編集]