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


85

(書籍、ウィキペディア、SEに関する同様の質問など)を調査することで、命令型プログラミングは主要なプログラミングパラダイムの1つであり、コンピューターが実行する一連のコマンド(またはステートメント)を記述する(つまり、特定のアクションを実行するように多くの順序を指定するため、「命令型」という名前が付けられます)。ここまでは順調ですね。

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

最初の質問:手続き型ではない命令型プログラミング言語はありますか?言い換えると、プロシージャなしで命令型プログラミングを使用できますか?

更新:この最初の質問には答えられているようです。言語は、手続き的または構造化されていなくても不可欠です。例は、純粋なアセンブリ言語です。

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

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

ここに画像の説明を入力してください

回答:


52

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

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

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

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

    • 構造化プログラミングは、機能がfor loop, while loop, if... thenetcブロック構造などのユニットに分割されている場合のプログラミングです。
    • また、ここでコード(関数)の一部を再利用できます。
    • ではモジュール、1は、パッケージの物理的なフォームを作成することができます-出荷することができ、コードの塊すなわち、これらはかなり汎用的で再利用可能です。これは、一緒にコンパイルされた要素のモジュールと呼ばれます
    • したがって、構造化されていないモジュラープログラムはほとんど見られません。技術的な定義は微妙に異なりますが、ほとんどの場合、構造化されたコードはモジュール式などの方法で作成できます。
  3. その後、文献で十分に定義されている「オブジェクト指向プログラミング」が登場しました。オブジェクト指向プログラミング、定義による構造化プログラミングの一種であることを理解してください。構造化されたコードであるがオブジェクト指向ではないすべての関数ベースのコードの新しい名前は、しばしば手続き型プログラミングと呼ばれます。

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

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

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

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

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

2番目の質問:手続き型プログラミングは、構造化プログラミングの形式です。


ボーナス

  • いくつかの分類法によると、主要な分類は宣言的(または機能的言語)対命令的です。宣言型言語では制御フローを記述せずに計算できますが、命令型では明示的な制御フロー(ステップバイステップ)が定義されます。この分類に基づいて、命令型プログラミングは、構造化されたモジュール式プログラミングとオブジェクト指向プログラミングのスーパーセットになります。こちらをご覧ください:関数型プログラミングとOOP

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


1
それで、手続き型プログラミングは必然的に構造化プログラミングでもあると言えますか?
ダニエルスコッコ

2
はい、そう言います。
ディパンMehta

1
私の答えでは、命令型と構造化を定義しました-命令型プログラミングは段階的な実行だけで記述され、構造化されていません。ただし、ある定義によれば、別の分類があります。これは、宣言型(または関数型言語)と命令型の分類です。宣言型言語では、命令フローが明示的な制御フロー(ステップバイステップ)が定義されている場合に、制御フローを記述せずに計算できます。この分類に基づいて、命令型プログラミングは、構造化されたスーパーセットになる場合があります。一部はその定義に完全には従いません。
ディパンメタ

構造化プログラミングの定義に関して、私は異なる意見を持っています。構造化プログラミングとモジュール式プログラミングは同じものではありません。このメモの最後にある定義をご覧ください。同じリンクは、Assembler **が**構造化プログラミング言語であることを示唆しています!STPの定義のリファレンス:ja.wikipedia.org/wiki/Structured_programming –エマドカリーム
NoChance

「パッケージの物理的な形式」...ファイル、またはファイルのディレクトリ/アーカイブですか?(またはそうではなく、それは何か他のものです。)
n611x007

4

最初の質問:はい、多くの純粋なオブジェクト指向言語が該当します。関数に非常に近いメソッドがありますが、メッセージの観点からこれらのメソッドを表示し、言語の手続きを呼び出すのに十分な重みを与えません。

2番目の質問:多くの場合、違いは範囲が異なります。gotoステートメントを含む関数をいたるところに持つことができます。これは手続き型ですが、構造化プログラミングではありません。一方、ほとんどのオブジェクト指向言語は、構造化プログラミングをサポートおよび奨励していますが、手続き型プログラミングはサポートしていません。

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

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


1
手続き型であるための唯一のリトマステストは、言語に手順(関数またはメソッド)が含まれており、命令型であることです。非宣言的。これは、純粋に機能的ではないほとんどのオブジェクト指向言語が手続き型であることを意味します。
-Dietbuddha

1
@dietbuddha:この定義により、Haskellはモナドの使用を通じて手続き型言語としての資格を得るでしょう。言語を手続き型にするためには、手順にある程度依存する必要があります。
チトン

Haskellについてはよくわかりませんが、HaskellはMonadsの副作用をラップするため、純粋な関数型言語だと思いました。
-Dietbuddha

2
まあ、一部の人々はそれが外の世界との相互作用(またはので、GHCのことができますので、Haskellは純粋に機能していないと主張拡張子はunsafePerformIOハボックをwreakingことができます)。Haskellは彼らのお気に入りの必須プログラミング言語であると冗談を言う人もいます。しかし、実際には、非常に大規模なHaskellコードはから完全に分離されてIOおり、非標準の抜け穴を使用して副作用を潜入せず、純粋に機能的です。

1
@thiton同意しない。モナドも機能的な構造です。Haskellの構文シュガー(「表記法」)のために必要なだけです。モナドを脱糖すると、その機能的な性質が明らかになります。対照的に、オブジェクト指向言語は確かに必須です。コア言語では、ステートメントの順次実行に基づいています。
アンドレスF.

2

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

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

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


1
これが質問とどう関係するのかはわかりませんが、興味深い答えです。
チャックコンウェイ

2
何?命令型vs手続き型などに関する部分はどこですか?
bbqchickenrobot

ここでのポイントは、プログラム構造(Imperative、Declarative、Procedural、Object-Oriented、Functionalなど)についてのいらだちが言語の構成要素であり、すべてのプログラムが最終的にVon Neumannアーキテクチャマシンで処理されることだと思います。これは、すべてのチューリング完全言語が同等であると言うことに似ています。
チャックコットリル

2

私はこれまでに与えられた答えのどれも概念の核心を非常にうまく捉えていないことを恐れています。

命令型、手続き型、および構造化されたプロパティは相互に排他的なプロパティではなく、モデリングロジックの単一の側面に焦点を合わせています。

命令型は、宣言型のカウンターパートです。命令型は、基本的に、ユーザーが提供する一連の命令を実行させることにより、コンピューターに何をするかを指示することを意味します。一方、宣言プログラムは何を達成するかを指示ます。つまり、ステップを定義するか、結果を定義します。

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

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

最新のプログラミング環境では、上記のすべてを自由に使用でき、それらを当然のことと見なすので、それらについてはもう言及しません。言語間の特性の差別化は、オブジェクト指向プログラミングや関数型プログラミングなどの高レベルのパラダイムに長い間シフトしてきました。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.