手続き型プログラミングとは? わかりやすく解説

Weblio 辞書 > 同じ種類の言葉 > 情報 > コンピュータ > プログラミング > 手続き型プログラミングの意味・解説 

手続き型プログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/04/06 15:55 UTC 版)

手続き型プログラミング(てつづきがたプログラミング、: procedural programming)は、コンピュータが実行すべき命令や手続き(プロシージャ)を順に記述していくことでプログラムを構成するスタイルのプログラミングパラダイムである[1]。この「手続き」とは分類便宜上の用語であり、プログラミング言語によってはサブルーチン関数メソッドとも呼ばれているが、手続き型パラダイムの観点からは概ね同一視される。手続きはプログラム全体を区画した部分プログラムでもあり、一定量の計算ステップまたは命令コードのまとまりを、任意の定義名に結び付けて識別化したコードユニットである。手続き型プログラミングは命令型プログラミングの分類に属しており、厳密には命令型の部分集合だが、同一視されることもある[2][3]。手続きの定義と呼び出しの機能をサポートし、プログラム全体を組み立てる土台とする言語を手続き型言語と呼ぶ。1958年のFORTRAN IIALGOLCOBOLといった最も初期の高水準言語から導入されている。

手続き(procedure)は、リンケージや可視性にもよるが、プログラム内のあらゆるポイントから呼び出す(call)ことが可能であり、手続き内の命令コード行の終端またはリターン命令に達したときは、その手続きを呼び出したポイントの次のアドレスに制御が移される。これは復帰(return)と呼ばれる動作である。通例、高水準言語return文機械語のリターン命令に対応しており、手続き内の途中位置からでも復帰できる。手続きは他の手続き内からの呼び出しの他、自身内からの呼び出しも可能であり、これを再帰呼び出しrecursive call)という。手続きの呼び出しと復帰は、コンピュータ側が提供するコールスタックまたはスタックフレーム機能の命令アドレス管理によって実現されている。

手続きの来歴

手続き(procedure)の考え方は、機械語コードの時代から存在しており、低水準言語アセンブリ言語)にあるニーモニックコードのCALL命令とRET命令が原点である。PUSH命令による引数のスタックメモリへの積み込みと、スタックポインタレジスタの減算によるローカル変数領域の確保、ベースポインタレジスタによる引数とローカル変数へのアクセスといったスタックフレームの機能もアセンブリ言語由来のものである。CALL命令のジャンプ先アドレスに付けられたラベルは手続き名と同義になった。その仕組みは1950年代半ばから登場した高水準言語にもそのまま受け継がれた。ラベルは形式化された引数欄付きの呼び出し名となり、スタックフレーム処理も自動化隠蔽され、ソースコード上で明確に区分けされた手続き(プロシージャ)として誕生した。

手続きとモジュール性

大きく複雑なプログラムでは特にモジュール性が重要である。手続き型プログラミングでは、モジュールへの入力は構文的には「引数」であり、出力は「リターン値」である。

変数スコープは手続きのモジュール性を高めるもう1つの技法である。手続き内の変数は他の手続きからアクセスできない(逆も成り立つ)し、同じ手続きの複数の呼び出しの間でもそれが保たれる。スコープを超えたアクセスには特別な許可が必要である。

モジュール性の低い手続きも簡単なプログラムではよく使われる。その場合、実行環境内の多数の変数にアクセスし、他の手続きでも同様にそれらの変数にアクセスする。

単純で自己完結的で再利用可能なインタフェースであるため、手続きを使って多数の人間が書いたコードを組み合わせることが可能となり、ライブラリなども作成できるようになった。

他のプログラミングパラダイムとの対比

命令型プログラミング

オブジェクト指向プログラミング

手続き型プログラミングでは、データ構造構造体あるいはレコードによって適宜まとめられるが、コードはデータ構造が定義されたモジュールにまとめられ、その中では散在しがちである。C言語のように、明確なモジュール機能をサポートしない言語もある。一方オブジェクト指向プログラミングでは、データとコードはそれぞれ関連性の高いものがオブジェクトにまとめられる。クラスベースのオブジェクト指向言語では、オブジェクトの設計図となるクラスにフィールド(メンバー変数)およびメソッド(メンバー関数)として定義される。

一般にオブジェクト指向プログラミングの方が理解しやすいと言われている。その理由として、オブジェクト指向が人間の精神モデルの認知手法に近いからだという説もあるが、心理学が人間の認知モデルを完全には明確化できていない現時点では非常に不確かである。蒸気機関が発明されたとき、人間の精神は蒸気機関と比較された。コンピュータが発明されたとき、人間の精神はそれと比較された。オブジェクト指向プログラミングが発明されると、人間の精神はそれと比較されることになったのである。[独自研究?]

多くの場合、関連性の強いものを積極的にまとめて明確に分類できるオブジェクト指向のほうが凝集度が高くなり、保守が容易であると考えられている。クラスベースのオブジェクト指向言語の場合、プログラムはクラス群の定義から構成されている。オブジェクト指向言語と一口に言っても、全てをオブジェクトとみなす純粋なオブジェクト指向言語は少ない。例として最初のオブジェクト指向言語 Smalltalk があるが、商業的に成功したとは言いがたい。広く使われているC++Javaに代表されるように、多くのオブジェクト指向言語は、手続き型プログラミングとオブジェクト指向を融合させたものである。そのようなマルチパラダイムのオブジェクト指向言語は、広義では手続き型言語の一種として分類されることも多い[1]

以下にオブジェクト指向と手続き型の言語要素を比較した表を示す。

純粋なオブジェクト指向 純粋な手続き型
メソッド 手続き(プロシージャ)
オブジェクト 構造体(レコード)
クラス モジュール
メッセージ 手続き呼び出し

関数型プログラミング

手続き型言語における「関数」は一般的に副作用(状態の変更)を伴うことが多く、数学の関数とは別物である。

数学の関数のように副作用をもたない関数を組み合わせてプログラムを記述していく関数型プログラミングのスタイルは、従来の命令型・手続き型プログラミングと対比されることが多いが、Haskellのような純粋な関数型言語は少なく、ScalaF#のように関数型のスタイルを主軸としながらも必要に応じてオブジェクト指向や手続き型のスタイルをとることが可能となっているマルチパラダイム言語のほうが多い[4]

論理型プログラミング

代表的な手続き型言語

手続き型と見なされるプログラミング言語は、手続き(プロシージャ)の概念を明確に持っていて、構文として定義している。

典型例はALGOLおよびその派生言語であるPascalC言語である。狭義では、オブジェクト指向に必要とされる機能を言語仕様レベルでサポートする言語は手続き型言語に含まれない。オブジェクト指向言語が標準化されて普及する前に登場した手続き型言語は、そのような機能をサポートしないものが多く、Visual Basicのように限定的なサポートにとどまっているものもある。

しかし、C言語から発展したC++のように、多くのオブジェクト指向言語は手続き型言語の性質も受け継いでいる。そのため、オブジェクト指向型の手続き型言語と分類される[1]。代表的なものとして以下が挙げられる。

なお、C++などはクラスに属さないトップレベル(名前空間スコープ)の関数(自由関数)を定義することもできる一方、JavaC#ではメソッドは必ず何らかのクラスに属する必要があるが、呼び出しの際にオブジェクトのインスタンス化を必要としないstaticメソッド(静的メソッドまたはクラスメソッドとも呼ばれる)を定義することで代用できるため、そのような違いは手続き型の分類の決め手にはならない。また、多くのオブジェクト指向言語では、オブジェクトに対してstaticでないメソッド(非静的メソッドまたはインスタンスメソッドとも呼ばれる)を呼び出す場合、someInstance.someMethod()という形の構文記法が採用されているが、これは言語処理系によってメソッドの隠れた第0引数にオブジェクトをthisとして暗黙的に渡す形SomeClass.someMethod(someInstance)に展開される。つまり、内部的には手続きを呼び出しているだけである。

上記のようなオブジェクト指向の手続き型言語は、さらにラムダ式のような関数型プログラミングの機能も部分的にサポートすることが一般的となっており、プログラミングパラダイムの分類はますます曖昧となっている。

脚注

関連項目

外部リンク


手続き型プログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/08 18:40 UTC 版)

結合度」の記事における「手続き型プログラミング」の解説

内容結合Content coupling)「高」 病理学的結合とも呼ばれ、あるモジュール別のモジュール内部動作によって変化した依存したりする(例え別のモジュール内部データ直接参照する)。したがって、あるモジュールデータ生成する方法(場所、種類タイミング)を変更することは、依存するモジュール変更につながる可能性がある。 共通結合Common couplingグローバル結合とも呼ばれ二つモジュールが同じグローバルデータ(例えば、グローバル変数)を共有する。共通のリソース変更すると、それを使用したすべてのモジュール変更することを意味する外部結合External coupling二つモジュールは、外部から供給されデータ·フォーマット通信プロトコル、またはデバイスインターフェイスを共有している場合に起こる。 これは基本的に外部ツールデバイスへの通信関連している。 制御結合Control coupling) あるモジュール何をすべきかについての情報例えば、処理を制御するためのフラグ)を渡すことで、別のモジュール処理の流れ制御するスタンプ結合Stamp coupling複数モジュール複合データ構造共有し、その一部のみを使用する(例えば、全レコードの中の1つフィールドを必要とする関数に全レコードデータ構造体を渡す)。異な部分使用可能。これは、モジュールが必要としないフィールド変更されることにより、モジュールレコード読み取る方法変更することにつながる可能性がある。 データ結合Data couplingモジュールを介してデータ共有する場合例えば、引数である。 各データ基本部分であり、これらは単純なデータ受け渡しのみを行う(例えば、数値渡しての平方根返す)。 メッセージ結合Message coupling)「低」 最も結合度が低い結合種類である。(引数のない)メソッド呼び出しメッセージパッシング無結合(No couplingモジュール相互に全く通信行わない

※この「手続き型プログラミング」の解説は、「結合度」の解説の一部です。
「手続き型プログラミング」を含む「結合度」の記事については、「結合度」の概要を参照ください。

ウィキペディア小見出し辞書の「手続き型プログラミング」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



手続き型プログラミングと同じ種類の言葉


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「手続き型プログラミング」の関連用語

手続き型プログラミングのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



手続き型プログラミングのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの手続き型プログラミング (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの結合度 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS