Programmierparadigma
Programmierparadigmen sind eine Möglichkeit zu klassifizieren Programmiersprachen Basierend auf ihren Merkmalen. Sprachen können in mehrere Paradigmen eingeteilt werden.
Einige Paradigmen befassen sich hauptsächlich mit Auswirkungen auf die Ausführungsmodell der Sprache, wie z. B. zuzulassen Nebenwirkungen, oder ob die Abfolge von Operationen durch das Ausführungsmodell definiert wird. Andere Paradigmen befassen sich hauptsächlich mit der Art und Weise, wie Code organisiert wird, z. B. die Gruppierung eines Codes in Einheiten zusammen mit dem vom Code geänderten Zustand. Andere befassen sich hauptsächlich mit dem Stil der Syntax und Grammatik.
Zu den gängigen Programmierparadigmen gehören:[1][2][3]
- Imperativ in dem der Programmierer die Maschine anweist, wie er seinen Zustand ändert,
- prozedural welche Anweisungen in Verfahren gruppieren,
- objektorientierter Welche gruppiert Anweisungen mit dem Teil des Staates, in dem sie arbeiten,
- deklarativ in dem der Programmierer lediglich Eigenschaften des gewünschten Ergebniss erklärt, aber nicht, wie man es berechnet
- funktional in dem das gewünschte Ergebnis als Wert einer Reihe von Funktionsanwendungen deklariert wird,
- Logik in dem das gewünschte Ergebnis als Antwort auf eine Frage zu einem System von Fakten und Regeln deklariert wird,
- mathematisch in dem das gewünschte Ergebnis als Lösung eines Optimierungsproblems deklariert wird
- reaktiv in dem das gewünschte Ergebnis mit Datenströmen und der Verbreitung von Veränderungen deklariert wird
Symbolisch Techniken wie Betrachtung, die es dem Programm ermöglichen, sich auf sich selbst zu beziehen, kann auch als Programmierparadigma angesehen werden. Dies ist jedoch mit den Hauptparadigmen vereinbar und ist daher kein echtes Paradigma für sich.
Zum Beispiel Sprachen, die in die fallen Imperatives Paradigma Haben Sie zwei Hauptmerkmale: Sie geben die Reihenfolge an, in der Operationen auftreten, mit Konstrukten, die diese Reihenfolge explizit steuern, und sie ermöglichen Nebenwirkungen, in denen der Zustand zu einem Zeitpunkt innerhalb einer Codeeinheit geändert werden kann, und dann später lesen zu einem anderen Zeitpunkt in einer anderen Codeeinheit. Die Kommunikation zwischen den Codeeinheiten ist nicht explizit. Währenddessen in objektorientierter Programmierung, Code ist in organisiert in Objekte Dies enthält einen Zustand, der nur durch den Code geändert wird, der Teil des Objekts ist. Die meisten objektorientierten Sprachen sind ebenfalls imperative Sprachen. Im Gegensatz dazu passen Sprachen, die dem passen deklaratives Paradigma Geben Sie nicht die Reihenfolge an, in der Operationen ausgeführt werden sollen. Stattdessen liefern sie eine Reihe verfügbarer Vorgänge im System sowie die Bedingungen, unter denen jeder ausführen darf.[4] Die Implementierung des Ausführungsmodells der Sprache, die die Vorgänge frei ausführen können, und die Reihenfolge unabhängig wählt. Mehr bei Vergleich der Multi-Paradigm-Programmiersprachen.
Überblick
Genauso wie Softwareentwicklung (als Prozess) wird durch Unterschiede definiert Methoden, so die Programmiersprachen (als Berechnungsmodelle) werden durch Unterschiede definiert Paradigmen. Einige Sprachen sind so konzipiert, dass sie ein Paradigma unterstützen (Smalltalk Unterstützt objektorientierte Programmierung, Haskell unterstützt die funktionale Programmierung), während andere Programmiersprachen mehrere Paradigmen unterstützen (wie z. Objekt Pascal, C ++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Planen, Perl, Php, Python, Rubin, Oz, und F#). Zum Beispiel können Programme, die in C ++, Objektpascal oder PHP geschrieben wurden prozedural, rein objektorientierteroder kann Elemente sowohl oder anderer Paradigmen enthalten. Softwaredesigner und Programmierer entscheiden, wie diese Paradigmenelemente verwendet werden.
Bei der objektorientierten Programmierung werden Programme als eine Reihe interagierender Objekte behandelt. Im Funktionelle ProgrammierungProgramme werden als Folge von staatenlosen Funktionsbewertungen behandelt. Beim Programmieren von Computern oder Systemen mit vielen Prozessoren in prozessorientierte Programmierung, Programme werden als Sätze gleichzeitiger Prozesse behandelt, die auf einen logischen gemeinsamen gemeinsamen Bereich reagieren Datenstrukturen.
Viele Programmierparadigmen sind ebenso bekannt für die Techniken, die sie haben verbieten Wie für diejenigen, die sie ermöglichen. Zum Beispiel macht reine funktionelle Programmierung die Verwendung von nicht aus Nebenwirkungen, während Strukturierte Programmierung trifft die Verwendung der Verwendung des gehe zu Aussage. Teilweise aus diesem Grund werden neue Paradigmen oft als Doktrinär angesehen oder von denjenigen, die an frühere Stile gewöhnt sind, übermäßig starr.[7] Wenn Sie jedoch bestimmte Techniken vermeiden Theoreme beweisen über Programmkorrektheit.
Programmierparadigmen können ebenfalls verglichen werden Programmiermodelle, was es ermöglicht, eine zu rufen Ausführungsmodell durch Verwendung nur einer API. Programmiermodelle können auch in Paradigmen basierend auf den Merkmalen des Ausführungsmodells eingeteilt werden.
Zum Parallele ComputingDie Verwendung eines Programmiermodells anstelle einer Sprache ist üblich. Der Grund dafür ist, dass Details des parallelen Hardware -Lecks in die Abstraktionen zum Programmieren der Hardware verwendet werden. Dies führt dazu, dass der Programmierer Muster im Algorithmus auf Muster im Ausführungsmodell abbildet (die aufgrund von Hardware -Leckagen in die Abstraktion eingefügt wurden). Infolgedessen kartiert niemand parallele Programmiersprache gut auf alle Berechnungsprobleme. Daher ist es bequemer, eine sequentielle Basissprache zu verwenden und API -Aufrufe in parallele Ausführungsmodelle über ein Programmiermodell einzufügen. Solche parallele Programmiermodelle können nach Abstraktionen klassifiziert werden, die die Hardware widerspiegeln, wie z. geteilte Erinnerung, Verteilter Speicher mit Nachrichtenübergang, Vorstellungen von Platz im Code sichtbar und so weiter. Diese können als Aromen des Programmierparadigmas angesehen werden, die nur für parallele Sprachen und Programmiermodelle gelten.
Kritik
Einige Programmiersprachenforscher kritisieren den Begriff von Paradigmen als Klassifizierung von Programmiersprachen, z. Harper,[8] und Krishnamurthi.[9] Sie argumentieren, dass viele Programmiersprachen nicht strikt in ein Paradigma eingeteilt werden können, sondern Merkmale aus mehreren Paradigmen enthalten. Sehen Vergleich der Multi-Paradigm-Programmiersprachen.
Geschichte
Im Laufe der Zeit haben sich unterschiedliche Programmansätze entwickelt, die entweder zu dieser Zeit oder retrospektiv als solches identifiziert wurden. Ein früher Ansatz, der als solcher bewusst identifiziert wird, ist Strukturierte Programmierung, befürwortet seit Mitte der 1960er Jahre. Das Konzept eines "Programmierparadigmas" als solcher ist mindestens 1978 in der Turing Award Vorlesung von Robert W. Floyd, berechtigt Die Paradigmen der Programmierung, was den Begriff des Paradigmas wie verwendet durch Thomas Kuhn in seinem Die Struktur wissenschaftlicher Revolutionen (1962).[10]
Maschinensprache
Das niedrigstes Level Programmierparadigmen sind Maschinensprache, was direkt die repräsentiert Anweisungen (der Inhalt des Programmspeichers) als eine Abfolge von Zahlen und Montagesprache wo die Maschinenanweisungen durch Mnemonik dargestellt werden und Speicheradressen kann symbolische Etiketten gegeben werden. Diese werden manchmal genannt Erste- und zweite Generation Sprachen.
In den 1960er Jahren wurden Assemblersprachen entwickelt, um die Bibliothekskopie und eine ziemlich ausgefeilte bedingte Makrogenerierung und -vorverarbeitungsfähigkeiten zu unterstützen, rufen Sie an (rufenUnterroutinen), externe Variablen und gemeinsame Abschnitte (Globale), die eine signifikante Wiederverwendung und Isolierung von Code und Isolation von Hardware-Spezifikationen ermöglichen, indem logische Operatoren wie Lesen/Schreiben/Get/Put verwendet werden. Die Baugruppe wurde und wird für zeitkritische Systeme und häufig in verwendet eingebettete Systeme wie es die direkteste Kontrolle darüber gibt, was die Maschine tut.
Prozedurale Sprachen
Der nächste Fortschritt war die Entwicklung von prozedurale Sprachen. Diese dritte Generation Sprachen (der erste beschrieben als hochrangige Sprachen) Verwenden Sie das Vokabular im Zusammenhang mit dem Problem, das gelöst wird. Zum Beispiel,
- Gemeinsame geschäftsorientierte Sprache (Cobol) - verwendet Begriffe wie Datei, Bewegung und Kopieren.
- Formelübersetzung (Forran) - Verwendung mathematisch Sprachterminologie wurde hauptsächlich für wissenschaftliche und technische Probleme entwickelt.
- Algorithmische Sprache (Algol) - konzentriert sich darauf, eine angemessene Sprache zu definieren AlgorithmenWährend der Verwendung der mathematischen Sprachterminologie, an die wissenschaftliche und technische Probleme, genau wie FORTRAN.
- Programmiersprache (Pl/i)-Eine hybride kommerziell-wissenschaftliche allgemeine Sprache, die unterstützend ist Zeiger.
- Anfänger All-purpose Symbolic Instruction-Code (BASIC) - Es wurde entwickelt, um mehr Menschen zu ermöglichen, Programme zu schreiben.
- C-eine allgemeine Programmiersprache, die ursprünglich von entwickelt wurde von Dennis Ritchie Zwischen 1969 und 1973 bei AT & T Bell Labs.
Alle diese Sprachen folgen dem prozeduralen Paradigma. Das heißt, sie beschreiben Schritt für Schritt genau das Verfahren, das zumindest gemäß dem jeweiligen Programmierer befolgt werden sollte, um ein bestimmtes Problem zu lösen. Das Wirksamkeit und Effizienz einer solchen Lösung sind daher sowohl völlig subjektiv als auch stark von der Erfahrung, Erfindungsreichtum und Fähigkeit dieses Programmierers abhängig.
Objekt orientierte Programmierung
Nach der weit verbreiteten Verwendung prozeduraler Sprachen,, Objekt orientierte Programmierung (Oop) Sprachen wurden erstellt, wie z. Simula, Smalltalk, C ++, Eiffel, Python, Php, Java, und C#. In diesen Sprachen, Daten und Methoden zur Manipulation werden als eine Einheit bezeichnet, die als eine genannt wird Objekt. Mit perfekt VerkapselungEine der Unterscheidungsmerkmale von OOP, die einzige Möglichkeit, wie ein anderes Objekt oder ein anderer Benutzer auf die Daten zugreifen kann, ist über das Objekt Methoden. Somit kann das innere Arbeitswerfer eines Objekts geändert werden, ohne dass Code, der das Objekt verwendet, beeinträchtigt wird. Es gibt noch einige Kontroverse aufgezogen von Alexander Stepanov, Richard Stallman[11] und andere Programmierer in Bezug auf die Wirksamkeit des OOP -Paradigmas gegenüber dem prozeduralen Paradigma. Die Notwendigkeit, dass jedes Objekt assoziative Methoden besitzt Software aufblähen; Ein Versuch, dieses Dilemma zu lösen, kam durch Polymorphismus.
Da objektorientierte Programmierung als Paradigma und nicht als Sprache angesehen wird, ist es möglich, sogar eine objektorientierte Assemblersprache zu erstellen. Hochstufe Montage (HLA) ist ein Beispiel hierfür, das fortschrittliche Datentypen und objektorientierte Assembler-Sprachprogrammierung vollständig unterstützt-trotz seiner frühen Ursprünge. Daher können unterschiedliche Programmierparadigmen eher wie wie er gesehen werden motivierend Meme ihrer Befürworter eher als unbedingt den Fortschritt von einer Ebene zur nächsten darzustellen. Genaue Vergleiche der Wirksamkeit von konkurrierenden Paradigmen werden aufgrund der neuen und unterschiedlichen Terminologie, die auf ähnliche Unternehmen und Prozesse angewendet wird, sowie zahlreiche Implementierungsunterschiede zwischen Sprachen häufig erschwert.
Weitere Paradigmen
Lemerkörperprogrammierungals eine Form von Imperative Programmierung, Strukturenprogramme als menschenzentriertes Web, wie in a Hypertext Essay: Die Dokumentation ist ein wesentlicher Bestandteil des Programms, und das Programm ist nach der Logik der Prosa -Darstellung und nicht nach Compiler -Komfort strukturiert.
Unabhängig vom imperativen Zweig, deklarative Programmierung Es wurden Paradigmen entwickelt. In diesen Sprachen wird dem Computer mitgeteilt, was das Problem ist, nicht wie das Problem gelöst werden soll - das Programm ist als eine Reihe von Eigenschaften strukturiert, die im erwarteten Ergebnis zu finden sind, nicht als ein Verfahren, das zu folgen ist. Bei einer Datenbank oder einer Reihe von Regeln versucht der Computer, eine Lösung zu finden, die alle gewünschten Eigenschaften entspricht. Ein Archetyp einer deklarativen Sprache ist die Sprache der vierten Generation Sqlund die Familie der funktionalen Sprachen und der logischen Programmierung.
Funktionelle Programmierung ist eine Teilmenge der deklarativen Programmierung. Programme, die mit diesem Paradigmengebrauch geschrieben wurden Funktionen, Codeblöcke, die sich verhalten sollen wie Mathematische Funktionen. Funktionssprachen entmutigen Änderungen des Wertwerts von Variablen durch Abtretung, viel benutzt von Rekursion stattdessen.
Das Logikprogrammierung Paradigmenansichten die Berechnung als automatisierte Argumentation über ein Wissensgrad. Fakten über die Problemdomäne werden als Logikformeln ausgedrückt und Programme werden durch Bewerbung ausgeführt Inferenzregeln über sie, bis eine Antwort auf das Problem gefunden wird oder der Satz von Formeln als inkonsistent erwiesen wird.
Symbolic programming ist ein Paradigma, das Programme beschreibt, die Formeln und Programmkomponenten als Daten manipulieren können.[3] Programme können sich somit sich effektiv ändern und "lernen", was sie für Anwendungen wie z. künstliche Intelligenz, Expertensysteme, Verarbeitung natürlicher Sprache und Computerspiele. Sprachen, die dieses Paradigma unterstützen Lispeln und Prolog.[12]
Differenzierbare Programmierung Strukturenprogramme, damit sie es sein können differenziert überall, normalerweise über Automatische Differenzierung.[13][14]
Unterstützung für mehrere Paradigmen
Die meisten Programmiersprachen Unterstützen Sie mehr als ein Programmierparadigma, damit Programmierer den am besten geeigneten Programmierstil und die zugehörigen Sprachkonstrukte für einen bestimmten Job verwenden können.[15]
Siehe auch
Verweise
- ^ Nørmark, Kurt. Überblick über die vier Hauptprogrammierparadigmen. Aalborg University, 9. Mai 2011. Abgerufen am 22. September 2012.
- ^ Frans Coenen (1999-10-11). "Merkmale deklarativer Programmiersprachen". cgi.csc.liv.ac.uk. Abgerufen 2014-02-20.
- ^ a b Michael A. Covington (2010-08-23). "CSCI/ARTI 4540/6540: Erster Vortrag über symbolische Programmierung und Lisp" (PDF). Universität von Georgia. Archiviert von das Original (PDF) Am 2012-03-07. Abgerufen 2013-11-20.
- ^ "Programmierparadigmen: Was sind die Prinzipien der Programmierung?". Ionos digitalguide. Abgerufen 2022-05-03.
- ^ Peter Van Roy (2009-05-12). "Programmierparadigmen: Was jeder Programmierer wissen sollte" (PDF). info.ucl.ac.be. Abgerufen 2014-01-27.
- ^ Peter Van-Roy; Seif Haridi (2004). Konzepte, Techniken und Modelle der Computerprogrammierung. MIT Press. ISBN 978-0-262-22069-9.
- ^ Frank Rubin (März 1987). ""Goto gilt als schädlich als schädlich." (PDF). Kommunikation der ACM. 30 (3): 195–196. doi:10.1145/214748.315722. S2CID 6853038. Archiviert von das Original (PDF) am 20. März 2009.
- ^ Harper, Robert (1. Mai 2017). "Was, wenn überhaupt, ist ein Programmierparadigma?". Fünfzeightyfour. Cambridge University Press.
- ^ Krishnamurthi, Shriram (November 2008). "Programmiersprachen in einem post-linnaischen Alter unterrichten". Sigplan. ACM. 43 (11): 81–83. doi:10.1145/1480828.1480846. S2CID 35714982. Nicht. 43, 11..
- ^ Floyd, R. W. (1979). "Die Paradigmen der Programmierung". Kommunikation der ACM. 22 (8): 455–460. doi:10.1145/359138.359140.
- ^ "Mode -Vererbung, Klonen, Hooks & OOP (Google Groups Diskussion)".
- ^ "Business Glossar: Symbolische Programmierdefinition". Allbusiness.com. Abgerufen 2014-07-30.
- ^ Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregory; Rompf, Tiark (2018), Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. (Hrsg.), "Backpropagation mit Rückrufen: Grundlagen für effiziente und ausdrucksstarke differenzierbare Programmierung" (PDF), Fortschritte in den neuronalen Informationsverarbeitungssystemen 31, Curran Associates, Inc., S. 10201–10212, abgerufen 2019-02-13
- ^ Innes, Mike (2018). "Über maschinelles Lernen und Programmiersprachen" (PDF). SYSML Conference 2018. Archiviert von das Original (PDF) Am 2018-09-20. Abgerufen 2019-02-13.
- ^ "Multi-Paradigm-Programmiersprache". Entwickler.mozilla.org. Mozilla Foundation. Archiviert von das Original am 21. August 2013.