「命令型プログラミング」の版間の差分

削除された内容 追加された内容
Sycgln (会話 | 投稿記録)
Olivelana (会話 | 投稿記録)
見出し
(同じ利用者による、間の3版が非表示)
2行目:
{{No footnotes|date=2021年3月}}{{プログラミング・パラダイム}}
 
'''命令型プログラミング'''({{lang-en-short|Imperative Programming}})は、[[プロセス|プログラム]]の{{仮リンク|状態(計算機科学)|en|State (computer science)|label=状態}}を変化させる[[文 (プログラミング)|ステートメント]]を基本文に用いる総称的な[[プログラミングパラダイム]]であり、現在る。ステートメントでは主に[[コマンド (コンピュータ)|コマンド]](命令文)が多用される。[[宣言型プログラミング]]と対をなしての[[プログラミング言語]]の分類用語として扱われている。その対義語は[[宣言型プログラミング]]である。宣言型が[[数学]]性質に沿っているのに対して、命令型は[[ノイマン型コンピュータプログラミング]]向けの[[計算機科学]]特有の性質に沿っている。命令型の定義は、[[プログラム (コンピュータ)|プログラム]][[プロセス]]の状態(state)を変更できる性質のプログラム基本文である[[ステートメント]](statement)を扱っているとであり、そプログダイ構成現行計算枠外の状態を変更するための[[コマンド (コンピュータ)|コンピュータコマンド]]が多くなる。[[手続き型プログラミング|手続き型]]、[[構造化プログラミング|構造化]]、{{仮リンク|モジュラープログラミング|en|Modular programming|label=モジュラー}}、[[オブジェクト指向プログラミング|オブジェクト指向]]などが命令型プログラミングに分類されを包括している。
 
[[文 (プログラミング)|ステートメント]]上の[[コマンド (コンピュータ)|コマンド]]で状態は変化され、変化した状態の参照でステートメントの動作も変化することは[[副作用 (プログラム)|副作用]]と呼ばれる。コマンドと副作用の存在によって命令型プログラミングは、各[[サブルーチン|オペレータ]]を状態の遷移と照らし合わせて解釈することになる。このことから命令型はhow a program operates(どう処理するか)と形容される。
==宣言型と命令型と手続き型==
一般的に命令型は、how a program operates(どう処理するか)と形容され、宣言型は、what the program must accomplish(何を為すべきか)と形容されている。これらはプログラム基本文の性質およびプロセス状態の扱い方の違いを表わしている。
 
[[宣言型プログラミング]]の基本文の[[式 (プログラミング)|式]]の方針は、コマンドと副作用を持たないことなので、そこでの[[参照透過性|参照透過]]な各オペレータは、その定義のままに把握できる。このことから宣言型はwhat a program accomplishes(なにを果たすか)と形容される。
宣言型、命令型、手続き型の違いを、商品代金計算に例えると以下のようになる。ここでは + がオペレータである。円は型(type)である。特典ポイント5%と消費税10%のルールは計算式外部の状態(state)に記憶されている。
 
==宣言型と命令型と手続き型==
宣言型命令型手続き型の違いを、商品代金計算に例えると以下のようになる。ここでは + がオペレータである。円は型(type)(演算子・関数・手続き・ルーチン)である。特典ポイント5%と消費税10%のルールは計算式外部の状態(state)に記憶されている。
 
* 宣言型は、100円+200円の問いに、300円の答えを出す。状態は見ない。
13 ⟶ 15行目:
* 手続き型は、100円+200円の問いに、状態からの消費税10%を加算して場合によっては以前の15ポイントを割り引いた315円の答えを出す。
 
[[宣言型プログラミング|宣言型]]は、+をただ数を足す計算にしており、当たり前に聞こえるがこれが数学的と言われる。ゆえにdeclarative([[宣言型の基本文は[[式 (プログラミング)的知識|宣言的]]とされた。declarative(宣言型)とは計算の平叙性を意味している。おり、オペレータの働き計算をその定義のままに把握できるので、これが「何を為すべきか」になる。
 
命令型は、100+200答えの、5%特典を計算式外部の状態に記憶させている。この計算式枠外の状態を変させるという計算は、従来の数学には当然無いものなのでこれがimperative(命令的と言われた。答えを出さずに状態変化のコマンド変更させ用いるだけの計算式も書けた。状態の関与でオペレータの働きが左右されることから、これが「どう処理するか」になる。この特徴による命令型の基本文は[[ステートメント]]とされて、数学的には[[式 (プログラミング)|式]]の[[直積集合|直積]]と解釈される。
 
元々の[[手続き型プログラミング|手続き型]]は、計算式100+200の答えを、状態影響で変化する消費税いう仕組みを意味照らており、計算の実行に合わせて解釈して330にする。計算枠外の状態も鑑みられを吟味しつつオペレータの計算を進めのがprocedural([[手続き的知識|手続き的]])から、こ言わも「どう処理すか」。更それがその時の状態内のポイントの多さで315や305にもなる。変動する状態遷移がオペレータ答えへ結果にも反映される影響波及は[[副作用 (プログラム)|プログラム副作用]]と言われる。それに対しての宣言型は、状態に影響されずに同じ問いへの答えが不変であるという仕組みを意味しており、これは[[参照透過性]]と言われる。計算式が状態を変化させることと計算式が状態の影響を受けることはコンピュータ運用上は通常セットになるので、命令型と手続き型は後に同じ意味で融合的に扱われるようになった。手続き型がしばしば、命令文を次実行していくや記憶領域に値を代入して状態を変化させていくなどと説明されるのはこのためである。状態による計算式副作用処理内容および答えの変遷活用は、より小さなメモリ容量でのより効率的なプログラムの[[複雑系]]的セス拡充をもたらたので、命令型プロセスパラダイムは[[ノイマン型コンピュータ]]プログラムの基本になった。
命令型は、100円+200円の5%特典を計算式外部の状態に記憶させている。この計算式枠外の状態を変更させるという計算は、従来の数学には当然無いものなので、これが命令的と言われた。答えを出さずに状態を変更させるだけの計算式も書けた。状態の関与でオペレータの働きが左右されることから、これが「どう処理するか」になる。この特徴による命令型の基本文は[[ステートメント]]とされて、数学的には[[式 (プログラミング)|式]]の[[直積集合|直積]]と解釈される。
 
なお、一般的なプログラミング視点での[[手続き型プログラミング|手続き型]]は、命令型プログラムに[[プロシージャ|手続き]]の定義と呼び出しの機能を加えて、構造性とモジュール性を備えさせた[[プログラミングパラダイム|パラダイム]]を意味している。[[高水準言語]]の普及後はこの意味の方が一般的になった。
元々の[[手続き型プログラミング|手続き型]]は、計算式の答えが状態の影響で変化するという仕組みを意味しており、計算の実行に合わせて計算枠外の状態も鑑みられることから、これも「どう処理するか」になる。変動する状態の答えへの影響波及は[[副作用 (プログラム)|プログラム副作用]]と言われる。それに対しての宣言型は、状態に影響されずに同じ問いへの答えが不変であるという仕組みを意味しており、これは[[参照透過性]]と言われる。計算式が状態を変えることと計算式が状態の影響を受けることはコンピュータ運用上はセットになるので、命令型と手続き型は後に同じ意味で扱われるようになった。手続き型がしばしば、命令文を逐次実行していくや記憶領域に値を代入して状態を変えていくなどと説明されるのはこのためである。状態による計算式の処理内容および答えの変遷は、プログラムの[[複雑系]]的拡充をもたらしたので、命令型プロセスは[[ノイマン型コンピュータ]]の基本になった。
 
命令型に対する[[宣言型プログラミング|宣言型]]というプログラミング理論構図が重視され始めたのは1970年代からであり、[[副作用 (プログラム)|副作用]]によるオペレータのブラックボックス化偏重への見直しがその動機になっている。[[副作用 (プログラム)|副作用]]を前提にした命令型に対して、[[参照透過性]]を前提にしてオペレータのホワイトボックス化を重視しているのが[[宣言型プログラミング|宣言型]]である。
なお、一般的なプログラミング視点での[[手続き型プログラミング|手続き型]]は、命令型プログラムに[[手続き]]の定義と呼び出しの機能を加えて、構造性とモジュール性を備えさせた[[プログラミングパラダイム|パラダイム]]を意味している。[[高水準言語]]の普及後はこの意味の方が一般的になった。
 
命令型に対する[[宣言型プログラミング|宣言型]]というプログラミング理論構図が重視され始めたのは1970年代からであり、状態による計算の複雑性がもたらした手続きのブラックボックス化偏重への見直しがその主な動機になっている。[[副作用 (プログラム)|プログラム副作用]]に寛容な命令型プログラミングに対して、入力と出力の一貫性を保証する[[参照透過性]]に厳格なプログラミングが[[宣言型プログラミング|宣言型]]と呼ばれた。なお、冒頭の状態を見ないという宣言型の説明ではまともなプログラムも作れないように思えるが、宣言型では問いと答えに状態も含めてしまうという方命令型と同等の表現を可能にしている。そこで用いられるのが[[型理部分構造]]由来の派生{{仮リンク|部分構造型システム|en|Substructural type system}}や[[圏論]]由来の[[モナド (プログラミング)|モナド]]であり、詳細は割愛するが参照透過性もそれで維持される。従って補正するとこうなる。
 
* 宣言型は、(100円&状態)+200円の問いに、引数状態からの消費税10%を加算して返り値状態に特典15ポイントを収めた(330円&状態)の答えを出す。
 
== 命令型プログラムの概要 ==
31 ⟶ 35行目:
 
==命令型言語の歴史==
最初の命令型言語はコンピュータ本来の[[機械語]]であった。1949年に機械コードを[[ニーモニック]]に置き換えた[[低水準言語]]の[[アセンブリ言語|アセンブラ]]が登場した。機械語とアセンブラの命令は非常に単純であり、ハードウェアの実装は容易になっていたが、複雑なプログラムの作成は困難だった。1954年から[[IBM]]の[[ジョン・バッカス]]が、初の[[高水準言語]]「[[FORTRAN]]」を開発した。FORTRANは機械語やアセンブラでの複雑なプログラム作成の困難さを克服する最初主要な[[高水準言語]]であった。FORTRANはコンパイル式の手続き型言語であり、名前付きの変数、ニーモニックよりずっと複雑な式、サブプログラムといった命令型言語に共通の各種機能が利用可能であった。1958年から1960年代にかけて数学的アルゴリズムをより表現し易くする目的で手続き型言語「[[ALGOL]]」が開発された。[[手続き]]と[[制御構造|制御フロー構文]]の導入で洗練されたALGOLは、[[バロース B5000|バロースB5000]]などのコンピュータ用[[オペレーティングシステム|OS]]制作にも使われた。1959年から開発された事務処理用の「[[COBOL]]」と、1964年に制作された教育用の「[[BASIC]]」はどちらもソースコードを人間の可読性に合わせたテキスト寄りにした。1970年には[[ニクラウス・ヴィルト]]が開発した構造化言語「[[Pascal]]」が公開された。1972年に[[ベル研究所]]の[[デニス・リッチー]]が開発した「[[C言語]]」が登場した。ヴィルトは1975年から80年代にかけてモジュラ言語「[[Modula-2|Modula]]」「[[Oberon-2|Oberon]]」を設計している。1978年から[[アメリカ国防総省]]の要求で[[ハネウェル]]のチームが新言語の策定を開始し、マルチパラダイム手続き型言語「[[Ada]]」が1983年に満を持して初回公開された。
 
1980年代になると[[オブジェクト指向プログラミング|オブジェクト指向]]が急成長を遂げた。オブジェクト指向言語の多くは命令型のスタイルであるが、[[オブジェクト (プログラミング)|オブジェクト]]を扱う機能が追加されている。1967年から開発されていた初のオブジェクト指向言語「[[Simula]]」や、Simulaを参考にして[[ビャーネ・ストロヴストルップ]]が1979年から[[C言語]]を拡張設計した「[[C++]]」がある。[[C++]]の登場は1983年で最初の実装は1985年である。1980年代後半から1990年代にかけてはオブジェクト指向のコンセプトを導入した命令型言語が次々と登場した。
41 ⟶ 45行目:
==関連項目==
*[[ノイマン型コンピュータ]]
*[[コマンド (コンピュータ)|コマンド]]
*[[副作用 (プログラム)|副作用]]
*[[操作的意味論]]
*[[機械語]]
*[[アセンブリ言語]]