Ich habe viele CS-Lehrpläne und Lernvorschläge für neue Programmierer gesehen, die den angehenden Programmierer auffordern, einen Lisp-Interpreter zu studieren, der speziell in Lisp geschrieben ist. Alle diese Seiten sagen Dinge ähnlich wie „seine intellektuelle Offenbarung“, „es ist eine Erleuchtungserfahrung jeder ernsthafte Programmierer haben sollte“ oder „es zeigt Ihnen , Hardware / Software - Beziehungen“ und andere vage Aussagen, vor allem aus diesem Artikel entnommen aus dieses seriöse How-to .
Das allgemeine Gefühl meiner Frage ist, wie erreicht Lispel die oben genannten Ziele und warum Lispel? Warum nicht eine andere Sprache?
Ich frage dies, weil ich gerade mit dem Schreiben eines Schema-Interpreters im Schema fertig bin (entnommen aus SICP http://mitpress.mit.edu/sicp/ ) und jetzt schreibe ich einen Python-Interpreter im Schema und ich habe Mühe, diese legendäre Offenbarung zu haben das soll speziell von ersteren kommen. Ich suche nach bestimmten technischen Details zwischen den beiden Sprachen, die ich in ihren Schema-Interpreten verwenden kann, um zu verstehen, wie Programme funktionieren.
Genauer:
Warum wird das Studium eines Dolmetschers, der in der Sprache geschrieben ist, die er interpretiert, so betont? Ist es nur eine große mentale Übung, die Originalsprache und die gebaute Sprache gerade zu halten, oder gibt es spezifische Probleme, deren Lösungen nur in der Natur der Sprache zu finden sind? Ursprache?
Wie demonstrieren Lisp-Interpreten gute Architekturkonzepte für das zukünftige Softwaredesign?
Was würde ich vermissen, wenn ich diese Übung in einer anderen Sprache wie C ++ oder Java machen würde?
Was ist das am häufigsten verwendete Mitnehmer- oder "mentale Werkzeug" aus dieser Übung? **
** Wie wähle ich die Antwort , die ich tat , weil ich habe bemerkt , dass ich von dieser Übung mehr Geschick bei der Gestaltung Parsen Werkzeugen in meinem Kopf als jedes andere Werkzeug gewonnen haben , und ich möchte verschiedene Methoden finden , dass der Parsen besser für die Regelung kann arbeiten Interpreter als der Python-Interpreter.
Antworten:
Auf die Gefahr einer "Ich auch" Antwort, wenn Sie es versuchen, werden Sie sehen ...
Wenn Sie Computersprachen lernen, haben Sie wahrscheinlich den Eindruck, dass es mindestens zur Hälfte um das Parsen geht. Wenn Sie Lisp lernen, werden Sie feststellen, dass das Parsen der Oberflächensyntax nichts anderes ist als eine Annehmlichkeit für Leute (wie die meisten von uns), die viele irritierende einzelne Klammern nicht mögen.
Dann konnte man feststellen, dass für diese Bequemlichkeit ein hoher Preis gezahlt wurde. In Lisp ist es für ein Programm trivial, ein anderes Programm zu erstellen und auszuführen. In anderen Sprachen ist es eine fortgeschrittene Technik, wie die Multiplikation mit römischen Ziffern.
Natürlich würde fast jeder fragen: "Wer muss das tun?" Nun, Sie konnten sehr gut sehen, dass es eine ganze Reihe von Dingen eröffnet, von denen Sie noch nie bemerkt haben, dass Sie es vorher nicht konnten. Sie können es in anderen Sprachen tun, aber bei weitem nicht so einfach.
EINGEFÜGT, um Izkata Kommentar zu beantworten:
... das sind nur ein paar ...
Dann merkt man, dass einige Dinge, die heute als "modern" gelten, in Lisp seit 40 Jahren ein alter Hingucker sind. Wie funktionale Programmierung. Wie Müllabfuhr. Wie Verschlüsse.
Das heißt nicht, dass moderne Sprachen keine neuen guten Ideen wie OOP usw. haben. Wenn Sie jedoch Lisp lernen, wird dies Ihre Perspektive erweitern.
quelle
You can do it in other languages, but not nearly so easily.
- Mögen? (Die Frage für mich scheint zu sein, weil Aussagen wie diese oft gemacht werden, aber fast nie spezifischer werden)Die einfache Antwort auf Ihre Frage ist, Lisp zu probieren, vorzugsweise in Verbindung mit SICP . Dann wirst du erleuchtet.
Das gesagt...
Code ist Daten
Die meisten Sprachen unterscheiden zwischen Code und Daten. Lisp tut es nicht. Dies ermöglicht es beispielsweise, einen Lisp-Parser trivial in Lisp zu schreiben und den Lisp-Code innerhalb von Lisp zu manipulieren. Die beste Beschreibung dieser Erleuchtung, die ich gefunden habe, ist Die Natur von Lisp .
Dies gilt zum Teil, weil die Syntax für die Sprache so einfach ist. Es ermöglicht Dinge in Lisp (wie Metaprogrammierung), die in anderen Sprachen unpraktisch sind, weil die Syntax im Weg steht.
Lesen Sie weiter und
übertreffen Sie die Durchschnittswerte
quelle
Wenn Sie einen Dolmetscher studieren, erhalten Sie im Allgemeinen einen Einblick in dessen Sprache und Funktionen. Im Allgemeinen ist das Lernen von Code in einer Programmiersprache wie das Üben einer gesprochenen Sprache durch Zuhören und Lesen: Es macht Sie mit der Funktionsweise dieser Sprache, ihrer Verwendung und den gebräuchlichen "Redewendungen" vertraut. Insbesondere ist Lisp eine homoikonische Sprache, was bedeutet, dass die Syntax für Ausdrücke mit der Syntax für Daten identisch ist. Das Schreiben von Code in Lisp sieht furchtbar aus, als würden Sie eine Liste schreiben und umgekehrt. Das Interpretieren von Lisp-Code mit Lisp-Code ist daher so einfach wie das Durchlaufen von Listen mit
car
undcdr
.Überlegen Sie, wie der Interpreter sich selbst interpretieren würde - in vielen Implementierungen von Meta-Circular-Interpretern (bei denen sich eine homoikonische Sprache selbst interpretiert) kann er die Funktion nur "durchlaufen".
car
Nehmen Sie zum Implementieren beispielsweise einfachcar
das Argument of. Dies nimmt den Schwerpunkt von Datenspeichermechanismen und konzentriert sich auf Funktionalität.Dolmetscher können sehr kompliziert sein, was eine gute Architektur bei ihrer Gestaltung fördert. In diesem Sinne ist dieser stärker vom jeweiligen Dolmetscher abhängig.
Diese Sprachen sind nicht homoikonisch, daher profitieren sie nicht von der Anmut und Einfachheit eines Meta-Circular-Lisp-Interpreters. Das macht die Übung schwieriger und vielleicht auch seltener, aber ich würde nicht sagen, dass es weniger nützlich ist.
Ich bin mir nicht sicher, ob ich eine gute Antwort auf diese Frage habe. einfach, dass es hilft zu sehen, wie der Dolmetscher funktioniert und, was vielleicht noch wichtiger ist, daran herumzubasteln, um zu sehen, wie geringfügige Änderungen an der Sprache einfach implementiert werden können.
quelle
LISP selbst ist so strukturiert, dass das Parsen extrem einfach ist. Wenn Sie versuchen, einen Compiler zu schreiben, werden Sie feststellen, dass es viel einfacher ist, wenn alles in Ihrer Sprache ein Ausdruck ist und eine geringe Mehrdeutigkeit aufweist. LISP zwingt Klammern überall, um Mehrdeutigkeiten zu beseitigen, und enthält keine Aussagen, nur Ausdrücke.
Die Tatsache, dass LISP sehr einfach zu analysieren ist, ermutigt Benutzer, ihren eigenen Quellcode zu analysieren und Zaubertricks damit zu machen. Die Grenze zwischen Daten und Code verwischt sich und Sie können auf einfache Weise Dinge tun, die normalerweise viel Aufwand erfordern, z. B. Reflektion, dynamisches Umschreiben von Code, Plugins und Serialisierung.
Das ist der Kern davon. Die Übung soll Ihnen wahrscheinlich einen Einblick geben, was möglich ist, wenn der Code leicht von sich aus analysiert werden kann.
quelle
Ich bin mir nicht sicher, ob es wirklich wichtig für alle ist. Sie können ein erfolgreicher Entwickler sein, ohne zu wissen, wie ein Lisp-Interpreter funktioniert. Während des Studiums der Informatik sollten jedoch die Grundgedanken von Lisp erlernt werden.
Lisp-Interpreten sind für Lisp-Programmierer wichtig. Sie müssen verstehen, wie ein Interpreter ([und Compiler] 1 ) funktioniert, um vollständig zu verstehen, wie die Sprache verwendet wird.
Ein Lisp-Interpreter wird in der Informatik häufig als Werkzeug verwendet, um den Schülern einige Dinge beizubringen:
Verständnis einer kompakten und minimalen Sprachdefinition durch eine Implementierung: Alan Kay nannte es die Maxwell-Gleichungen der Software .
Verstehen der Programmierung auf Sprachniveau durch Ändern und Erweitern des Dolmetschers
Verständnis der Meta-Level-Programmierung und ihrer Auswirkungen auf das Design und die Verwendung einer Programmiersprache. Zum Beispiel zu verstehen, was "Zitieren" bedeutet und warum es notwendig ist
Verständnis der Interpretation der Programmiersprache Lisp und ihrer Verbindung zum Lambda-Kalkül
Als Lehrmittel ist ein Lisp-Dolmetscher hilfreich, weil er in kurzer Zeit erlernt und verstanden werden kann. Da nur wenige Schüler Lisp bereits kennen, sind die Schüler auf einem Niveau, wenn es darum geht, über Konzepte zu lernen.
quelle