Kommentare
- Würde ' nicht besser sagen " Welche Typ .. " statt wie viele?
- Nun, ich habe gelernt, dass so etwas wie Prolog und C grundlegend unterschiedlich sind, also dachte ich, dass jeder von ihnen entspricht eine andere Art von Programmiersprache, und ich hatte gehofft, einen Einblick in wie viele Arten zu bekommen.
- 2: Der Typ, der tut, was Sie wollen, und der Typ, der nicht ' t
- Das Erlernen verschiedener Arten von Programmiersprachen absolut ist konstruktiv ! Sie könnten möglicherweise argumentieren, dass dies als Duplikat davon geschlossen werden sollte, aber ich denke, dass sie ' deutlich genug sind, um Fragen zu beantworten bleiben Sie getrennt.
- @Sova, ich ' würde empfehlen, die erste Wahl neuer Sprachen zu treffen, um etwas auszuprobieren, das nicht ' t verwendet keine c-basierte Syntax. Dadurch wird Ihr Kopf mehr darauf konzentriert, wie es funktioniert und wie es ' anders ist als das, das Sie am besten kennen.
Antwort
Dies 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 wie um eine Aufgabe auszuführen, und deklarative Sprachen, in denen Sie dem Computer mitteilen, was zu tun ist. Deklarative Sprachen können weiter unterteilt werden in funktionale Sprachen, in denen ein Programm durch Zusammensetzen von Funktionen erstellt wird, und Logik Programmiersprachen, in denen ein Programm über eine Reihe logischer Verbindungen erstellt wird. 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; Zu den logischen Programmiersprachen gehört 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 Funktionssprachen gibt (Beispiele sind OCaml und Scala).
Sie können Sprachen auch gruppieren, indem Sie Folgendes eingeben: statisch und dynamisch . Statisch typisierte Sprachen sind Sprachen, in denen die Eingabe vor dem Ausführen des Programms überprüft (und normalerweise erzwungen) wird (normalerweise während einer Kompilierungsphase). Dynamisch typisierte Sprachen verschieben die Typprüfung auf die 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 Sprachen auch nach gruppieren ihre Typisierungsdisziplin : schwache Typisierung, die implizite Typkonvertierungen unterstützt, und starke Typisierung, die implizite Typkonvertierungen 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 betrachten. Das Schreiben von Disziplin ist sowieso kein wirklich nützlicher Weg, um Sprachen zu gruppieren.
Kommentare
- Wollte etwas Ähnliches darstellen, wird aber +1 und Fügen Sie stattdessen Kommentare hinzu. Jede Kategorie oder Kombination verfügt auch über zahlreiche Ausgründungen, die durch die Fokussierung auf bestimmte Elemente erstellt werden. OOP erzeugt beispielsweise: Prototyp-basiertes OOP, aspektorientierte Programmierung, komponentenbasierte Programmierung usw. Auch funktionale Paradigmen Spin-offs haben, z. B. Sprachen, in denen ein asynchroner Prozess oder Thread die Basiseinheit ist und Sie programmieren, indem Sie parallele Prozesse zusammensetzen.
- Wie würden Skriptsprachen, z. B. VBScript, dazu passen? Ein bisschen prozedural und ein bisschen OO, da man verschiedene Typen erstellen kann. Wäre das ein Hybrid?
- Genau das habe ich gesucht. Vielen Dank.
- @ JB King OOP-Sprachen sind normalerweise prozedural, zumindest innerhalb der Methodenkörper.Außerdem ist ' ein häufiges Missverständnis, dass OOP " Objekte " bedeutet. Viele Sprachen haben Datentypen und Objekte. ' wird viel darüber diskutiert, wie OOP genau definiert wird, aber es beinhaltet normalerweise Vererbung und / oder Kapselung (privater Staat) als Hauptthemen. Eine Sprache ohne eine in irgendeiner Form wäre schwer als OOP-Sprache zu klassifizieren.
- @sova Ich kann mir nur zwei Sprachen vorstellen, die so funktionieren. Erlang basiert stark auf Parallelverarbeitung, aber wenn Sie mehr von dem wollen, worüber ich genau gesprochen habe, sollten Sie sich Polyphonic C # ansehen. Es ' ist eine Forschungssprache (jetzt in C-Omega gefaltet), 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 synchronen und asych-Aufrufen. Schauen Sie sich auch Arrows in FP an, insbesondere Haskell. Pfeile sind sehr ähnlich.
Antwort
- Assembly
- Prozedural
- Basic
- C
- Objektorientiert
- C #
- Java
Deklarativ
- Prolog
- SQL
- Lisp
- Haskell
Dies sind die wichtigsten, aber es gibt „viele andere Paradigmen da draußen, und es gibt viele Überschneidungen zwischen ihnen.
Kommentare
- Wie wäre es mit deklarativ (z. B. Prolog, SQL)?
- @Bruce, hab sie jetzt.
- Ja, das war die allgemeine Idee, die ich gelernt habe irgendwo auf dem Weg.
- Sollte nicht Wird die Assembly nicht als prozedural angesehen?
- Wie wäre es mit verketteten (stapelbasierten) Programmiersprachen wie Forth und Factor? Sie könnten es als eine Art funktionale Programmierung betrachten, aber ' ist wahrscheinlich deutlich genug, um erwähnt zu werden. de.wikipedia.org/wiki/Concatenative_programming_language
Antwort
Informationen zu Programmiersprachen (Paradigmen) finden Sie hier:
http://en.wikipedia.org/wiki/Programming_paradigm
Weitere Merkmale von Programmiersprachen (z. B. Typsysteme) finden Sie hier: http://en.wikipedia.org/wiki/Programming_language
Kommentare
- ah! " Paradigma " Was für ein gutes Wort! danke
- @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.
Antwort
Klicken Sie auf das Bild, um PDF anzuzeigen.
Sie sollten sich Programmierparadigmen für Dummies ansehen: Was jeder Programmierer wissen sollte von Peter Van Roy. Dies gibt Ihnen einen Überblick darüber, wie es draußen abläuft.
Wenn Sie weiter gehen möchten, können Sie Konzepte, Techniken und Modelle von lesen Computerprogrammierung . Auf diese Weise lernen Sie keine ganze Reihe von Sprachen, aber Sie lernen Paradigmen, die hinter verschiedenen Arten von Sprachen stehen. Das Erlernen einer neuen Sprache wird für Sie einfacher.
Antwort
-
Vorgehensweise: Zusammenbau, Java, C #, F #, Lisp, Fortran.
-
Satzbasiert: SQL.
-
Musterbasiert: Perl, Regex, Snobol.
-
Baumbasiert: XSLT.
-
Arraybasiert: APL.
Kommentare
- +1 für die Verwendung eines anderen Klassifizierungstyps und auch für das Erkennen der ' prozeduralen ' enthält tatsächlich die meisten Klassifikationen der anderen Personen '. (Das bedeutet natürlich nur, dass das Wort nur eine sehr geringe Bedeutung hat und sich das Fleisch in solchen Unterteilungen befindet.)
Antwort
Es gibt verschiedene Möglichkeiten, dies zu beantworten. Sie können jedoch wie folgt kategorisiert werden:
Maschinensprache: Maschinensprache ist eine einfache Programmiersprache. Es ist für Computer leicht verständlich, für Menschen jedoch schwer zu lesen. Aus diesem Grund verwenden die Benutzer Programmiersprachen auf höherer Ebene. In Hochsprachen 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, jeder Assembler-Befehl wird in einen Maschinensprachenbefehl übersetzt. Assembler-Anweisungen sind zwar lesbar, aber immer noch 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 sehr 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 ferner klassifiziert werden als:
-
Funktionssprachen: In der Funktionssprache ist ein Programm in Funktionsdefinitionen unterteilt. Funktionale Sprachen sind eine Art deklarative Sprache. Sie basieren meist auf dem typisierten Lambda-Kalkül mit Konstanten. Einige der bekanntesten Funktionssprachen sind Scala, F #, Clojure und Lisp.
-
Prozedurale Sprachen: In prozeduralen Sprachen wird ein Programm geschrieben eine Abfolge von Schritten, die befolgt werden sollten, um ein Ergebnis zu erzielen. COBOL, FORTRAN und C sind einige prozedurale Sprachen.
-
Objektorientierte Programmiersprachen: In OOP-Sprachen ist ein Programm unterteilt in Objekt, das Daten enthält, sowie Methoden, die mit den Daten arbeiten. Java, C # und C ++ sind OOP-Sprachen.
-
Logikprogrammiersprachen: Logiksprachen werden verwendet, um Programme zu erstellen, die ermöglicht es dem Computer, logisch zu argumentieren. Beispiel: Logiksprache
Ausführliche Informationen finden Sie unter:
Antwort
Ich neige dazu, in 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 sperriger als C-basiert sein muss und keine Probleme mit Bausteinen im Leerraum hat.
Kompiliert vs. interpretiert mit Build-Prozess vs. interpretiert / Konsole:
Ich bin mit Bedenken hinsichtlich Kompilierungszeit und Laufzeitumgebung nur sehr wenig vertraut, aber ich verstehe das Dort gibt es eine ganze Reihe von Bedenken, an die ich selten denke.
Ebenso gibt es viele interpretierte Sprachen, die immer noch einen kompilierbaren Prozess für die Ausführung in einer virtuellen Maschine haben, wie dies Java tut. Sie müssen noch neu erstellen, um Änderungen an den Dingen zu sehen.
Und dann gibt es 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 dazu führen sehr unterschiedliche Arten, Code zu schreiben.
Dynamische vs. strenge Eingabe:
Ich neige dazu, die beiden als Design-Kompromisse zu betrachten. Wenn Sie sich auf einem viel niedrigeren Niveau befinden und die Leistung kritisch ist, ist statisches Tippen sehr sinnvoll. Ich habe diese Vorstellung, dass einer „sicherer“ ist als ein anderer, nie verstanden, aber ich kam in einer sehr plastischen / dynamischen Sprache, in der man einfach 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 es für einen Entwickler mit höherem Level zugegebenermaßen ein bisschen arkaner ist, wenn Sie einige der Schlaglöcher in der Sprache nicht kennen.
Bereich auf Blockebene vs. Funktionsbereich vs. ?:
Blockebene ist die häufigste (alles) zwischen {} in den meisten c-basierten Syntaxsprachen). Der JavaScript-Bereich basiert auf Funktionen (die auch verwendet werden, um Objekte so effektiv zu erstellen). Es gibt auch große Unterschiede in der Art des Zugriffs, den Sie vom inneren Bereich aus haben zu einem äußeren Bereich. Ich bin mit anderen Scoping-Schemata nicht vertraut, aber ich bin mir sicher, dass sie existieren.
Klassische OOP vs. prototypische OOP vs. Almost-OOP (Strukturen in C. ?) vs Non-OOP:
Auch bei klassenbasiertem OOP gibt es viel Raum für Variationen. Ob Sie mehrere Vererbungen durchführen können (ew, weit darüber hinaus, ew), Schnittstellen definieren usw.
In JavaScript haben wir eine Art verkümmertes hybrides prototypisches OOP, bei dem Objekte wesentlich einfacher und in hohem Maße veränderlich sind, aber wir haben immer noch die Möglichkeit, die Schnittstelle von internen Belangen zu trennen, was IMO der wichtige Aspekt der Kapselung ist .
Die Sache mit OOP ist, dass es wirklich eine Menge Dinge gibt, die Sie erledigen können, 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. Seien Sie nicht zu schnell, um anzunehmen, dass Ideen aus einer OOP-basierten Sprache keinen Nutzen für etwas haben, das eher prozedural ausgerichtet ist. Und ich spreche nicht von JavaScript. Es ist überhaupt nicht durch seine doofe Version eines prototypbasierten OOP-Paradigmas eingeschränkt.
Erstklassige Funktionen :
Es ist schwer für mich, diese nicht in einer Sprache zu haben. Sie können Funktionen so weitergeben, als wären sie Daten zur Verwendung in anderen Kontexten. Dies macht insbesondere Ereignisbehandlungsschemata sehr einfach zu implementieren, aber es macht es auch sehr einfach, die Sprache so anzupassen, dass sie so funktioniert, wie Sie es möchten. Es ist mehr als alles, was ich vermute, das, was JavaScript zum Erfolg gemacht hat dass es ultimativ war, obwohl es in zwei Wochen entwickelt wurde und Java-ungefähre Syntax als Marketingschema verwendet wurde.
Closures:
Ich bin mir nicht sicher, wo die Debatte für Java stattfindet, aber ich weiß, dass viele Java-Entwickler vor ein oder zwei Jahren nach dieser Funktion gesucht haben. In einer Nicht-Schließungssprache kann beim Schließen einer Funktion alles, was irgendwie auf Inhalte aus dieser Funktion verweisen kann, nicht darauf zugreifen, da sie durch Müll gesammelt wurde. In einer Schließung ist der Ausführungskontext so gebunden, dass Sie „Wenn Sie in der Lage sind, auf Inhalte innerhalb dieser geschlossenen Funktion zu verweisen, wie in einem zurückgegebenen Objekt oder einer zurückgegebenen Funktion, erhalten Sie diese Variablen im Grunde so, wie sie waren, als die Funktion geschlossen wurde. Es ist wie ein Blockieren Ihres Fußes in der Tür der Speicherbereinigung, obwohl ich vermute, dass es eher wie Kopien dieser Variablen implementiert ist, die in lokalen Variablen der verweisenden Entität erstellt wurden.
Starr / streng / sicher vs. Ihnen das Seil geben, das Sie wollen:
JS-Entwickler und Java-Entwickler verstehen sich normalerweise nicht andere überhaupt und ich denke, es hat viel damit zu tun, dass die beiden Sprachen auf nahezu entgegengesetzte Seiten dieses speziellen Designspektrums fallen. 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 alles auf sehr unterschiedliche (aber für eine bestimmte Domain konsistente) Weise, je nachdem Es gibt absolut Kompromisse zwischen beiden und viele Sprachen tendieren dazu, eher in die Mitte zu fallen.
Kommentare
- Gee, danke ' Es ist wirklich schön, sich ohne Erklärung um eine Abstimmung zu bemühen.
Antwort
Ich denke, eine Abkürzung zu all diesen Themen besteht darin, genug Lisp zu lernen, um einige halb nützliche Dinge zu tun. Die meisten dieser Paradigmen begannen als Möglichkeiten, Lisp zu verwenden, also ist es ein einfacher Weg um Dinge auszuprobieren.
Es gibt eine Reihe von „Arten“ von Sprachen, aber es können immer neue erscheinen. 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 möglicherweise ein neues erforderlich ist.
Eine Sichtweise ist die Oberflächenstruktur. Wie direkt können Sie Ideen präzise codieren, sodass die entsprechende Änderung des Codes auch einfach ist, wenn Sie Ihre Meinung über das, was Sie möchten, ändern, ohne dass die Möglichkeit besteht, Fehler einzuführen.
Ein anderer Weg zu Schauen Sie sich das in Bezug auf die Kontrollstruktur an. Wenn die Sprache ausgeführt wird (wenn ja), in welcher Reihenfolge geschehen die Dinge, um das zu erreichen, was Sie wollen? Beispiele sind: einfache direkte Ausführung, Rekursion, Backtrack, Parallelität. Ein I (bescheidener Husten), der entdeckt wurde, war differentielle Ausführung .
Ein weiterer nützlicher Gesichtspunkt ist, dass jedes Mal, wenn eine Datenstruktur entworfen wird, eine Sprache ist geboren. Daten werden von den Anwendungsprogrammen „ausgeführt“, die sie durchkämmen und Dinge tun, genauso wie ein Programm nur eine Reihe von Daten (wie Bytecodes) ist, die von einem Interpreter verwendet werden, um Dinge zu tun.
Kommentare
- Cool. Ich werde LISP lernen und erleuchtet sein. Aufregend: D
- Wenn Sie jedoch sagen, dass durch die Verwendung einer Datenstruktur eine neue Zwischensprache erstellt wird, können Sie auch argumentieren, dass in jedem Algorithmus eine neue Sprache geboren wird (alle Operationen werden notwendigerweise an Daten durchgeführt Struktur), und mit der Reduzierung wird in jeder Codezeile eine neue Sprache geboren. Ich denke, Sie meinen etwas anderes, aber ich ' bin mir nicht ganz sicher, ob ich es noch verstehe?
- @sova: Für mich war die Informationstheorie eine großartige Offenbarung (sowohl Shannon als auch Kolmogorov). ' handelt davon, wie Bedeutungen codiert und durch Kanäle geleitet werden, mit Konzepten von Bandbreite, Fehlererkennung, minimaler Codierung, Zufälligkeit usw. Datencodierungsinformationen und Algorithmen sind also Kanäle . Programme codieren Informationen und die Programmierung ist ein Kanal. Welche Informationen sind also verschlüsselt? Woher kommt es und wann? wohin geht es Was sind die Fehlerquellen (Rauschen)? Wie werden sie korrigiert? Ich fand das eine nützliche Perspektive.
- @sova: (Fortsetzung) Sie ' müssen nicht alle abstoßenden Berechnungen beherrschen. Für mich war der Rahmen wichtig, in dem ich über Dinge nachdenken konnte.
Antwort
Ich muss Fügen Sie hinzu, dass es Programmiersprachen für bestimmte Anwendungen gibt. Das, was mir in den Sinn kommt, ist APT (Automatic Programmed Tool), eine Sprache, die bei der Herstellung von Werkzeugmaschinen verwendet wird.
Kommentare
- Ich erinnere mich an diese. 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.
- Ich ' habe an Programmen gearbeitet, die Gcode für Fräsmaschinen generieren. Ich ' habe die Ergebnisse von Programmierfehlern, häufig meine, buchstäblich festgehalten und gesehen.
- Ich habe 20 Jahre damit verbracht, Postprozessoren auf Gobs von Systemen zu installieren.