web-dev-qa-db-ja.com

命令型、手続き型、構造化プログラミングの違いは何ですか?

(本、ウィキペディア、SEに関する同様の質問など)を調査することで、命令型プログラミングが主要なプログラミングパラダイムの1つであることを理解するようになりました。特定のアクションを実行するように命令するため、「命令型」という名前です。ここまでは順調ですね。

一方、手続き型プログラミングは命令型プログラミングの特定のタイプ(またはサブセット)であり、コンピュータが実行する必要のあるコマンドを記述するためにプロシージャ(つまり、関数)を使用します。

最初の質問:手続き型でない命令型プログラミング言語はありますか?言い換えれば、手順なしで命令型プログラミングを行うことができますか?

更新:この最初の質問に対する回答が得られたようです。言語は、手続き型でも構造化されていなくても、命令型にすることができます。例は、純粋なアセンブリ言語です。

次に、構造化プログラミングもあり、これは命令型プログラミングの別のタイプ(またはサブセット)のようですが、GOTOステートメントへの依存を取り除くために登場しました。

2番目の質問:手続き型プログラミングと構造化プログラミングの違いは何ですか?あなたはもう一方なしで1つを持つことができますか?画像のように、手続き型プログラミングは構造化プログラミングのサブセットと言えるでしょうか。

enter image description here

90
Daniel Scocco

プログラミング言語、特にオブジェクト指向言語以外の用語については、多くの用語を再利用できます(誤用されることが多い)。

用語の簡単な説明を以下に示します。

  1. 命令型プログラミング-プログラミングが広くアセンブリで行われていた昔は、コードに大量のGOTOが必要でした。 FORTRANやBASICなどのより高レベルの言語でも、同じプリミティブが使用され始めました。このプログラミングパラダイムでは、プログラム全体が単一のアルゴリズムまたは直線的に(段階的に)記述された完全な機能です。これは必須ですstyle。現代のC言語でも完全に悪い命令型の作業を本当に書くことができるが、より高水準の言語でコードを編成するのは非常に簡単であることを理解してください。

  2. 構造化プログラミングとモジュラープログラミング-ほとんどの場合、用語は同じ意味で使用できますが、微妙な違いがあります。上位レベルの言語が豊かになり始めたとき、すべての作業単位を小さな扱いやすい部分に分割する必要があることに気づきました。つまり、関数が存在し、プログラミングが関数の階層になり、下位レベルの多くが再利用できるようになったときです。

    • 構造化プログラミング は、機能がfor loop, while loop, if... thenなどのブロック構造のような単位に分割されている場合のプログラミングです。
    • また、ここではコード(関数)を再利用できます。
    • モジュラープログラミング では、物理的な形式のパッケージを作成できます。つまり、出荷できるコードのチャンクです。かなり一般的な目的で再利用できます。これは、一緒にコンパイルされた要素のmodulesと呼ばれます。
    • したがって、構造化されていないモジュール式プログラムはほとんど見えず、その逆も同様です。技術的な定義は微妙に異なりますが、ほとんどの場合、構造化されたコードはモジュール化するなどの方法で作成できます。
  3. その後、文学で明確に定義された「オブジェクト指向プログラミング」が登場しました。オブジェクト指向プログラミングisの定義による構造化プログラミングの形式を理解します。構造化コードであるが[〜#〜] not [〜#〜]オブジェクト指向であるすべての関数ベースのコードの新しい名前は、手続き型プログラミングと呼ばれることがよくあります。

    • したがって、基本的には、関数(またはプロシージャ)がデータを支配する構造化コードを手続き型と呼び、クラスおよびオブジェクトベースの表現をオブジェクト指向型と呼びます。どちらも本質的にモジュール式です。

多くの人は、すべての構造化プログラミング(おそらくオブジェクトベースをスキップする)を命令型プログラミングと考えています。これは命令型プログラミングの明確な定義がないためだと思いますが、それは間違っています。命令型プログラミングをあまり行っていないときに、構造化プログラミングを行っています!しかし、CやFORTRANプログラム内で、多くの関数とgotoステートメントを混在させて書くことができます。

あなたの質問に特定するために:

最初の質問:純粋なアセンブリ言語は、構造化または手続き型ではない命令型言語です。 (段階的な解釈の制御フローがあることは、手続き型を意味するものではありません-しかし、機能への機能の分割は、言語を手続き型にするものです)。

  • 修正*最新の形式のアセンブリDOは、関数の使用をサポートしています。実際、高レベルのコードで可能なことはすべて、低レベルで機能する必要があります。手続き型コードを作成する方がはるかに良い方法ですが、手続き型コードと命令型コードの両方を書くことも可能です。後者とは異なり、保守が容易で理解しやすい(恐ろしいスパゲッティコードを回避する)。純粋に命令型であるという称賛にふさわしいShell/bashスクリプトがあると思いますが、それでも、ほとんどに関数があり、開発者はそれらの価値を明確に理解しています。

2番目の質問:手続き型プログラミングは、構造化プログラミングの[〜#〜] form [〜#〜]です。


[〜#〜]ボーナス[〜#〜]

  • 一部の分類法によると、主な分類は宣言型(または関数型言語)と命令型です。宣言型言語では、制御フローを記述せずに計算を行うことができますが、命令型言語では、明示的な制御フロー(段階的)が定義されます。この分類に基づく命令型プログラミングは、構造化されたモジュール式のスーパーセットである場合もあり、OOプログラミングです。これを参照してください。 関数型プログラミングvs. OOP

  • オブジェクト指向の後、発明された他のプログラミングパラダイムがあります。詳細については、こちらを参照してください。 アスペクト指向、サブジェクト指向、およびロール指向プログラミングの違いは何ですか?

54
Dipan Mehta

最初の質問:はい、多くの純粋なオブジェクト指向言語が適格です。彼らは関数に非常に近いメソッドを持っていますが、これらのメソッドをメッセージの観点から見ており、手続き型言語を呼び出すのに十分な重みを与えていません。

2番目の質問:違いは、多くの場合、別の範囲にあります。 gotoステートメントを関数全体に配置することができます。これは手続き型のスタイルですが、構造化プログラミングではありません。一方、ほとんどのOO言語は、構造化プログラミングをサポートおよび推奨していますが、手続き型プログラミングではありません。

手続き型プログラミングは、プログラムのグローバルな順序を記述します。手続き型プログラムは、コールグラフを見ることで最も効果的に理解されるプログラムです。構造プログラミングはローカルプロパティであり、gotoではなくifとwhileの使用に適用されます。

そのため、これらの2つのプロパティは分離しており、どちらか一方を他方なしで使用できます。

5
thiton

これまでに出された答えのどれも、概念の核心をうまく捉えているとは思いません。

命令型、手続き型、構造型は相互に排他的なプロパティではなく、モデリングロジックの1つの側面にのみ焦点を当てています。

命令型とは、宣言型の命令型に対応するものです。基本的に、コンピュータに指定した一連の命令を実行させることによって、コンピュータに何をすべきかを指示することを意味します。一方、宣言型プログラムは何を達成するかを指示します。つまり、ステップを定義するか、結果を定義するかです。

手続き型プログラミングとは、プロセッサ(ハードウェアまたはインタプリタ)が命令を複合にまとめ、そのような複合にジャンプし、複合が実行されるとジャンプ後のポイントに戻る機能を指します。これはささいなことのように聞こえるかもしれませんが、今日の標準ではそうですが、これを行うには、マシンでいくつかの基本的なサポートが必要です。スタックポインタ。マイクロプロセッサはすぐにこの機能を提供しましたが、パンチテーププロセッサやパンチカードプロセッサのように、連続して供給される命令しか実行できないプリミティブプロセッサを想像できます。

構造化プログラミングは、別の命令にジャンプする機能からの次のステップです。最終的にはすべてジャンプに行き着きますが、条件付きジャンプが可能であれば、if-then、for、while、repeat-until、switchなどの基本的な制御フローステートメントを作成できます。それらを適用することを構造化プログラミングと呼びます。

現代のプログラミング環境では、上記のすべてを自由に利用できるため、当然のことと考えて、そのようなものについて話すことはもうありません。言語間のプロパティの差別化は、オブジェクト指向プログラミングや関数型プログラミングなどのより高いレベルのパラダイムに長い間シフトしています。

ただし、宣言型プログラミングはまだ一般的ではありません。主に、少なくともある程度は常にドメイン固有であるためです。汎用の宣言型言語は使用できません。このため、宣言型プログラミングまたは「モデリング」が第4世代と見なされる、いわゆる第3世代言語が依然として使用されています。

3
Martin Maat

過去50年間の一般的な言語のほとんどは、その普及者の1人であるジョンフォンノイマンにちなんで フォンノイマンアーキテクチャ と呼ばれる一般的なコンピュータアーキテクチャを中心に設計されています。

これらの言語は、命令型言語と呼ばれます。

フォンノイマーンコンピュータでは、データとプログラムの両方が同じメモリに格納されます。命令を実行するCPUはメモリとは別です。したがって、命令とデータをメモリからCPUに送信する必要があります。 CPUでの操作の結果をメモリに戻す必要があります。 1940年代以降に製造されたほぼすべてのデジタルコンピュータは、フォンノイマーンアーキテクチャに基づいています。

3
anandmon