Wenn Sie nur ein Paar Bolzenschneider und eine Flasche Wodka haben, sieht alles aus wie das Schloss an der Tür von Wolf Blitzers Bootshaus. (Ersetzen Sie das durch einen Hammer und einen Nagel, wenn Sie xkcd nicht lesen)
Ich programmiere derzeit Clojure, Python, Java und PHP, daher bin ich mit der C- und LISP-Syntax sowie der Whitespace-Sache vertraut. Ich kenne imperative, funktionale, unveränderliche OOP- und ein paar Systeme und andere Dinge. Jetzt will ich mehr!
Welche Sprachen verfolgen einen anderen Ansatz und sind entweder für die Auswahl praktischer Werkzeuge oder für das theoretische Verständnis nützlich?
Ich habe keine Lust, eine andere funktionale Sprache (Haskell) oder eine andere zwingende OOP-Sprache (Ruby) zu lernen, und ich möchte auch keine unpraktischen Spaßsprachen wie Brainfuck üben.
Eine sehr interessante Sache, die ich fand, sind monoikonische stapelbasierte Sprachen wie Factor.
Erst wenn ich das Gefühl habe, die meisten Konzepte zu verstehen und Antworten auf alle meine Fragen zu haben, möchte ich über meine eigene Spielzeugsprache nachdenken, um alle meine persönlichen Vorlieben zu berücksichtigen.
Antworten:
Praktische Fragen sind sehr subjektiv, daher möchte ich einfach sagen, dass das Erlernen verschiedener Sprachparadigmen nur dazu dient, Sie zu einem besseren Programmierer zu machen. Was ist praktischer als das?
Funktional, Haskell - Ich weiß, dass Sie gesagt haben, dass Sie nicht wollten, aber Sie sollten es wirklich wirklich überdenken. Sie haben mit Clojure und sogar Python einige funktionale Erfahrungen gemacht, aber ohne Haskell haben Sie es nicht in vollen Zügen erlebt. Wenn Sie wirklich gegen Haskell sind, sind gute Kompromisse entweder ML oder OCaml.
Deklarativ, Datalog - Viele Leute würden Prolog in diesem Slot empfehlen, aber ich denke, Datalog ist ein saubereres Beispiel für eine deklarative Sprache.
Array, J - Ich habe J gerade erst entdeckt, aber ich finde, dass es eine atemberaubende Sprache ist. Es wird Ihren Geist in eine Brezel verwandeln. Sie werden J dafür danken.
Stack, Factor / Forth - Factor ist sehr mächtig und ich habe vor, mich so schnell wie möglich damit zu beschäftigen. Forth ist der Urvater der Stack-Sprachen, und als zusätzlichen Bonus ist es einfach, sich selbst zu implementieren . Es gibt etwas zu sagen über das Lernen durch Implementierung.
Datenfluss, Oz - Ich denke, der Einfluss von Oz ist auf den Aufschwung und wird erst in Zukunft weiter wachsen.
Prototypbasiert, JavaScript / Io / Self - Self ist der Urvater und hat großen Einfluss auf jede prototypbasierte Sprache. Dies ist nicht dasselbe wie klassenbasiertes OOP und sollte nicht als solches behandelt werden. Viele Leute kommen zu einer Prototypsprache und erstellen ein Ad-hoc-Klassensystem, aber wenn Ihr Ziel darin besteht, Ihren Geist zu erweitern, dann halte ich das für einen Fehler. Verwenden Sie die Sprache in vollem Umfang. Ideen finden Sie unter Organisieren von Programmen ohne Unterricht .
Expertensystem, CLIPS - Ich empfehle dies immer. Wenn Sie Prolog kennen, haben Sie wahrscheinlich die Oberhand, um sich auf dem Laufenden zu halten, aber es ist eine ganz andere Sprache.
Frink - Frink ist eine Allzwecksprache, die jedoch für ihr System der Einheitenumrechnung bekannt ist. Ich finde diese Sprache sehr inspirierend in ihrem unerbittlichen Bestreben, das Beste in dem zu sein, was sie tut. Plus ... es macht wirklich Spaß!
Funktionale + optionale Typen, Qi - Sie sagen, Sie haben Erfahrung mit einigen Typsystemen, aber haben Sie Erfahrung mit "skinnbaren * Typsystemen? Niemand hat ... aber sie sollten. Qi ist in vielerlei Hinsicht wie Lisp, aber es ist Typ System wird Sie umhauen.
Schauspieler + Fehlertoleranz, Erlang - Erlangs Prozessmodell wird viel beachtet, aber seine Fehlertoleranz- und Hot-Code-Swapping-Mechanismen verändern das Spiel. Sie werden nicht viel über FP lernen, was Sie mit Clojure nicht lernen würden, aber die FT-Funktionen lassen Sie sich fragen, warum mehr Sprachen dies nicht richtig zu machen scheinen.
Genießen!
quelle
Was ist mit Prolog (zur Vereinheitlichung / Rückverfolgung usw.), Smalltalk (für "Alles ist eine Nachricht"), Forth (umgekehrte Politur, Thread-Interpreter usw.), Schema (Fortsetzung)?
Keine Sprache, aber die Kunst des Metaobjektprotokolls ist umwerfend
quelle
Ich bin zweiter Haskell. Denken Sie nicht "Ich kenne ein Lisp, also kenne ich funktionale Programmierung". Schon mal was von Typklassen gehört? Algebraische Datentypen? Monaden? "Moderne" (mehr oder weniger - mindestens nicht 50 Jahre alt;)) funktionale Sprachen, insbesondere Haskell, haben eine Vielzahl sehr leistungsfähiger nützlicher neuer Konzepte erforscht. Typklassen fügen Ad-hoc-Polymorphismus hinzu, aber Typinferenz (eine weitere Sache, die die Sprachen, die Sie bereits kennen, nicht haben) funktioniert wie ein Zauber. Algebraische Datentypen sind einfach fantastisch, insbesondere zum Modellieren von baumartigen Datenstrukturen, funktionieren aber auch gut für Aufzählungen oder einfache Datensätze. Und Monaden ... sagen wir einfach, die Leute verwenden sie, um Ausnahmen, E / A, Parser, Listenverständnisse und vieles mehr zu machen - auf rein funktionale Weise!
Außerdem ist das ganze Thema tief genug, um einen jahrelang zu beschäftigen;)
quelle
C.
Es liegt viel C-Code herum - es ist definitiv praktisch. Wenn Sie auch C ++ lernen, gibt es viel mehr Code (und der Sprung ist kurz, sobald Sie C und Java kennen).
Es gibt Ihnen auch ein gutes Verständnis für einige theoretische Fragen (oder zwingt Sie dazu). Beispielsweise befindet sich jedes laufende Programm in gewissem Sinne in einem 4-GB-Byte-Array. Zeiger in C sind wirklich nur Indizes in diesem Array - sie sind nur eine andere Art von Ganzzahl. Nicht anders in Java, Python, PHP, außer unter einer Oberflächenebene versteckt.
Sie können auch objektorientierten Code in C schreiben. Sie müssen nur ein wenig manuell mit vtables und dergleichen umgehen. Die Portable Puzzle Collection von Simon Tatham ist ein großartiges Beispiel für einen ziemlich zugänglichen objektorientierten C-Code. Es ist auch ziemlich gut gestaltet und für einen Anfänger / fortgeschrittenen C-Programmierer eine Lektüre wert. Dies ist auch in Haskell der Fall - Typklassen sind in gewissem Sinne "nur eine andere vtable".
Eine weitere großartige Sache bei C: Wenn Sie sich mit erfahrenen C-Programmierern an Fragen und Antworten beteiligen, erhalten Sie viele Antworten, die C anhand von Konstrukten auf niedrigerer Ebene erklären, wodurch Ihre Wissensbasis näher am Eisen liegt.
Möglicherweise fehlt mir der Punkt von OP - ich denke, ich bin es, gemessen an den anderen Antworten -, aber ich denke, es könnte eine nützliche Antwort für andere Leute sein, die eine ähnliche Frage haben und diesen Thread lesen.
quelle
Von Peter Norvigs Seite:
"Lernen Sie mindestens ein halbes Dutzend Programmiersprachen. Fügen Sie eine Sprache hinzu, die Klassenabstraktionen unterstützt (wie Java oder C ++), eine, die funktionale Abstraktion unterstützt (wie Lisp oder ML), eine, die syntaktische Abstraktion unterstützt (wie Lisp), eine, die deklarative Sprachen unterstützt Spezifikationen (wie Prolog- oder C ++ - Vorlagen), eine, die Coroutinen unterstützt (wie Icon oder Scheme), und eine, die Parallelität unterstützt (wie Sisal). "
http://norvig.com/21-days.html
quelle
Ich bin erstaunt, dass nach 6 Monaten und Hunderten von Stimmen niemand SQL erwähnt hat ...
quelle
In den Typen als Theoreme / fortgeschrittene Typsysteme: Coq (ich denke, Agda kommt auch in diese Kategorie).
Coq ist ein Proof-Assistent, der in eine funktionale Programmiersprache eingebettet ist.
Sie können mathematische Beweise schreiben und Coq hilft beim Erstellen einer Lösung. Sie können Funktionen schreiben und Eigenschaften darüber beweisen.
Es hat abhängige Typen, die mich allein umgehauen haben. Ein einfaches Beispiel:
ist die Signatur einer Funktion, die zwei Arrays der Größe n und m von Elementen von A verkettet und ein Array der Größe (n + m) zurückgibt. Es wird nicht kompiliert, wenn die Funktion das nicht zurückgibt!
Basiert auf der Berechnung induktiver Konstruktionen und hat eine solide Theorie dahinter. Ich bin nicht klug genug, um alles zu verstehen, aber ich denke, es lohnt sich, einen Blick darauf zu werfen, besonders wenn Sie zur Typentheorie tendieren.
EDIT: Ich muss erwähnen: Sie schreiben eine Funktion in Coq und dann können Sie beweisen, dass sie für jede Eingabe korrekt ist, das ist erstaunlich!
quelle
Eine der Sprachen , die ich interessiert bin für eine ganz andere Sicht haben (einschließlich einer neuen Vokabular der Sprachelemente und eine radikale diff Syntax zu definieren) ist J . Haskell wäre für mich die offensichtliche Wahl, obwohl es sich um eine funktionale Sprache handelt, da das Typsystem und andere einzigartige Funktionen Ihren Geist öffnen und Sie dazu bringen, Ihre Vorkenntnisse in der (funktionalen) Programmierung zu überdenken.
quelle
Genau wie Fogus es Ihnen in seiner Liste vorgeschlagen hat, rate ich Ihnen auch, sich die Sprache OzML / Mozart anzuschauen Viele Paradigmen, die hauptsächlich auf Parallelität / Multi-Agent-Programmierung abzielen.
In Bezug auf Parallelität und verteilten Kalkül wird das Äquivalent des Lambda-Kalküls (das hinter der funktionalen Programmierung steht) als Pi-Kalkül bezeichnet.
Ich habe erst angefangen, mir eine Implementierung des Pi-Kalküls anzuschauen. Aber sie haben meine Vorstellungen vom Rechnen bereits erweitert.
quelle
Die Datenflussprogrammierung, auch bekannt als flussbasierte Programmierung, ist ein guter Schritt voraus. Einige Schlagworte: Paralell-Verarbeitung, Rapid Prototyping, visuelle Programmierung (nicht so schlecht wie zuerst klingt).
Die Artikel von Wikipedia sind gut:
Lesen Sie das Buch von JPM: http://jpaulmorrison.com/fbp/
(Wir haben eine einfache Implementierung in C ++ für Heimautomationszwecke geschrieben und sind sehr zufrieden damit. Die Dokumentation befindet sich im Aufbau.)
quelle
Sie haben viele Sprachen gelernt. Jetzt ist es an der Zeit, sich auf eine Sprache zu konzentrieren und sie zu beherrschen.
quelle
Vielleicht möchten Sie LabView für seine visuelle Programmierung ausprobieren, obwohl es für technische Zwecke ist.
Trotzdem scheinen Sie ziemlich interessiert an allem zu sein, was da draußen ist, daher der Vorschlag
Sie können auch den Android Appinventor zum visuellen Erstellen von Inhalten ausprobieren
quelle
Bruce A. Tate schrieb auf einer Seite von The Pragmatic Programmer ein Buch darüber: Sieben Sprachen in sieben Wochen: Ein pragmatischer Leitfaden zum Erlernen von Programmiersprachen
In dem Buch behandelt er Clojure, Haskell, Io, Prolog, Scala, Erlang und Ruby.
quelle
Quecksilber : http://www.mercury.csse.unimelb.edu.au/
Es ist ein typisierter Prolog mit Eindeutigkeitstypen und -modi (dh Angabe des Prädikats)
append(X,Y,Z)
an Y angehängte X Z ist, ergibt ein Z bei einem X und Y, kann jedoch mehrere X / Ys für ein gegebenes Z ergeben). Auch kein Schnitt oder andere außerlogische Prädikate.Wenn Sie so wollen, geht es um Prolog wie um Haskell um Lisp.
quelle
Das erste Datenbanksystem war für mich dBaseIII. Ich habe ungefähr einen Monat damit verbracht, kleine Beispiele zu schreiben (dBase / FoxPro / Clipper ist eine tabellenbasierte Datenbank mit Indizes). Dann traf ich an meinem ersten Arbeitsplatz MUMPS und bekam Kopfschmerzen. Ich war jung und frisch, aber es dauerte 2 Wochen, um das MUMPS-Datenbankmodell zu verstehen. Es gab einen Moment, wie in Comics: Nach 2 Wochen wurde ein Knopf eingeschaltet und die Glühbirne hat sich in meinem Kopf gerade aufgehellt. MUMPS ist natürlich, niedrig und sehr, sehr schnell. (Es ist ein unausgeglichener, nicht formalisierter Baum ohne Typen.) Die heutigen Trends zeigen den Weg zurück: NoSQL, Schlüsselwert-Datenbank, mehrdimensionale Datenbank - es sind also nur noch einige Schritte übrig, und wir erreichen Mumps.
Hier ist eine Präsentation über die Vorteile von MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation
Ein kurzes Dokument zur hierarchischen Datenbank: http://www.cs.pitt.edu/~chang/156/14hier.html
Eine Einführung in MUMPS-Globals (in MUMPS sind lokale Variablen, kurz: Locals sind die Speichervariablen, und die globalen Variablen, kurz: Globals sind die "DB-Variablen", das Festlegen einer globalen Variablen wird sofort auf die Festplatte übertragen): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)
quelle
Angenommen, Sie möchten ein Liebesgedicht schreiben ...
Anstatt einen Hammer zu verwenden, nur weil sich bereits einer in Ihrer Hand befindet, lernen Sie die richtigen Werkzeuge für die Aufgabe: Lernen Sie, Französisch zu sprechen.
Sobald Sie das muttersprachliche Niveau erreicht haben, können Sie mit Ihrem Gedicht beginnen.
quelle
Während das Erlernen neuer Sprachen auf akademischer Ebene ein interessantes Hobby ist, können Sie meiner Meinung nach erst dann wirklich lernen, eine zu verwenden, wenn Sie versuchen, sie auf ein Problem der realen Welt anzuwenden. Anstatt nach einer neuen Sprache zum Lernen zu suchen, würde ich an Ihrer Stelle zuerst nach neuen Dingen suchen, die gebaut werden könnten, und erst dann würde ich nach der richtigen Sprache suchen, die für dieses eine bestimmte Projekt verwendet werden kann. Wählen Sie zuerst das Problem aus, dann das Werkzeug, nicht umgekehrt.
quelle
Für alle, die seit Mitte der 80er Jahre nicht mehr da waren, würde ich empfehlen, 8-Bit-BASIC zu lernen. Es ist sehr niedrig, sehr primitiv und es ist eine interessante Übung, um seine Löcher zu programmieren.
In der gleichen Zeile würde ich einen Taschenrechner der HP-41C-Serie (oder einen Emulator, obwohl nichts besser ist als echte Hardware) auswählen. Es ist schwer, dein Gehirn darum zu wickeln, aber es lohnt sich. Ein TI-57 reicht aus, wird aber eine ganz andere Erfahrung sein. Wenn Sie es schaffen, Gleichungen zweiten Grades auf einem TI-55 zu lösen, werden Sie als Master betrachtet (es gab keine Bedingungen und keine Verzweigungen außer einem RST, der das Programm auf Schritt 0 zurücksprang).
Und zuletzt würde ich FORTH wählen (es wurde bereits erwähnt). Es hat eine nette "Build your language" Lisp-artige Sache, ist aber viel mehr Bare Metal. Hier erfahren Sie, warum Rails interessant ist und wann DSLs sinnvoll sind, und Sie erhalten einen Einblick in die Gedanken Ihres Nicht-RPN-Rechners während der Eingabe.
quelle
PostScript. Es ist eine ziemlich interessante Sprache, da sie stapelbasiert ist, und es ist ziemlich praktisch, wenn Sie Dinge auf Papier bringen und sie entweder erledigen oder Fehler beheben möchten, warum sie nicht erledigt werden.
Erlang. Die intrinsische Parallelität gibt ihm ein eher ungewöhnliches Gefühl und Sie können daraus wieder nützliche Dinge lernen. Ich bin mir hinsichtlich der Praktikabilität nicht so sicher, aber es kann für einige schnelle Prototyping-Aufgaben und hochredundante Systeme nützlich sein.
Versuchen Sie, GPUs zu programmieren - entweder CUDA oder OpenCL. Es sind nur C / C ++ - Erweiterungen, aber das mentale Modell der Architektur unterscheidet sich wieder völlig vom klassischen Ansatz, und es wird definitiv praktisch, sobald Sie eine echte Zahlenkalkulation durchführen müssen.
quelle
Erlang, Forth und einige Embedded arbeiten mit Assemblersprache. Ja wirklich; Kaufen Sie ein Arduino-Kit oder ähnliches und erzeugen Sie beim Zusammenbau einen polyphonen Piepton. Du wirst wirklich etwas lernen.
quelle
Es gibt auch anic :
https://code.google.com/p/anic/
Von seiner Website:
Es scheint sich nicht mehr in der aktiven Entwicklung zu befinden, aber es scheint einige interessante Konzepte zu haben (und das ist schließlich das, wonach Sie zu suchen scheinen).
quelle
Obwohl ich Ihre Anforderung von "anders" nicht erfülle, würde ich dieses Fantom wetten eine Sprache ist, die ein professioneller Programmierer betrachten sollte. Die Autoren von Fantasom nennen es nach eigenen Angaben eine langweilige Sprache. Es unterstützt lediglich die häufigsten Anwendungsfälle von Java und C # mit einer geliehenen Abschlusssyntax von Ruby und ähnlichen neueren Sprachen.
Und doch schafft es es, einen eigenen Bootstrap-Compiler zu haben, eine Plattform bereitzustellen, die eine Drop-in-Installation ohne externe Abhängigkeiten aufweist, Pakete richtig macht - und auf Java, C # und jetzt im Web (über js) funktioniert.
Es erweitert möglicherweise nicht Ihren Horizont in Bezug auf neue Programmiermethoden, zeigt Ihnen jedoch sicherlich bessere Programmiermethoden.
quelle
Eine Sache, die mir in den anderen Antworten fehlt: Sprachen, die auf dem Umschreiben von Begriffen basieren.
Sie können einen Blick auf Pure werfen - http://code.google.com/p/pure-lang/ .
Mathematica basiert auch auf dem Umschreiben, obwohl es nicht so einfach ist, herauszufinden, was los ist, da es eher geschlossen ist.
quelle
APL, Forth und Versammlung.
Viel Spaß Holen Sie sich ein Lego Mindstorm-Roboterkit und CMUs RobotC und schreiben Sie einen Robotikcode. Dinge passieren, wenn Sie Code schreiben, der "schmutzig" werden und mit der realen Welt interagieren muss, die Sie unmöglich auf andere Weise lernen können. Ja, dieselbe Sprache, aber eine ganz andere Perspektive.
quelle