命令型プログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』

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

命令型プログラミング: Imperative Programming)は、総称的なプログラミングパラダイムであり、現在では主にプログラミング言語の分類用語として扱われている。その対義語は宣言型プログラミングである。宣言型が数学の性質に沿っているのに対して、命令型はコンピュータプログラミング向けの計算機科学特有の性質に沿っている。命令型の定義は、プログラムプロセスの状態(state)を変更できる性質のプログラム基本文であるステートメント(statement)を扱っていることであり、そのプログラム構成は現行計算枠外の状態を変更するためのコンピュータコマンドが多くなる。手続き型構造化、モジュラル、オブジェクト指向などが命令型プログラミングに分類されている。

宣言型と命令型と手続き型[編集]

一般的に命令型は、how a program operates(どう処理するか)と形容され、宣言型は、what the program must accomplish(何を為すべきか)と形容されている。これらはプログラム基本文の性質およびプロセス状態の扱い方の違いを表わしている。

宣言型、命令型、手続き型の違いを、商品代金計算に例えると以下のようになる。ここでは + がオペレータである。円は型(type)である。特典ポイント5%と消費税10%のルールは計算式外部の状態(state)に記憶されている。

  • 宣言型は、100円+200円の問いに、300円の答えを出す。状態は見ない。
  • 命令型は、100円+200円の問いに、300円の答えを出して5%特典による15ポイントを状態に記憶させる。
  • 手続き型は、100円+200円の問いに、状態からの消費税10%を加算して場合によっては以前の15ポイントを割り引いた315円の答えを出す。

宣言型は、+をただ数を足す計算にしており、当たり前に聞こえるがこれが数学的と言われる。ゆえに宣言型の基本文はとされた。declarative(宣言型)とは計算の平叙性を意味している。オペレータの働きをその定義のままに把握できるので、これが「何を為すべきか」になる。

命令型は、100円+200円の5%特典を計算式外部の状態に記憶させている。この計算式枠外の状態を変更させるという計算は、従来の数学には当然無いものなので、これが命令的と言われた。答えを出さずに状態を変更させるだけの計算式も書けた。状態の関与でオペレータの働きが左右されることから、これが「どう処理するか」になる。この特徴による命令型の基本文はステートメントとされて、数学的には直積と解釈される。

元々の手続き型は、計算式の答えが状態の影響で変化するという仕組みを意味しており、計算の実行に合わせて計算枠外の状態も鑑みられることから、これも「どう処理するか」になる。変動する状態の答えへの影響波及はプログラム副作用と言われる。それに対しての宣言型は、状態に影響されずに同じ問いへの答えが不変であるという仕組みを意味しており、これは参照透過性と言われる。計算式が状態を変えることと計算式が状態の影響を受けることはコンピュータ運用上はセットになるので、命令型と手続き型は後に同じ意味で扱われるようになった。手続き型がしばしば、命令文を逐次実行していくや記憶領域に値を代入して状態を変えていくなどと説明されるのはこのためである。状態による計算式の処理内容および答えの変遷は、プログラムの複雑系的拡充をもたらしたので、命令型プロセスはノイマン型コンピュータの基本になった。

なお、一般的なプログラミング視点での手続き型は、命令型プログラムに手続きの定義と呼び出しの機能を加えて、構造性とモジュール性を備えさせたパラダイムを意味している。高水準言語の普及後はこの意味の方が一般的になった。

命令型に対する宣言型というプログラミング理論構図が重視され始めたのは1970年代からであり、状態による計算の複雑性がもたらした手続きのブラックボックス化偏重への見直しがその主な動機になっている。プログラム副作用に寛容な命令型プログラミングに対して、入力と出力の一貫性を保証する参照透過性に厳格なプログラミングが宣言型と呼ばれた。なお、冒頭の状態を見ないという宣言型の説明ではまともなプログラムも作れないように思えるが、宣言型では問いと答えに状態も含めてしまうという方式で命令型と同等の表現を可能にしている。そこで用いられるのが型理論由来の派生構造型システムや圏論由来のモナドであり、詳細は割愛するが参照透過性もそれで維持される。従って補正するとこうなる。

  • 宣言型は、(100円&状態)+200円の問いに、引数状態からの消費税10%を加算して返り値状態に特典15ポイントを収めた(330円&状態)の答えを出す。

命令型プログラムの概要[編集]

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

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

命令型言語の歴史[編集]

最初の命令型言語はコンピュータ本来の機械語であった。1949年に機械コードをニーモニックに置き換えた低水準言語アセンブラが登場した。機械語とアセンブラの命令は非常に単純であり、ハードウェアの実装は容易になっていたが、複雑なプログラムの作成は困難だった。1954年からIBMジョン・バッカスが「FORTRAN」を開発した。FORTRANは機械語での複雑なプログラム作成の困難さを克服した最初の主要な高水準言語である。FORTRANはコンパイル式の手続き型言語であり、名前付きの変数、ニーモニックよりずっと複雑な式、サブプログラムといった命令型言語に共通の各種機能が利用可能であった。1958年から1960年代にかけて数学的アルゴリズムをより表現し易くする目的で「ALGOL」が開発された。手続き制御フロー構文の導入で洗練されたALGOLは、バロースB5000などのコンピュータ用OS制作にも使われた。1959年から開発された事務処理用の「COBOL」と、1964年に制作された教育用の「BASIC」はどちらもソースコードを人間の可読性に合わせたテキスト寄りにした。1970年にはニクラウス・ヴィルトが開発した構造化言語「Pascal」が公開された。1972年にベル研究所デニス・リッチーが開発した「C言語」が登場した。ヴィルトは1975年から80年代にかけてモジュラル言語「Modula」「Oberon」を設計している。1978年からアメリカ国防総省の要求でハネウェルのチームが新言語の策定を開始し、マルチパラダイム手続き型言語「Ada」が1983年に満を持して初回公開された。

1980年代になるとオブジェクト指向が急成長を遂げた。オブジェクト指向言語の多くは命令型のスタイルであるが、オブジェクトを扱う機能が追加されている。1967年から開発されていた初のオブジェクト指向言語「Simula」や、Simulaを参考にしてビャーネ・ストロヴストルップが1979年からC言語を拡張設計した「C++」がある。C++の登場は1983年で最初の実装は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.

関連項目[編集]