Wie viele Arten von Programmiersprachen gibt es? [geschlossen]


30

Grundsätzlich möchte ich viele Programmiersprachen lernen, um ein großartiger Programmierer zu werden. Ich kenne nur eine Handvoll davon und ich hatte gehofft, jemand könnte herausfinden, wie viele Klassen oder Arten von Programmiersprachen es gibt . Zum Beispiel, wie Sie sie zusammenfassen würden, wenn Sie sie in Gruppen lernen müssten.

Ich komme aus Java und kenne mich mit statischem Tippen aus, aber ich weiß, dass es neben dynamischem Tippen auch eine solche Vielfalt in den verfügbaren Sprachen geben muss, dass ich mir nach Möglichkeit eine kategoriale Aufschlüsselung wünsche.


2
Wäre es nicht besser zu sagen, "Welcher Typ .." statt wie viele?
Amir Rezaei

Nun, ich habe gelernt, dass sich so etwas wie Prolog und C grundlegend unterscheiden, also dachte ich, dass jede dieser Sprachen einer anderen Art von Programmiersprache entspricht, und ich hatte gehofft, einen Eindruck davon zu bekommen, wie viele Arten es gibt.
sova

7
2: Der Typ, der macht, was Sie wollen, und der Typ, der es nicht tut
Matt Ellen

1
Das Erlernen verschiedener Arten von Programmiersprachen ist absolut konstruktiv ! Sie könnten möglicherweise argumentieren, dass dies als Duplikat davon geschlossen werden sollte, aber ich denke, dass sie deutlich genug sind, um getrennt zu bleiben.
Peter Boughton

1
@Sova, ich würde empfehlen, die erste Wahl für neue Sprachen zu treffen, um etwas auszuprobieren, das keine c-basierte Syntax verwendet. Dadurch wird Ihr Kopf mehr darauf fokussiert, wie es funktioniert und wie es sich von dem unterscheidet, den Sie am besten kennen.
Erik Reppen

Antworten:


73

Es hängt davon ab, wie Sie Sprachen klassifizieren möchten. Grundsätzlich können Sprachen in zwei Typen unterteilt werden: Imperative Sprachen, in denen Sie den Computer anweisen, wie eine Aufgabe auszuführen ist, und deklarative Sprachen, in denen Sie dem Computer mitteilen, was zu tun ist. Deklarative Sprachen können ferner in funktionale Sprachen unterteilt werden, in denen ein Programm aus Funktionen und Logik bestehtProgrammiersprachen, in denen ein Programm über eine Reihe logischer Verbindungen aufgebaut ist. Imperative Sprachen lesen sich eher wie eine Liste von Schritten zur Lösung eines Problems, ähnlich wie ein Rezept. Imperative Sprachen sind C, C ++ und Java. funktionale Sprachen umfassen Haskell; Logik-Programmiersprachen umfassen Prolog.

Imperative Sprachen werden manchmal in zwei Untergruppen unterteilt: prozedurale Sprachen wie C und objektorientierte Sprachen . Objektorientierte Sprachen sind jedoch etwas orthogonal zu den Gruppierungen, da es objektorientierte funktionale Sprachen gibt (Beispiele sind OCaml und Scala).

Sie können Sprachen auch gruppieren, indem Sie Folgendes eingeben: statisch und dynamisch . Statisch typisierte Sprachen werden vor dem Ausführen des Programms (normalerweise während einer Kompilierungsphase) überprüft (und in der Regel erzwungen). Dynamisch typisierte Sprachen verzögern die Typüberprüfung zur Laufzeit. C, C ++ und Java sind statisch typisierte Sprachen. Python, Ruby, JavaScript und Objective-C sind dynamisch typisierte Sprachen. Es gibt auch untypisierte Sprachen, einschließlich der Programmiersprache Forth.

Sie können auch Gruppensprachen durch ihre Typisierung Disziplin : schwache Typisierung, die implizite Typkonvertierungen und unterstützt starke Typisierung, die Konvertierungen implizite Art verbietet. Die Linien zwischen den beiden sind etwas verschwommen: Nach einigen Definitionen ist C eine schwach typisierte Sprache, während andere sie als stark typisiert ansehen. Tippdisziplin ist sowieso kein wirklich nützlicher Weg, um Sprachen zu gruppieren.


1
Wollte etwas ähnliches darstellen, wird aber +1 geben und stattdessen Kommentare hinzufügen. Jede Kategorie oder Kombination hat auch zahlreiche Ausgründungen, die sich auf bestimmte Elemente konzentrieren. OOP zum Beispiel erzeugt: Prototyp-basiertes OOP, aspektorientiertes Programmieren, komponentenbasiertes Programmieren und so weiter. Funktionsparadigmen haben auch Ausgründungen, z. B. Sprachen, bei denen ein asynchroner Prozess oder Thread die Basiseinheit ist und Sie programmieren, indem Sie parallele Prozesse zusammensetzen.
CodexArcanum

Wie würden Skriptsprachen, z. B. VBScript, dazu passen? Es kann ein bisschen prozedural und ein bisschen OO sein, da man verschiedene Typen erstellen kann. Wäre es dann ein Hybrid?
JB King

Genau das habe ich gesucht. Vielen Dank.
sova

3
@JB King OOP-Sprachen sind normalerweise prozedural, zumindest innerhalb der Methodenkörper. Es ist auch ein weit verbreitetes Missverständnis, dass OOP "Objekte" bedeutet. Viele Sprachen haben Datentypen und Objekte. Es gibt viele Debatten darüber, wie die genaue Definition von OOP lautet, aber in der Regel werden Vererbung und / oder Einkapselung (privater Staat) als Hauptthemen behandelt. Eine Sprache ohne irgendeine Form wäre schwierig als OOP-Sprache zu klassifizieren.
CodexArcanum

2
@sova Mir fallen nur zwei Sprachen ein, die so funktionieren. Erlang basiert stark auf Parallelverarbeitung, aber wenn Sie mehr von dem wollen, worüber ich gerade gesprochen habe, sollten Sie sich Polyphonic C # ansehen. Es ist eine Forschungssprache (jetzt in C-Omega zusammengefasst), die auf Pi-Calculus basiert (wie FP auf Lambda-Calc basiert). Pi-Calc basiert auf der Einheit eines Prozesses, und Sie deklarieren Prozesse und eine Kombination aus Synchron und Asych ruft in sie hinein. Schauen Sie sich auch Arrows in FP an, insbesondere Haskell. Pfeile sind sehr ähnlich.
CodexArcanum

12
  • Versammlung
  • Verfahrens
    • Basic
    • C
  • Objektorientierter
    • C #
    • Java
  • Deklarativ
    • Prolog
    • SQL
  • Funktional
    • Lispeln
    • Haskell

Dies sind die wichtigsten, aber es gibt viele andere Paradigmen, und es gibt viele Überschneidungen zwischen ihnen.


Wie wäre es mit deklarativ (zB Prolog, SQL)?
Bruce Alderman

@ Bruce, hab sie jetzt.

Ja, das war die allgemeine Idee, die ich irgendwo auf dem Weg gelernt habe.
Sevenseacat

6
Sollte die Montage nicht als verfahrenstechnisch angesehen werden?
MattDavey

2
Wie wäre es mit verketteten (Stack-basierten) Programmiersprachen wie Forth und Factor? Sie könnten es als eine Art funktionale Programmierung betrachten, aber es ist wahrscheinlich deutlich genug, um es zu erwähnen. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux

11

Informationen zu Programmiersprachen (Paradigmen) finden Sie hier:
http://en.wikipedia.org/wiki/Programming_paradigm

Weitere Merkmale von Programmiersprachen (z. B. Typensysteme) finden Sie hier: http://en.wikipedia.org/wiki/Programming_language


Ah! "Paradigma", was für ein gutes Wort! danke
sova

@sova Ich würde dies als die beste Antwort akzeptieren, da es einfach zu viele Paradigmen gibt, um sie in einer P.SE-Antwort aufzulisten, geschweige denn, um die Nuancen der einzelnen zu beschreiben.
Rei Miyasaka

9

Klicken Sie auf das Bild, um PDF zu sehen. Programmierparadigmen Poster

Sie sollten sich Programmierparadigmen für Dummies ansehen : Was jeder Programmierer von Peter Van Roy wissen sollte . Dies gibt Ihnen einen Überblick darüber, wie es draußen läuft.

Wenn Sie weiter gehen möchten, können Sie Konzepte, Techniken und Modelle der Computerprogrammierung lesen . Auf diese Weise lernen Sie nicht eine ganze Reihe von Sprachen, sondern lernen Paradigmen, die hinter verschiedenen Arten von Sprachen liegen. So fällt es Ihnen leichter, eine neue Sprache zu lernen.


6
  • Prozedural: Assembler, Java, C #, F #, Lisp, Fortran.

  • Set basiert: SQL.

  • Muster basiert: Perl, Regex, Snobol.

  • Baumbasiert: XSLT.

  • Array-basiert: APL.


2
+1 für die Verwendung eines anderen Klassifikationstyps und für das Erkennen, dass 'prozedural' tatsächlich die meisten Klassifikationen der anderen Personen enthält. (Das bedeutet natürlich nur, dass das Wort sehr wenig Bedeutung hat und das Fleisch in solchen Unterteilungen ist)
Javier

4

Es gibt verschiedene Möglichkeiten, dies zu beantworten, aber in Begriffen können sie wie folgt eingeteilt werden:

Maschinensprache: Maschinensprache ist eine einfache Programmiersprache. Es ist für Computer leicht verständlich, für Menschen jedoch schwer zu lesen. Dies ist der Grund, warum Leute höhere Programmiersprachen verwenden. In höheren Sprachen geschriebene Programme werden ebenfalls entweder kompiliert und / oder in Maschinensprache interpretiert, damit Computer sie ausführen können.

Assemblersprache: Assemblersprache ist eine Darstellung der Maschinensprache. Mit anderen Worten, jede Assemblersprachenanweisung wird in eine Maschinensprachenanweisung übersetzt. Obwohl Anweisungen in der Assemblersprache lesbar sind, sind die Anweisungen auf niedriger Ebene. Ein Nachteil der Assemblersprache ist, dass sie nicht portierbar ist, da jede Plattform mit einer bestimmten Assemblersprache geliefert wird.

Hochsprache: Hochsprachen werden heutzutage von den meisten Programmierern verwendet. Sprachen wie C, C ++ und Java sind alle Hochsprachen. Vorteile von Hochsprachen sind, dass sie gut lesbar und portabel sind. Ein Nachteil von Hochsprachen ist, dass sie weniger leistungsfähig sind als Assemblersprachen. Weil eine einzelne Anweisung in einer höheren Sprache in viele maschinensprachliche Anweisungen übersetzt wird.

Hochsprachen können weiter klassifiziert werden als:

  1. Funktionssprachen: In der Funktionssprache wird ein Programm in Funktionsdefinitionen unterteilt. Funktionssprachen sind eine Art deklarative Sprache. Sie basieren meist auf der typisierten Lambda-Rechnung mit Konstanten. Einige der berühmten Funktionssprachen sind Scala, F #, Clojure und Lisp.

  2. Verfahrenssprachen: In Verfahrenssprachen wird ein Programm in einer Abfolge von Schritten geschrieben, die befolgt werden sollten, um ein Ergebnis zu erzielen. COBOL, FORTRAN und C sind einige Verfahrenssprachen.

  3. Objektorientierte Programmiersprachen: In OOP-Sprachen wird ein Programm in Objekte unterteilt, die Daten enthalten, sowie in Methoden, die mit den Daten arbeiten. Java, C # und C ++ sind OOP-Sprachen.

  4. Logik Programmiersprachen: Mit Logiksprachen werden Programme erstellt, mit denen der Computer logisch argumentieren kann. zB: Logiksprache

Weitere Informationen finden Sie unter:


3

Ich neige dazu, in Bezug auf Funktionen zu denken:

Syntax:

C-basiert oder was-hast-du. Java hat eine C-basierte Syntax. Ich empfehle dringend, etwas wie Python oder Ruby auszuprobieren, um sich von der Syntax zu lösen und mehr über die Grundlagen der Funktionsweise einer bestimmten Sprache nachzudenken. Ich bin der Meinung, dass keine Syntax umfangreicher sein muss als C-basiert und keine problematischen Bausteine ​​rund um den Leerraum aufweist.

Kompiliert vs. interpretiert w. Build-Prozess vs. interpretiert / Konsole:

Ich bin mit den Problemen in Bezug auf die Kompilierungszeit und die Laufzeitumgebung nur sehr wenig vertraut, aber ich sehe, dass dort eine ganze Reihe von Problemen auftreten, über die ich selten nachdenke.

Ebenso gibt es viele interpretierte Sprachen, die immer noch einen kompilierten Prozess haben, um in einer virtuellen Maschine wie Java ausgeführt zu werden. Sie müssen immer noch neu erstellen, um Änderungen an den Dingen zu sehen.

Und dann gibt es noch JavaScript und Python, die Sie im laufenden Betrieb Befehl für Befehl in einer Konsole in einer Live-Umgebung ausführen können. Alle drei können zu sehr unterschiedlichen Arten des Codeschreibens führen.

Dynamisches oder striktes Tippen:

Ich neige dazu, die beiden als Designkompromisse zu sehen. Wenn Sie sich auf einem viel niedrigeren Niveau befinden und die Leistung kritisch ist, ist statisches Tippen sehr sinnvoll. Ich habe nie verstanden, dass einer "sicherer" ist als der andere, aber ich bin auf eine sehr plastische / dynamische Sprache gekommen, in der man nur lernt, wie das Schreibsystem funktioniert und was man im Grunde erwartet. Typ-Shenanigans sind für mich in JS selten ein Problem. In gewisser Weise kann die Flexibilität die Dinge robuster machen, obwohl dies zugegebenermaßen für einen Entwickler jüngerer Spielstärken ein bisschen geheimnisvoller ist, wenn Sie nicht über einige der Schlaglöcher in der Sprache Bescheid wissen.

Block Level Scope vs. Function Scope vs.

Die Blockebene ist die häufigste (in den meisten c-basierten Syntaxsprachen zwischen {}). Der JavaScript-Bereich basiert auf Funktionen (die auch dazu verwendet werden, um Objekte so effektiv wie möglich zu erstellen). Es gibt auch große Unterschiede in der Art des Zugriffs, den Sie vom inneren zum äußeren Bereich haben. Ich kenne andere Rahmenregelungen nicht, bin mir aber sicher, dass sie existieren.

Klassisches OOP vs. prototypisches OOP vs. Fast-OOP (Strukturen in C?) Vs. Nicht-OOP:

Sogar in OOP-Klassen gibt es viel Spielraum für Variationen. Ob Sie Mehrfachvererbung durchführen können (ew, weit darüber hinaus, ew), Schnittstellen definieren usw.

In JavaScript gibt es eine Art verkümmertes Hybrid-OOP für Prototypen, bei dem Objekte wesentlich einfacher und in hohem Maße wandelbar sind, aber wir haben immer noch die Möglichkeit, die Schnittstelle von internen Belangen zu trennen, wobei IMO der wichtige Aspekt der Verkapselung ist.

Das Besondere an OOP ist, dass es wirklich eine Menge Dinge gibt, die man erledigen kann, die im Wesentlichen OOP-orientiert sind, ohne technisch OOP zu sein. Es gibt natürlich Puristen, aber letztendlich geht es bei Design Patterns darum, bestimmte Abstraktionen zu erzielen, die in bestimmten Situationen gut funktionieren. Gehen Sie nicht zu schnell davon aus, dass Ideen aus einer OOP-basierten Sprache keinen Nutzen für etwas haben, das prozessorientierter ist. Und ich spreche nicht über JavaScript. Es ist überhaupt nicht durch seine doofe Version eines Prototyp-basierten OOP-Paradigmas eingeschränkt.

Erstklassige Funktionen:

Es fällt mir schwer, diese nicht in einer Sprache zu haben. Sie können Funktionen weitergeben, als wären sie Daten zur Verwendung in anderen Kontexten. Dies erleichtert insbesondere die Implementierung von Ereignishandhabungsschemata, erleichtert jedoch auch die Anpassung der Sprache an die gewünschte Funktionsweise. Es ist mehr als alles, was ich vermute, die Sache, die JavaScript zum ultimativen Erfolg gemacht hat, obwohl es in zwei Wochen entworfen und als Marketing-Schema mit einer Java-ungefähren Syntax versehen wurde.

Verschlüsse:

Ich bin nicht sicher, wo die Debatte für Java ist, aber ich weiß, dass viele Java-Entwickler vor ein oder zwei Jahren nach diesem Feature verlangt haben. Wenn eine Funktion geschlossen wird, kann in einer Nicht-Abschlusssprache nicht auf sie zugegriffen werden, wenn sie in der Lage ist, auf Inhalte von innerhalb dieser Funktion zu verweisen, da sie nicht ordnungsgemäß erfasst wurden. In einem Closure ist der Ausführungskontext so gebunden, dass Sie, wenn Sie in der Lage sind, auf Inhalte in dieser geschlossenen Funktion aus einem anderen Bereich wie in einem zurückgegebenen Objekt oder einer zurückgegebenen Funktion zu verweisen, diese Variablen im Grunde genommen so erhalten, wie sie waren, als die Funktion geschlossen wurde. Es ist, als würde man den Fuß in die Tür der Müllabfuhr klemmen, obwohl ich vermute, dass es sich eher um Kopien dieser Vars handelt, die in lokalen Vars der verweisenden Entität erstellt wurden.

Rigid / Strict / Safe vs. Ihnen das Seil geben, das Sie wollen:

JS-Entwickler und Java-Entwickler verstehen sich in der Regel überhaupt nicht und ich denke, das hat viel mit den beiden Sprachen zu tun, die sich in diesem speziellen Designspektrum nahezu gegenüberstehen. Ich möchte nicht, dass Sie mich vor mir selbst oder vor den anderen Entwicklern in meinem Team schützen. Ich möchte viel mehr in viel weniger Code tun und das alles je nach Situation auf sehr unterschiedliche (aber für eine bestimmte Domain einheitliche) Weise. Es gibt absolut Kompromisse zu beiden und viele Sprachen tendieren dazu, mehr in die Mitte zu fallen.


Boah, danke. Es ist wirklich schön, die Bemühungen um eine Abwahl ohne Erklärung durchzugehen.
Erik Reppen

2

Ich denke, eine Abkürzung für all das ist, genug Lisp zu lernen, um einige halbnützliche Dinge zu tun. Die meisten dieser Paradigmen begannen mit der Verwendung von Lisp, es ist also eine einfache Möglichkeit, Dinge auszuprobieren.

Es gibt eine Reihe von "Arten" von Sprachen, aber es können immer neue auftauchen. Grundsätzlich besteht der Zweck einer Sprache darin, die Kodierung von Ideen, Konzepten oder Anforderungen so direkt wie möglich zu ermöglichen. Zu diesem Zweck kann es Situationen geben, in denen bestehende Paradigmen fehlen und ein neues erforderlich sein könnte.

Eine Betrachtungsweise betrifft die Oberflächenstruktur. Wie direkt ermöglicht es Ihnen, Ideen präzise zu kodieren, sodass die entsprechende Änderung des Codes, wenn Sie Ihre Meinung zu dem ändern, was Sie möchten, ebenfalls einfach ist und nur geringe Chancen hat, Fehler einzuführen.

Eine andere Sichtweise ist die Kontrollstruktur. Wenn die Sprache ausgeführt wird (wenn ja), in welcher Reihenfolge geschehen die Dinge, um das zu erreichen, was Sie wollen? Beispiele sind: einfache Straight-Through-Ausführung, Rekursion, Backtrack, Parallelität. Ein, den ich (bescheidener Husten) entdeckte, war die differentielle Hinrichtung .

Ein weiterer nützlicher Gesichtspunkt ist, dass bei jedem Entwurf einer Datenstruktur eine Sprache geboren wird. Daten werden von den Anwendungsprogrammen "ausgeführt", die sie durchkämmen und Dinge tun, so wie ein Programm nur eine Reihe von Daten (wie Byte-Codes) ist, die von einem Interpreter verwendet werden, um Dinge zu tun.


Cool. Ich werde LISP lernen und erleuchtet sein. Spannend: D
sova 10.11.10

Wenn Sie jedoch sagen, dass durch die Verwendung einer Datenstruktur eine neue Zwischensprache erstellt wird, können Sie auch behaupten, dass in jedem Algorithmus eine neue Sprache geboren wird (alle Operationen werden notwendigerweise in einer Datenstruktur ausgeführt) und mit Reduzierung eine neue Sprache wird in jeder Codezeile geboren. Ich denke, Sie meinen etwas anderes, aber ich bin mir noch nicht sicher, ob ich es verstehe?
Sova

@sova: Für mich war die Informationstheorie eine großartige Offenbarung (sowohl Shannon als auch Kolmogorov). Es geht darum, wie Bedeutungen verschlüsselt und durch Kanäle geleitet werden, mit Konzepten wie Bandbreite, Fehlererkennung, Minimalcodierung, Zufälligkeit usw. Daten verschlüsseln also Informationen und Algorithmen sind Kanäle. Programme verschlüsseln Informationen und die Programmierung ist ein Kanal. Welche Informationen werden also codiert? woher kommt es und wann? wohin geht es Was sind die Fehlerquellen (Lärm)? Wie werden sie korrigiert? Ich fand das eine nützliche Perspektive.
Mike Dunlavey

@sova: (Fortsetzung) Sie müssen nicht die ganze abstoßende Mathematik beherrschen. Für mich war der Rahmen wichtig, in dem ich über Dinge nachdenken konnte.
Mike Dunlavey

1

Ich muss hinzufügen, dass es Programmiersprachen für bestimmte Anwendungen gibt. Die eine, an die man denkt, ist APT (Automatic Programmed Tool), eine Sprache, die in der Herstellung von Werkzeugmaschinen verwendet wird.


Ich erinnere mich daran. Ich habe es vielleicht sogar benutzt. Junge, das war auf dem neuesten Stand der Technik. Sie mussten die Fräsmaschine nicht manuell führen, sondern nur den Startknopf drücken. Und wenn es einen Fehler gäbe, würde die Hölle losbrechen.
Mike Dunlavey

Ich habe an Programmen gearbeitet, die Gcode für Fräsmaschinen generieren. Ich habe buchstäblich die Ergebnisse von Programmierfehlern festgehalten und gesehen, häufig meine.
David Thornley

Ich habe 20 Jahre damit verbracht, Postprozessoren auf mehreren Systemen zu installieren.
Dave
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.