Welche nicht theoretische, praktische Programmiersprache hat keine reservierten Schlüsselwörter?

22

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 = 1oder var x = 1usw. 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 funcoder functionoder decoder 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.


quelle
8
Forth ist ziemlich praktisch und hat keine Schlüsselwörter.
SK-logic
4
@JamesAnderson, nein, sie sind nur Wörter, genau wie alle anderen Wörter. Keine besondere Bedeutung.
SK-logic
7
Zählen Operatoren und Interpunktion als "Schlüsselwort"? Wenn ja, ist möglicherweise keine Sprache vorhanden, da keine Syntax definiert werden kann.
Emilio Garavaglia
2
@ SK-Logik: normalerweise. Aber was sind "Identifikatoren", wenn Sie noch kein Token erstellen? Da ein Token "welcher erkennbare Stich" ist, unterscheiden sich "int", "myvalue" und "+" nicht, bevor eine Syntaxregel angegeben wurde. Wenn "+" nicht als Operator definiert ist, kann es sich nur um einen Namen für eine beliebige andere Unicode-Einzelzeichenfolge handeln. Operatoren sind aus rein syntaktischer Sicht nichts anderes als "Schlüsselwörter mit einem Zeichen".
Emilio Garavaglia
2
Was ist in diesem Zusammenhang ein Schlüsselwort? Ist es eine Kennung, die für den Compiler eine besondere Bedeutung hat? Ist es eine Kennung, die der Programmierer nicht als Variable verwenden sollte oder so? Zählt es als stichwortlos, wenn Stichwörter speziell gekennzeichnet werden müssen? (Vor langer Zeit habe ich ein ALGOL-System gesehen, in dem Schlüsselwörter als Schlüsselwörter angegeben werden mussten.)
David Thornley

Antworten:

12

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.

Weltingenieur
quelle
2
+1 für "Mithilfe von Schlüsselwörtern können Compiler-Autoren das Parsen einfacher implementieren". Ich denke, das ist so ziemlich alles. Schlüsselwörter wurden erfunden, um die Menge an Kontext zu reduzieren, die ein Parser im Speicher behalten muss, als der gesamte Compiler und sein Arbeitssatz in ein Dutzend KB RAM passen mussten.
Jörg W Mittag
2
Es ist einfacher, einen Parser für APL zu schreiben als fast jede andere Sprache! Angenommen, die erste Implementierung eines APL-Interpreters erfolgte unter Verwendung von Transistoren und Dioden.
James Anderson
2
Ich denke, der Hauptgrund für Keywords besteht darin, es für Menschen einfacher zu machen, die Sprache einfacher zu analysieren. Computer wären glücklicher, wenn die Sprache genau wie ihr Maschinencode ausschließlich aus Zahlen und Bitmustern bestünde.
James Anderson
6
Was APL an Schlüsselwörtern fehlt, wird durch die Forderung nach einer eigenen Schriftart mehr als wettgemacht.
Blrfl
@Blrfl Das ist der Punkt von J, K und Q. Sie sind alle zu dem einen oder anderen Grad, APL in ASCII.
Welt Ingenieur
9

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.

scrwtp
quelle
1
IIRC Lisp hat KEINE Schlüsselwörter. Die Sonderformen müssen vom Compiler speziell behandelt werden, ihre Namen sind jedoch reguläre Symbole.
Jan Hudec
2
Schlüsselwörter sind eine Eigenschaft der Syntax, die Lisp auch nicht hat. Ich denke nicht, dass es überhaupt Sinn macht, in Lisp über Schlüsselwörter zu sprechen.
Jörg W Mittag
2
Ich stimme Jörg zu. Ich denke, man kann über Schlüsselwörter sprechen, wenn eine Sprache Token hat, die explizit als speziell definiert werden müssen, um von Token mit einer ähnlichen Struktur unterschieden zu werden. Unterschiedliche Token führen zu unterschiedlichen Syntaxbäumen. Zum Beispiel ifwäre in C ein gültiger Bezeichner, wenn er nicht als speziell definiert wäre (ein Schlüsselwort). Dies bedeutet, dass dies ifkein Bezeichner ist und if = 10einen Syntaxfehler verursacht. Wenn ich mich nicht täusche, Lisp-Minimal Syntax unterscheidet nicht defunaus f, x, yund +in (defun f (x y) (+ x y)).
Giorgio
@Giorgio insbesondere 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))
tobyodavies
Aus dem gleichen Grund (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.
Scrwtp
8

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.

jk.
quelle
2
Tcl ist Lisp in dieser Hinsicht sehr ähnlich, außer dass es anstelle von "Alles ist eine Liste" "Alles ist eine Zeichenkette" gibt. Eine Liste ist nur eine Zeichenfolge mit Leerzeichen, und ein Prozeduraufruf ist nur eine Liste, deren erstes Element als Name einer Prozedur und der Rest als Argumente interpretiert wird. Das ist im Wesentlichen ein Lisp S-Ausdruck.
Jörg W Mittag
ja, beide benutzen die polnische Notation und sind homo-ikonisch, haben also eine ziemlich ähnliche Semantik
jk.
5

Computer sind heutzutage leistungsfähig genug, um Bedeutungen aus dem Kontext ableiten zu können.

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

f x y = (x+1)*(y-1)

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".

Ingo
quelle
1
+1 für die Adressierung dieser Aussage (Computer sind heutzutage mächtig genug, um Bedeutungen aus dem Kontext ableiten zu können). Ich denke, der Grund, warum die Grammatiken von CFG bevorzugt werden, ist, dass sie die induktive Definition der Programmstruktur ermöglichen. Ich verstehe nicht, warum man das auch in 100 Jahren noch ändern möchte, vielleicht fehlt mir einfach die Vorstellungskraft?
Giorgio
2
CFGs sind ziemlich tot und seit Jahrzehnten tot. JavaScript in HTML, sogar Strings im C-Format in C, sogar verschachtelte Kommentare in OCaml - all diese Dinge sind nicht kontextfrei. Und warum sollten Sie sich jetzt in einem Zeitalter von PEG und GLR auf einen so willkürlich gewählten Formalismus beschränken?
SK-logic
1
@Ingo, ja, du hast recht, eine falsche Wahl eines Beispiels. Ich meinte gemischte und erweiterbare (dh höherwertige) Grammatiken, die nicht CFG sind.
SK-logic
2
@ SK-logic: Ich weiß nicht, woher du die Information hast, dass CFGs ziemlich tot sind. Ich habe mit einem ehemaligen Kollegen von mir gesprochen, der seit 20 Jahren Compilerbau lehrt, und CFGs scheinen alles andere als tot zu sein.
Giorgio
1
@Ingo: Soweit ich mich erinnere, werden die Nicht-CF-Aspekte anschließend behandelt, indem der Analysebaum semantisch analysiert wird. Sollte zum Beispiel { 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.
Giorgio
4

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, superund thisContext.

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.

Del-Boy
quelle
Wenn Smalltalk hatte Unterstützung für Nachricht mit einem impliziten Empfänger sendet, dann zumindest true, falseund nilals Methoden auf diesem impliziten Empfänger definiert werden könnte, und angesichts den Reflexionsfähigkeiten, aber auch die anderen drei wahrscheinlich.
Jörg W Mittag
1
Das sind keine Schlüsselwörter, sondern Pseudovariablen. „Pseudo“ , weil true, falseund nilbekannte Werte von der Umgebung geliefert werden , und self, superund thisContextsind Variablen , die Sie nicht festlegen können , aber deren Werte als Ergebnis der Ausführung ändern.
Frank Shearar
3

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!

Mason Wheeler
quelle
Alles hervorragende Punkte. +1
Wenn jedes Substantiv, Verb, Adverb und Adjektiv in einem Roman als solches gekennzeichnet wäre, würde es schwieriger, nicht einfacher zu lesen!
@JarrodRoberson: Sicher, aber Code ist kein Roman. Natürliche Sprachen unterscheiden sich stark von Programmiersprachen. Natürliche Sprache wird intuitiv verstanden, während eine Programmiersprache formale Semantik hat. Die Techniken, die zum Lesen und Verstehen der Bedeutung verwendet werden, sind sehr unterschiedlich, und es ist ein Fehler, zu versuchen, die beiden gleichzusetzen, wie Sie es tun.
Mason Wheeler
Ich sagte Compiler-Writer, der sich vom Compiler unterscheidet . Compiler werden auf schnellerer Hardware schneller, Compiler-Autoren sind Menschen, wir halten uns nicht an Moores Gesetz!
die Codebasen ich mit zur Arbeit sind in der Regel sind um Größenordnungen länger als Romane in der Länge, die meisten sind> 1.000.000 Zeilen von Code, der die meisten der längsten Romane sind <2.000.000 Wörter ! Und wie Romane, die von Menschen gelesen werden, wird tatsächlich mehr Zeit damit verbracht, Code zu lesen als ihn zu schreiben! Bei einer Codebasis, die älter als 10 Jahre und über 1.000.000 Zeilen ist, ist die Anzahl der Lesevorgänge von Entwicklern über 10 Jahre die Zeit, die für die Erstellung erforderlich war, um ein Vielfaches höher.!
2

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?".

James Anderson
quelle
Nur um das hinzuzufügen, wenn Sie das Aussehen von APL mögen, aber keine neue Tastatur kaufen möchten, dann ist J genau das Richtige.
AakashM
0

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 functionals $!{}. Und der Kontext löst nicht alle Mehrdeutigkeiten auf.

DeadMG
quelle
1
Ich denke, das Schlüsselwort in Ihrer Antwort ist komplex . Eine ausreichend gestaltete Sprache sollte einfach und nicht komplex sein .
1
@Jarrod Roberson: Leonardo da Vinci: "Einfachheit ist die ultimative Raffinesse", Antoine de Saint Exupéry: "Es scheint, dass Perfektion nicht erreicht wird, wenn nichts mehr hinzuzufügen ist, sondern wenn nichts mehr wegzunehmen ist."
Giorgio
1
@Jarrod: Alle aussagekräftigen Computersprachen sind komplex.
DeadMG
1
@DeadMG: Schema ist sehr einfach und gleichzeitig sehr aussagekräftig. Leider fehlt mir meines Wissens eine standardisierte Bibliothek.
Giorgio
Erlang ist sehr ausdrucksstark und syntaktisch nicht komplex. Ich denke, dass alle funktionalen Sprachen mit weniger reservierten Schlüsselwörtern aussagekräftiger werden.