Was ist der Unterschied zwischen imperativer, prozeduraler und strukturierter Programmierung?

85

Durch Nachforschungen (Bücher, Wikipedia, ähnliche Fragen zu SE usw.) wurde mir klar, dass Imperative Programmierung eines der wichtigsten Programmierparadigmen ist, bei dem Sie eine Reihe von Befehlen (oder Anweisungen) beschreiben, die der Computer ausführen soll (so dass Sie hübsch sind) Viele befehlen es, bestimmte Maßnahmen zu ergreifen, daher der Name "Imperativ"). So weit, ist es gut.

Prozedurale Programmierung hingegen ist eine bestimmte Art (oder Teilmenge) der imperativen Programmierung, bei der Sie Prozeduren (dh Funktionen) verwenden, um die Befehle zu beschreiben, die der Computer ausführen soll.

Erste Frage : Gibt es eine imperative Programmiersprache, die nicht prozedural ist? Mit anderen Worten, können Sie Imperative Programmierung ohne Prozeduren haben?

Update : Diese erste Frage scheint beantwortet zu sein. Eine Sprache kann zwingend sein, ohne prozedural oder strukturiert zu sein. Ein Beispiel ist die reine Assemblersprache.

Dann haben Sie auch eine strukturierte Programmierung, die eine andere Art (oder Teilmenge) der imperativen Programmierung zu sein scheint, die entstanden ist, um die Abhängigkeit von der GOTO-Anweisung zu beseitigen.

Zweite Frage : Was ist der Unterschied zwischen prozeduraler und strukturierter Programmierung? Kannst du eins ohne das andere haben und umgekehrt? Kann man sagen, dass die prozedurale Programmierung eine Teilmenge der strukturierten Programmierung ist, wie im Bild dargestellt?

Bildbeschreibung hier eingeben

Daniel Scocco
quelle

Antworten:

52

Viele der Begriffe können in Bezug auf Programmiersprachen wiederverwendet (häufig missbraucht) werden, insbesondere solche, die nicht objektorientiert sind.

Hier finden Sie einige kurze Beschreibungen der Begriffe.

  1. Imperative Programmierung - In guten alten Zeiten, als die Programmierung noch weitgehend in Assembler war, gab es in Code Unmengen von GOTOs. Selbst höhere Sprachen wie FORTRAN und BASIC verwendeten die gleichen Grundelemente. In diesem Programmierparadigma ist das gesamte Programm ein einzelner Algorithmus oder eine vollständige Funktionalität, die linear geschrieben wird - Schritt für Schritt. Dies ist ein zwingender Stil . Verstehen Sie, dass man auch in der modernen C-Sprache wirklich schlechtes Imperativ schreiben kann, aber es ist ziemlich einfach, Code in höheren Sprachen zu organisieren.

  2. Strukturierte und modulare Programmierung - Meistens sollten wir den Begriff austauschbar, aber mit subtilen Unterschieden verwenden können. Als höhere Sprachen immer umfangreicher wurden, erkannte man, dass alle Arbeitseinheiten in kleinere Teile zerlegt werden sollten. Zu diesem Zeitpunkt entstanden Funktionen, und die Programmierung wurde zu einer Hierarchie von Funktionen, und viele auf niedrigeren Ebenen konnten wiederverwendet werden.

    • Strukturierte Programmierung ist jede Programmierung, bei der die Funktionalität in Einheiten wie z for loop, while loop, if... then. B. die Blockstruktur unterteilt ist.
    • Auch hier kann der a-Code (Funktion) wiederverwendet werden.
    • Bei der modularen Programmierung kann eine physische Form eines Pakets erstellt werden, dh ein Codeabschnitt, der ausgeliefert werden kann. die sind ziemlich universell und wiederverwendbar. Dies nennt man Module von zusammengesetzten Elementen.
    • Man kann also kaum modulare Programme sehen, die nicht strukturiert sind und umgekehrt; Die technische Definition unterscheidet sich geringfügig, aber der meist strukturierte Code kann modular und auf andere Weise erstellt werden.
  3. Dann kam "objektorientierte Programmierung", die in der Literatur gut definiert ist. Verstehen , dass die objektorientierte Programmierung ist eine Form der strukturierten Programmierung per Definition. Der neue Name für alle funktionsbasierten Codes, die strukturierten Code, aber NICHT objektorientiert sind, wird häufig als prozedurale Programmierung bezeichnet.

    • Grundsätzlich strukturierter Code, bei dem Funktionen (oder Prozeduren) die Daten dominieren, wird als prozedural bezeichnet, während die klassen- und objektbasierte Darstellung als objektorientiert bezeichnet wird. Beide sind per Definition auch modular.

Viele Leute denken - alles strukturierte Programmieren (möglicherweise Überspringen von objektbasiertem Programmieren) als zwingende Programmierung; Ich denke, das liegt nur an der fehlenden klaren Definition der imperativen Programmierung - aber es ist falsch. Sie programmieren strukturiert, wenn Sie nicht viel Unbedingtes tun! Aber ich kann immer noch viele Funktionen sowie viele goto-Anweisungen in C oder FORTRAN schreiben, um sie zu verwechseln.

Um spezifisch auf Ihre Fragen zu sein:

Erste Frage : Reine Assemblersprache ist eine Imperativsprache, die NICHT strukturiert oder prozedural ist. (Schritt für Schritt interpretativen Kontrollfluss zu haben, bedeutet nicht prozedural - aber die Aufteilung der Funktionalität in Funktionen macht eine Sprache prozedural).

  • Korrektur * Die meisten modernen Montageformen unterstützen die Verwendung von Funktionen. Tatsächlich muss alles, was in Code auf hoher Ebene möglich ist, auf niedriger Ebene existieren, um zu funktionieren. Obwohl es weitaus besser ist, Prozedurcode zu erstellen, ist es möglich, sowohl prozeduralen als auch imperativen Code zu schreiben. Im Gegensatz zu letzterem ist es wartungsfreundlicher und verständlicher (Vermeidung von schrecklichem Spaghetti-Code). Ich denke, es gibt Shell / Bash-Skripte, die besser zu der Auszeichnung passen, dass sie rein imperativ sind, aber selbst dann haben die meisten Funktionen, und Entwickler verstehen definitiv, wie viel Wert sie haben.

Zweite Frage : Die prozedurale Programmierung ist eine FORM der strukturierten Programmierung.


BONUS

  • Gemäß einer Taxonomie ist die primäre Klassifikation Deklarativ (oder funktionale Sprache) vs. Imperativ. Deklarative Sprachen ermöglichen die Berechnung ohne Beschreibung des Kontrollflusses, während bei imperativen Sprachen der explizite Kontrollfluss (schrittweise) definiert wird. Basierend auf dieser Klassifizierung kann Imperative Programmierung für einige eine übergeordnete Menge von strukturierter, modularer und OO-Programmierung sein. Siehe hierzu: Functional Programming vs. OOP

  • Nach der objektorientierten Programmierung wurden andere Programmierparadigmen erfunden: Weitere Informationen finden Sie hier: Was sind die Unterschiede zwischen aspektorientierter, subjektorientierter und rollenorientierter Programmierung?

Dipan Mehta
quelle
1
Würden Sie also sagen, dass prozedurale Programmierung notwendigerweise auch strukturierte Programmierung ist, während das Gegenteil nicht zutrifft (obwohl dies häufig der Fall ist)?
Daniel Scocco
2
Ja, das würde ich sagen.
Dipan Mehta
1
In meiner Antwort habe ich Imperativ vs. Strukturiert definiert - wobei Imperativ-Programmierung nur schrittweise geschrieben und nicht strukturiert ist. Gemäß einer Definition gibt es jedoch eine andere Klassifizierung; Dies ist eine Klassifizierung zwischen deklarativ (oder funktionaler Sprache) und imperativ. Deklarative Sprachen ermöglichen die Berechnung ohne Beschreibung des Kontrollflusses, wobei als Imperativ der explizite Kontrollfluss (Schritt für Schritt) definiert wird. Basierend auf dieser Klassifizierung kann Imperative Programmierung für einige eine übergeordnete Menge strukturierter Programme sein. Einige folgen dieser Definition nicht ganz.
Dipan Mehta
In Bezug auf die Definition der strukturierten Programmierung bin ich anderer Meinung. Strukturierte Programmierung und modulare Programmierung sind nicht dasselbe. Bitte beachten Sie die Definition am Ende dieses Hinweises. Der gleiche Link legt nahe, dass Assembler ** eine ** strukturierte Programmiersprache ist! Referenz für die Definition von STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance
Ist eine "physische Form des Pakets" ... eine Datei oder ein Verzeichnis / Archiv von Dateien? (Oder ist es nicht und es ist etwas anderes.)
n611x007
4

Erste Frage: Ja, viele reine objektorientierte Sprachen sind geeignet. Sie verfügen zwar über Methoden, die den Funktionen sehr nahe kommen, sie sehen diese Methoden jedoch als Nachrichten an und geben ihnen nicht genug Gewicht, um die Sprache prozedural aufzurufen.

Zweite Frage: Der Unterschied liegt oft in einem anderen Bereich. Sie können überall eine Funktion mit goto-Anweisungen haben, die im prozeduralen Stil, aber nicht in strukturierter Programmierung abläuft. Auf der anderen Seite unterstützen die meisten OO-Sprachen eine strukturierte Programmierung, jedoch keine prozedurale Programmierung.

Die prozedurale Programmierung beschreibt die globale Reihenfolge des Programms. Prozedurale Programme werden am effektivsten anhand ihrer Aufrufdiagramme verstanden. Die Strukturprogrammierung ist eine lokale Eigenschaft und bezieht sich auf die Verwendung von if und while im Gegensatz zu goto.

Als solche sind diese beiden Eigenschaften nicht zusammenhängend, Sie können eine ohne die andere haben.

Thiton
quelle
1
Der einzige Lackmustest, um prozedural zu sein, ist, dass die Sprache Prozeduren (Funktionen oder Methoden ) enthält und imperativ ist, dh. nicht deklarativ. Dies bedeutet, dass die meisten OO-Sprachen, die nicht rein funktional sind, prozedural sind.
Dietbuddha
1
@dietbuddha: Nach dieser Definition würde sich Haskell durch die Verwendung von Monaden als prozedurale Sprache qualifizieren. Ich würde ein gewisses Maß an Vertrauen in die Verfahren benötigen, um ein Sprachverfahren zu vervollkommnen.
Thiton
Ich kenne Haskell nicht so gut, aber ich dachte, Haskell ist eine reine funktionale Sprache, weil sie Nebenwirkungen in Monaden umschließt.
Dietbuddha
2
Nun, einige Leute behaupten , Haskell nicht rein funktional ist , weil es eine Interaktion mit der Außenwelt ermöglicht (oder wegen einer GHC Erweiterung , unsafePerformIOermöglicht wreaking havok). Andere scherzen, dass Haskell ihre bevorzugte imperative Programmiersprache ist. Tatsache ist jedoch, dass ein sehr großer Teil des Haskell-Codes sauber getrennt lebt IO, keine nicht standardmäßigen Lücken zum Einschleichen von Nebenwirkungen verwendet und rein funktional ist.
1
@thiton Ich stimme nicht zu. Monaden sind auch funktionelle Konstrukte; Sie sehen nur aufgrund von Haskells Syntax zucker (die "do notation") zwingend aus. Wenn Sie Monaden desugar, wird ihre funktionelle Natur offensichtlich. Im Gegensatz dazu sind OO-Sprachen in der Tat unerlässlich: Im Kern basieren sie auf der sequentiellen Ausführung von Anweisungen.
Andres F.
2

Die meisten der populären Sprachen der letzten 50 Jahre sind auf die vorherrschende Computerarchitektur ausgerichtet, die nach einem ihrer Urheber, John von Neumann, Von Neumann-Architektur genannt wird.

Diese Sprachen werden imperative Sprachen genannt.

In einem von Neumaan-Computer werden sowohl Daten als auch Programme im selben Speicher gespeichert. Die CPU, die Befehle ausführt, ist vom Speicher getrennt. Daher müssen Anweisungen und Daten vom Speicher zur CPU übertragen werden. Ergebnisse von Operationen in der CPU müssen zurück in den Speicher verschoben werden. Fast alle seit den 1940er Jahren gebauten Digitalcomputer basieren auf der von Neumaan-Architektur.

anandmon
quelle
1
+1 nicht sicher, was dies mit der Frage zu tun hat, aber es ist eine interessante Antwort.
Chuck Conway
2
Was? Wo ist der Teil über Imperative vs Procedural, etc?
bbqchickenrobot
Ich denke, hier geht es darum, dass das Streiten über die Programmstruktur (Imperativ, Deklarativ, Prozedural, Objektorientiert, Funktional usw.) Sprachkonstrukte sind und alle Programme letztendlich auf Von Neumann-Architekturmaschinen verarbeitet werden. Dies ähnelt der Aussage, dass alle Turing Complete-Sprachen gleichwertig sind.
ChuckCottrill
2

Ich fürchte, keine der bisher gegebenen Antworten fasst den Kern der Konzepte sehr gut zusammen.

Imperativ, prozedural und strukturiert schließen sich nicht aus, sondern konzentrieren sich nur auf einen Aspekt der Modellierungslogik.

Imperativ ist das Gegenstück zu deklarativ Imperativ bedeutet im Grunde, dass Sie dem Computer mitteilen, was er tun soll, indem er eine Reihe von Anweisungen ausführt, die Sie bereitstellen. Ein deklaratives Programm dagegen sagt, was zu erreichen ist . Mit anderen Worten, definieren Sie Schritte im Vergleich zu einem Ergebnis.

Die prozedurale Programmierung bezieht sich auf die Fähigkeit des Prozessors (entweder Hardware oder ein Interpreter), Anweisungen in Verbindungen zu packen, zu einer solchen Verbindung zu springen und nach dem Sprung zu dem Punkt zurückzukehren, an dem die Verbindung ausgeführt wurde. Dies mag trivial klingen und nach heutigen Maßstäben ist es auch so, aber Sie benötigen eine grundlegende Unterstützung in der Maschine, bevor Sie dies tun können: die Fähigkeit zu springen, eine Art Stapel, auf den eine Adresse gepusht werden kann und zu der später gesprungen werden kann, und a Stapelzeiger. Mikroprozessoren boten diese Funktion bald an, aber Sie können sich einen primitiven Prozessor vorstellen, der nur Befehle ausführen kann, die ihm sequentiell zugeführt werden, wie ein Lochstreifen- oder Lochkartenprozessor.

Strukturierte Programmierung ist der nächste Schritt von der Fähigkeit, zu einem anderen Befehl zu springen. Letztendlich läuft alles auf Sprünge hinaus, aber wenn Sie bedingte Sprünge haben können, können Sie grundlegende Kontrollflussanweisungen wie if-then, for, while, repeat-until und switch erstellen. Diese anzuwenden heißt strukturierte Programmierung.

In jeder modernen Programmierumgebung stehen Ihnen alle oben genannten Funktionen zur Verfügung und sind für Sie selbstverständlich, sodass wir nicht mehr von ihnen als solchen sprechen. Die Unterscheidung zwischen den Sprachen hat sich seit langem zu übergeordneten Paradigmen wie objektorientierter und funktionaler Programmierung gewandelt.

Deklarative Programmierung ist jedoch immer noch nicht alltäglich, vor allem, weil sie zumindest teilweise immer domänenspezifisch sein wird. Sie können keine allgemeine deklarative Sprache haben. Aus diesem Grund stecken wir immer noch in sogenannten Sprachen der 3. Generation, in denen deklaratives Programmieren oder "Modellieren" als 4. Generation betrachtet werden würde.

Martin Maat
quelle