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.
Antworten:
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.
quelle
Dies sind die wichtigsten, aber es gibt viele andere Paradigmen, und es gibt viele Überschneidungen zwischen ihnen.
quelle
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
quelle
Klicken Sie auf das Bild, um PDF zu sehen.
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.
quelle
Prozedural: Assembler, Java, C #, F #, Lisp, Fortran.
Set basiert: SQL.
Muster basiert: Perl, Regex, Snobol.
Baumbasiert: XSLT.
Array-basiert: APL.
quelle
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:
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.
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.
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.
Logik Programmiersprachen: Mit Logiksprachen werden Programme erstellt, mit denen der Computer logisch argumentieren kann. zB: Logiksprache
Weitere Informationen finden Sie unter:
quelle
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.
quelle
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.
quelle
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.
quelle