Programmierparadigma - Programming paradigm

Programmierparadigmen sind eine Möglichkeit, Programmiersprachen basierend auf ihren Funktionen zu klassifizieren . Sprachen können in mehrere Paradigmen eingeteilt werden.

Einige Paradigmen befassen sich hauptsächlich mit Implikationen für das Ausführungsmodell der Sprache, z. B. das Zulassen von Nebeneffekten oder ob die Reihenfolge der Operationen durch das Ausführungsmodell definiert wird. Andere Paradigmen befassen sich hauptsächlich mit der Art und Weise, wie Code organisiert ist, z. B. das Gruppieren eines Codes in Einheiten zusammen mit dem Zustand, der durch den Code geändert wird. Wieder andere befassen sich hauptsächlich mit dem Stil der Syntax und Grammatik.

Zu den gängigen Programmierparadigmen gehören:

  • Imperativ, bei dem der Programmierer die Maschine anweist, ihren Zustand zu ändern,
    • Verfahren, das Anweisungen in Verfahren gruppiert,
    • objektorientiert, das Anweisungen mit dem Teil des Zustands gruppiert, auf dem sie arbeiten,
  • deklarativ, bei dem der Programmierer lediglich Eigenschaften des gewünschten Ergebnisses deklariert, aber nicht, wie es berechnet wird
    • funktional, in dem das gewünschte Ergebnis als Wert einer Reihe von Funktionsanwendungen deklariert wird,
    • Logik, in der das gewünschte Ergebnis als Antwort auf eine Frage nach einem System von Fakten und Regeln deklariert wird,
    • mathematisch, in dem das gewünschte Ergebnis als Lösung eines Optimierungsproblems deklariert wird
    • reaktiv, bei dem das gewünschte Ergebnis mit Datenströmen und der Fortpflanzung von Veränderungen deklariert wird

Auch symbolische Techniken wie die Reflexion , die es dem Programm ermöglichen, auf sich selbst zu verweisen, können als Programmierparadigma betrachtet werden. Dies ist jedoch mit den großen Paradigmen vereinbar und somit kein eigenständiges Paradigma.

Zum Beispiel haben Sprachen, die in das Imperativ-Paradigma fallen , zwei Hauptmerkmale: Sie geben die Reihenfolge an, in der Operationen ausgeführt werden, mit Konstrukten, die diese Reihenfolge explizit steuern, und sie erlauben Nebeneffekte, wobei der Zustand zu einem bestimmten Zeitpunkt geändert werden kann. innerhalb einer Codeeinheit und später zu einem anderen Zeitpunkt innerhalb einer anderen Codeeinheit gelesen. Die Kommunikation zwischen den Codeeinheiten ist nicht explizit. In der objektorientierten Programmierung wird Code in Objekte organisiert , die einen Zustand enthalten, der nur durch den Code geändert wird, der Teil des Objekts ist. Die meisten objektorientierten Sprachen sind auch Imperativsprachen. Im Gegensatz dazu geben Sprachen, die dem deklarativen Paradigma entsprechen, nicht die Reihenfolge an, in der Operationen ausgeführt werden sollen. Stattdessen liefern sie eine Reihe verfügbarer Operationen im System zusammen mit den Bedingungen, unter denen jede ausgeführt werden darf. Die Implementierung des Ausführungsmodells der Sprache verfolgt, welche Operationen frei ausgeführt werden können und wählt die Reihenfolge unabhängig aus. Mehr unter Vergleich multiparadigmatischer Programmiersprachen .

Überblick

Überblick über die verschiedenen Programmierparadigmen nach Peter Van Roy

So wie Software-Engineering (als Prozess) durch unterschiedliche Methodologien definiert wird , so werden die Programmiersprachen (als Berechnungsmodelle) durch unterschiedliche Paradigmen definiert . Einige Sprachen unterstützen ein Paradigma ( Smalltalk unterstützt objektorientierte Programmierung, Haskell unterstützt funktionale Programmierung), während andere Programmiersprachen mehrere Paradigmen unterstützen (wie Object Pascal , C++ , Java , JavaScript , C# , Scala , Visual Basic , Common Lisp , Scheme , Perl , PHP , Python , Ruby , Oz und F# ). Beispielsweise können in C++, Object Pascal oder PHP geschriebene Programme rein prozedural oder rein objektorientiert sein oder Elemente beider oder anderer Paradigmen enthalten. Softwaredesigner und Programmierer entscheiden, wie diese Paradigmenelemente verwendet werden.

In der objektorientierten Programmierung werden Programme als eine Menge interagierender Objekte behandelt. In der funktionalen Programmierung werden Programme als eine Folge von zustandslosen Funktionsauswertungen behandelt. Bei der Programmierung von Computern oder Systemen mit vielen Prozessoren werden bei der prozessorientierten Programmierung Programme als Sätze von gleichzeitigen Prozessen behandelt, die auf logische gemeinsame Datenstrukturen wirken .

Viele Programmierparadigmen sind für die Techniken, die sie verbieten, ebenso bekannt wie für die, die sie ermöglichen . Beispielsweise verbietet die reine funktionale Programmierung die Verwendung von Nebeneffekten , während die strukturierte Programmierung die Verwendung der goto- Anweisung verbietet . Auch aus diesem Grund werden neue Paradigmen von denen, die an frühere Stile gewöhnt sind, oft als doktrinär oder zu starr angesehen. Das Vermeiden bestimmter Techniken kann es jedoch erleichtern, das Programmverhalten zu verstehen und Theoreme über die Programmkorrektheit zu beweisen .

Programmierparadigmen können auch mit Programmiermodellen verglichen werden , die es ermöglichen, ein Ausführungsmodell nur mithilfe einer API aufzurufen . Programmiermodelle können auch basierend auf Merkmalen des Ausführungsmodells in Paradigmen eingeteilt werden.

Beim parallelen Rechnen ist es üblich, ein Programmiermodell anstelle einer Sprache zu verwenden. Der Grund dafür ist, dass Details der parallelen Hardware in die Abstraktionen eindringen, die zum Programmieren der Hardware verwendet werden. Dies führt dazu, dass der Programmierer Muster im Algorithmus auf Muster im Ausführungsmodell abbilden muss (die aufgrund von Hardwarelecks in die Abstraktion eingefügt wurden). Als Konsequenz kann keine parallele Programmiersprache alle Berechnungsprobleme gut abbilden. Daher ist es bequemer, eine sequenzielle Basissprache zu verwenden und API-Aufrufe über ein Programmiermodell in parallele Ausführungsmodelle einzufügen. Solche Parallele Programmierung kann entsprechend Abstraktionen , welche die Hardware, wie reflektieren klassifiziert wird gemeinsam genutzten Speicher , verteiltem Speicher mit Message - Passing , Begriffe Ort sichtbar in dem Code, und so weiter. Diese können als Varianten des Programmierparadigmas betrachtet werden, die nur für parallele Sprachen und Programmiermodelle gelten.

Kritik

Einige Programmiersprachenforscher kritisieren die Vorstellung von Paradigmen als Klassifikation von Programmiersprachen, zB Harper und Krishnamurthi. Sie argumentieren, dass viele Programmiersprachen nicht streng in ein Paradigma eingeordnet werden können, sondern vielmehr Merkmale aus mehreren Paradigmen enthalten. Siehe Vergleich von Programmiersprachen mit mehreren Paradigmen .

Geschichte

Im Laufe der Zeit haben sich verschiedene Ansätze zur Programmierung entwickelt, die entweder damals oder im Nachhinein als solche identifiziert wurden. Ein früher bewusst als solcher identifizierter Ansatz ist die strukturierte Programmierung , die seit Mitte der 1960er Jahre propagiert wird. Das Konzept eines "Programmierparadigmas" als solches stammt mindestens aus dem Jahr 1978 in der Turing-Award- Vorlesung von Robert W. Floyd mit dem Titel The Paradigms of Programming , die den Begriff des Paradigmas zitiert, wie er von Thomas Kuhn in seiner The Structure of Scientific . verwendet wird Revolutionen (1962).

Maschinensprache

Die Programmierparadigmen der untersten Ebene sind der Maschinencode , der die Anweisungen (den Inhalt des Programmspeichers) direkt als Zahlenfolge darstellt, und die Assemblersprache, in der die Maschinenanweisungen durch Mnemonik dargestellt werden und Speicheradressen symbolische Labels erhalten können. Diese werden manchmal als Sprachen der ersten und zweiten Generation bezeichnet .

In den 1960er Jahren wurden Assemblersprachen entwickelt, um Bibliotheks-COPY und ziemlich ausgeklügelte bedingte Makrogenerierungs- und Vorverarbeitungsfunktionen, CALL to ( Subroutinen ), externe Variablen und gemeinsame Abschnitte (Globals) zu unterstützen, was eine signifikante Wiederverwendung von Code und die Isolierung von Hardware-Spezifika über die Verwendung logischer Operatoren wie READ/WRITE/GET/PUT. Die Montage wurde und wird immer noch für zeitkritische Systeme und oft in eingebetteten Systemen verwendet, da sie die direkteste Kontrolle über die Arbeit der Maschine ermöglicht.

Verfahrenssprachen

Der nächste Fortschritt war die Entwicklung prozeduraler Sprachen . Diese Sprachen der dritten Generation (die ersten als Hochsprachen beschrieben ) verwenden Vokabular, das sich auf das zu lösende Problem bezieht. Zum Beispiel,

  • COMmon Business Oriented Language ( COBOL ) – verwendet Begriffe wie Datei , Verschieben und Kopieren .
  • FORmula TRANslation ( FORTRAN ) – unter Verwendung der mathematischen Sprachterminologie wurde es hauptsächlich für wissenschaftliche und technische Probleme entwickelt.
  • ALGOrithmic Language ( ALGOL ) – konzentriert sich darauf, eine geeignete Sprache zu sein, um Algorithmen zu definieren , während sie mathematische Sprachterminologie verwendet und auf wissenschaftliche und technische Probleme abzielt, genau wie FORTRAN.
  • Programmiersprache Eins ( PL/I ) – eine hybride kommerziell-wissenschaftliche Allzwecksprache, die Zeiger unterstützt .
  • Anfänger Allzwecksymbolischer Befehlscode ( BASIC ) – wurde entwickelt, um mehr Leuten das Schreiben von Programmen zu ermöglichen.
  • C  – eine universelle Programmiersprache, die ursprünglich von Dennis Ritchie zwischen 1969 und 1973 bei AT&T Bell Labs entwickelt wurde .

Alle diese Sprachen folgen dem prozeduralen Paradigma. Das heißt, sie beschreiben Schritt für Schritt genau die Vorgehensweise, die zumindest nach Meinung des jeweiligen Programmierers zur Lösung eines bestimmten Problems befolgt werden sollte. Die Wirksamkeit und Effizienz einer solchen Lösung sind daher beide völlig subjektiv und hängen stark von der Erfahrung, dem Erfindungsreichtum und den Fähigkeiten des Programmierers ab.

Objekt orientierte Programmierung

Nach der weit verbreiteten Verwendung prozeduraler Sprachen wurden objektorientierte Programmiersprachen (OOP) wie Simula , Smalltalk , C++ , Eiffel , Python , PHP , Java und C# entwickelt . In diesen Sprachen werden Daten und Methoden zu ihrer Manipulation als eine Einheit gehalten, die als Objekt bezeichnet wird . Bei perfekter Kapselung , einem der Unterscheidungsmerkmale von OOP, kann ein anderes Objekt oder ein Benutzer nur über die Methoden des Objekts auf die Daten zugreifen . Somit kann das Innenleben eines Objekts geändert werden, ohne den Code zu beeinflussen, der das Objekt verwendet. Es gibt immer noch einige Kontroversen, die von Alexander Stepanov , Richard Stallman und anderen Programmierern bezüglich der Wirksamkeit des OOP-Paradigmas gegenüber dem prozeduralen Paradigma aufgeworfen wurden . Die Notwendigkeit, dass jedes Objekt über assoziative Methoden verfügt, führt einige Skeptiker dazu, OOP mit Software-Aufblähung zu assoziieren ; ein Versuch, dieses Dilemma zu lösen, kam durch Polymorphismus .

Da die objektorientierte Programmierung als Paradigma und nicht als Sprache betrachtet wird, ist es möglich, sogar eine objektorientierte Assemblersprache zu erstellen. High Level Assembly (HLA) ist ein Beispiel dafür, das fortgeschrittene Datentypen und objektorientierte Assemblerprogrammierung vollständig unterstützt – trotz seiner frühen Ursprünge. Daher können unterschiedliche Programmierparadigmen eher als motivierende Meme ihrer Befürworter angesehen werden, anstatt notwendigerweise den Fortschritt von einer Ebene zur nächsten darzustellen. Präzise Vergleiche der Wirksamkeit konkurrierender Paradigmen werden häufig durch neue und unterschiedliche Terminologien, die auf ähnliche Entitäten und Prozesse angewendet werden, sowie durch zahlreiche sprachübergreifende Implementierungsunterschiede erschwert.

Weitere Paradigmen

Literate Programming , als eine Form der imperativen Programmierung , strukturiert Programme als ein menschzentriertes Web, wie in einem Hypertext- Essay: Dokumentation ist integraler Bestandteil des Programms, und das Programm ist nach der Logik der Prosa-Auslegung strukturiert und nicht nach der Bequemlichkeit des Compilers.

Unabhängig vom imperativen Zweig wurden deklarative Programmierparadigmen entwickelt. In diesen Sprachen wird dem Computer gesagt, was das Problem ist, nicht wie das Problem zu lösen ist – das Programm ist als eine Reihe von Eigenschaften strukturiert, um das erwartete Ergebnis zu finden, und nicht als ein zu befolgendes Verfahren. Anhand einer Datenbank oder eines Regelwerks versucht der Computer eine Lösung zu finden, die allen gewünschten Eigenschaften entspricht. Ein Archetyp einer deklarativen Sprache ist die Sprache der vierten Generation SQL und die Familie der funktionalen Sprachen und der logischen Programmierung.

Funktionale Programmierung ist eine Teilmenge der deklarativen Programmierung. Programme, die nach diesem Paradigma geschrieben wurden, verwenden Funktionen , Codeblöcke, die sich wie mathematische Funktionen verhalten sollen . Funktionale Sprachen verhindern Änderungen des Wertes von Variablen durch Zuweisungen und machen stattdessen viel von Rekursion Gebrauch .

Das Paradigma der Logikprogrammierung betrachtet Berechnungen als automatisiertes Schlussfolgern über einen Wissensbestand. Fakten über die Problemdomäne werden als logische Formeln ausgedrückt, und Programme werden ausgeführt, indem darauf Inferenzregeln angewendet werden, bis eine Antwort auf das Problem gefunden ist oder sich die Menge der Formeln als inkonsistent herausstellt.

Symbolische Programmierung ist ein Paradigma, das Programme beschreibt, die Formeln und Programmkomponenten als Daten manipulieren können. Programme können sich somit effektiv selbst modifizieren und scheinen zu "lernen", wodurch sie sich für Anwendungen wie künstliche Intelligenz , Expertensysteme , Verarbeitung natürlicher Sprache und Computerspiele eignen . Zu den Sprachen, die dieses Paradigma unterstützen, gehören Lisp und Prolog .

Differenzierbare Programmierung strukturiert Programme so, dass sie durchgängig differenziert werden können, in der Regel durch automatische Differenzierung .

Unterstützung für mehrere Paradigmen

Die meisten Programmiersprachen unterstützen mehr als ein Programmierparadigma, damit Programmierer den am besten geeigneten Programmierstil und die zugehörigen Sprachkonstrukte für eine bestimmte Aufgabe verwenden können.

Siehe auch

Verweise

Externe Links