Ich habe nach einer praktischen Programmiersprache gesucht , die keine reservierten Schlüsselwörter enthält, aber ich hatte kein Glück, eine zu finden.
Ich arbeite an einer Programmiersprache für meine eigene Erbauung und Unterhaltung, und ich musste noch keine Schlüsselwörter eingeben. Dies führte mich zu meiner Suche und der Frage:
Ich sehe keine Bequemlichkeit für den Compiler-Schreiber als wichtig für den Endbenutzer der Sprache. Computer sind heutzutage leistungsfähig genug, um Bedeutungen aus dem Kontext ableiten zu können. Nur ein Autor muss beim Schreiben eines Romans Substantive, Verben usw. benennen. Warum sollte ein Programmierer Funktionen und Variablen mit function x() {}
oder set x = 1
oder var x = 1
usw. benennen müssen? Wann kann ich aus dem Kontext der Anweisungen schließen, dass es sich um eine Funktionsdeklaration oder einen Aufruf handelt oder dass eine Bezeichnung eine Zuweisung zu einem Wert oder eine Referenz zu diesem Bezeichnungswert ist?
Hier ist ein konkretes Beispiel dafür, was mein aktueller Parser tut. Es sind keine reservierten Schlüsselwörter erforderlich, um allgemeine Dinge zu unterstützen, die normalerweise ein paar Geräusche verursachen wie func
oder function
oder dec
oder was nicht.
Funktionserklärung
sum3(a,b,c) -> a + b + c.
Funktionsaufruf
x = sum3(1,2,3).
Anonyme Funktion mit dem Namen x
x = (a,b,c) -> a + b + c.
y = x(1,2,3).
Ich möchte wissen, warum Keywords für eine erfolgreiche Programmiersprache so wichtig sind.
Antworten:
MUMPS ist sehr erfolgreich, wird häufig in Versicherungen und im Gesundheitswesen eingesetzt und hat keine reservierten Worte. Ich würde sagen, sie helfen beim Schreiben von klarerem Code, aber sie sind nicht unbedingt erforderlich. APL ist ein weiteres Beispiel. APL wird unter anderem in der Nuklearindustrie für einmalige Skripte eingesetzt. J , ein Mitglied der APL-Familie, fehlen auch Schlüsselwörter.
Mithilfe von Schlüsselwörtern können Compiler-Autoren das Parsen einfacher implementieren. APL ist bekanntermaßen rechtsassoziativ. Sie tragen auch dazu bei, Konventionen zu stärken und die Lesbarkeit zu verbessern. APL ist nicht dafür bekannt, für die meisten sehr gut lesbar zu sein.
quelle
Eine bekannte Sprache ohne Schlüsselwörter ist Lisp. Den Stichwörtern am nächsten kommen sogenannte Sonderformen - deren Anzahl zwischen den Dialekten variieren kann -, die vom Dolmetscher besonders behandelt werden. Abgesehen davon sind sie in Bezug auf ihre Verwendung nicht von normalen Funktionen zu unterscheiden, mit der Ausnahme, dass sie nicht neu definiert werden können (zumindest in Lisps, mit dem ich vertraut bin).
Dies führt zu einer einfachen (aber parenlastigen) Syntax und ist eines der Dinge, die es Lisp ermöglichten, ein so mächtiges Makrosystem zu haben. Auf der anderen Seite wird oft gesagt, dass Lisp schwer zu lesen ist. APL und MUMPS, noch mehr, ich habe beide als auf halbem Weg zu Brainf * ck beschrieben gesehen. Stichwörter helfen in dieser Abteilung und erleichtern das Lesen von Code auch uns Menschen.
Ich würde also nicht sagen, dass Schlüsselwörter für eine erfolgreiche Sprache erforderlich sind, aber sie tragen sicher dazu bei, dass eine Sprache erfolgreich wird.
quelle
if
wäre in C ein gültiger Bezeichner, wenn er nicht als speziell definiert wäre (ein Schlüsselwort). Dies bedeutet, dass diesif
kein Bezeichner ist undif = 10
einen Syntaxfehler verursacht. Wenn ich mich nicht täusche, Lisp-Minimal Syntax unterscheidet nichtdefun
ausf
,x
,y
und+
in(defun f (x y) (+ x y))
.if
ist ein gültiger Variablenname in Common Lisp (und anderen Lisp-2s)(defparameter if nil)
wird nichts kaputt machen , und es kann in Formen wie verwendet werden(unless if (setf if t))
(defun if ...)
wird jedoch fehlschlagen. Notizen aus Kommentaren berücksichtigt und die Antwort bearbeitet. Ich kann zustimmen, dass Sonderformen keine Schlüsselwörter auf der gleichen Ebene wie in C sind, aber dennoch das, was Lisp am nächsten kommt.TCL hat keine Schlüsselwörter und in der Tat nur 12 Syntaxregeln. Es ist zwar nicht mehr so populär wie früher, hat aber eine Nische mit Expect und ist in ECAD und Router eingebettet, so dass es meiner Meinung nach mit Sicherheit als praktisch gilt.
Ich denke auch, dass es zeigen könnte, warum viele Sprachen diesen Weg nicht gehen. Ja, es ist durchaus möglich, einen TCL-Parser zu schreiben (wahrscheinlich einfacher als viele andere Sprachen). Sie können jedoch keine sehr nützliche BNF-Grammatik für die Sprache schreiben, und viele Menschen scheinen Probleme mit dem Erlernen der Sprache zu haben. Ich vermute, dass dies zumindest teilweise an fehlenden Keywords liegt.
quelle
Heißt das, Sie möchten eine Grammatik, die nicht kontextfrei ist? Viel Glück.
Es geht nicht darum, mächtig zu sein oder nicht. Es gibt ewige, unveränderliche Regeln für Sprachen - mathematische. Dies und die Tatsache, dass eine Programmiersprache syntaktisch einfach sein sollte, werden CFGs für einige Jahrzehnte zur Regel werden.
Übrigens schreiben Sie in Haskell-ähnlicher Syntax einfach so etwas wie
eine Funktion definieren. Beachten Sie jedoch, dass das "Schlüsselwort" in diesem Fall das "=" ist. Wenn Sie es verpassen, werden im Parser schreckliche Dinge passieren.
Aber hier stimme ich Ihnen zu. Ich finde das viel intuitiver als alle def-, dcl-, fun-, fn-, function- oder what-not-Schlüsselwörter, die Funktionen in anderen Sprachen einführen.
Diese Grammatik kann jedoch in einfachem altem LALR (1) geschrieben werden, hier wird keine Bedeutung "aus dem Kontext abgeleitet".
quelle
{ int x = 0; x = "HELLO"; }
einen Analysebaum erzeugen, aber wenn der Compiler in der zweiten Zuweisung nach x sucht, sieht er, dass er als int deklariert wurde und gibt einen Typfehler aus. Das Programm wird also auch dann abgelehnt, wenn seine CF-Struktur korrekt ist.Soweit ich weiß, ist Smalltalk die Sprache mit den wenigsten Stichwörtern (wenn ich Sprachen wie Brainfuck nicht zähle). Smalltalk Schlüsselwörter sind
true
,false
,nil
,self
,super
undthisContext
.Ich habe eine Sprache entworfen, inspiriert von Smalltalk, die keine Schlüsselwörter hatte. Aber nach einiger Zeit habe ich ein paar Keywords hinzugefügt, hauptsächlich für syntaktischen Zucker.
Meiner Meinung nach ist eine Sprache ohne Schlüsselwörter möglich, aber nicht sehr praktisch, und das ist der Grund, warum alle gängigen Sprachen Schlüsselwörter haben.
quelle
true
,false
undnil
als Methoden auf diesem impliziten Empfänger definiert werden könnte, und angesichts den Reflexionsfähigkeiten, aber auch die anderen drei wahrscheinlich.true
,false
undnil
bekannte Werte von der Umgebung geliefert werden , undself
,super
undthisContext
sind Variablen , die Sie nicht festlegen können , aber deren Werte als Ergebnis der Ausführung ändern.Sie scheinen unter der falschen Annahme zu arbeiten, dass Schlüsselwörter dazu dienen, dem Compiler die Arbeit zu erleichtern. Sie erleichtern dem Compiler zwar die Arbeit, haben jedoch einen weitaus wichtigeren Vorteil: Sie erleichtern dem Codeleser die Arbeit .
Ja, Sie könnten eine Reihe von Kontexten betrachten und herausfinden, dass Sie eine Funktionsdeklaration oder eine Variablendeklaration betrachten, aber je nach Kontext und Komplexität des betroffenen Codes kann das lange dauern . Oder Sie haben ein praktisches Schlüsselwort wie function oder var und wissen sofort, was Sie suchen.
Ja, sie machen das Schreiben des Codes komplizierter , aber wenn man bedenkt, dass Programme viel mehr Zeit für die Wartung als für die Produktion aufwenden und dass ihr Code viel mehr gelesen, debuggt und gewartet wird, als er erstellt wurde, und versucht, Ihre Sprache so zu gestalten Es ist ein klassischer Fall von schädlicher vorzeitiger Optimierung, das Schreiben einfacher zu machen als das Lesen.
Verachten Sie auch keine Konzepte, die die Arbeit des Compilers erleichtern. Je einfacher das Parsen ist, desto schneller wird der Code kompiliert, was bedeutet, dass die Zyklen zum Bearbeiten, Erstellen und Debuggen schneller werden, was bedeutet, dass Ihre Produktivität steigt.
Wenn Sie über eine große, komplexe Codebasis verfügen, kann dies zu einem nicht unerheblichen Produktivitätsunterschied führen. Zum Beispiel haben wir dort, wo ich arbeite, ein Programm im Einsatz, das ungefähr 4 Millionen Zeilen Delphi enthält. Wir haben ein weiteres Modul, das ungefähr 300.000 Zeilen C ++ enthält. Das Kompilieren dauert für beide ungefähr gleich lange. (Ungefähr 3 Minuten.) Wenn wir 4 Millionen Zeilen C ++ hätten, könnte das Erstellen eine Stunde dauern!
quelle
Es gibt einige seltene Beispiele.
APL verwendet nur Symbole - aber viele davon! Sie benötigen eine spezielle Tastatur, um die Sprache zu verwenden.
Siehe diesen Wikipedia-Artikel
CORAL 66 - hatte Schlüsselwörter, erkannte sie jedoch nur, wenn sie in einfachen Anführungszeichen angegeben wurden.
PL / 1 hatte auch Schlüsselwörter - aber Sie können sie auch als Variablen- oder Prozedurnamen verwenden.
Alles in allem ist Ihre Frage ein bisschen wie die Frage "Warum haben gesprochene Sprachen Wörter?".
quelle
Der Hauptgrund ist, dass es sowohl für Menschen als auch für Computer einfacher ist, zu analysieren. Die Disambiguierung einer komplexen Sprache ohne Schlüsselwörter würde viele Symbole als Syntax erfordern und wäre massiv und unnötig verwirrend. Es ist viel einfacher zu lesen
function
als$!{}
. Und der Kontext löst nicht alle Mehrdeutigkeiten auf.quelle