Meistens sind in einer allgemeinen imperativen Sprache Semikolons als Anweisungsbegrenzer entweder erforderlich oder vollständig unzulässig (z. B. C und Python).
In einigen Sprachen, wie z. B. JavaScript, können Sie jedoch die Begrenzung Ihrer Anweisungen durch Semikolons zugunsten anderer Trennzeichen (z. B. Zeilenumbrüche) deaktivieren.
Welche Designentscheidungen stehen dahinter? Ich verstehe, dass Semikolons wichtig sind, wenn mehrere Anweisungen in dieselbe Zeile geschrieben werden. Gibt es jedoch einen anderen Grund, sie verbindlich zu machen (außer nach C)?
programming-languages
syntax
Aber Kled
quelle
quelle
I understand that semicolons are essential when writing multiple statements on the same line
- Kommt auf die Sprache an. Mein Favorit hat überhaupt keine solchen Begrenzer, die nächste Anweisung beginnt, wenn alle Funktionsargumente aufgebraucht sind.}
oder am Ende der Datei abzuleiten).Antworten:
Wenn Sie sie obligatorisch machen (oder sie vollständig verbieten), wird die Anzahl der Eckfälle verringert, eine potenzielle Quelle für obskure Fehler beseitigt und das Compiler- / Interpreter-Design vereinfacht.
Die Sprachdesigner, die sich dafür entschieden haben, sie optional zu machen, haben sich dafür entschieden, mit der Mehrdeutigkeit zu leben, um eine größere syntaktische Flexibilität zu erreichen.
quelle
JavaScript hat uns gezeigt, dass dies eine sehr schlechte Idee ist. Zum Beispiel:
In C gibt dies den Wert 0 zurück. In JavaScript wird dies zurückgegeben,
undefined
weil nach der return-Anweisung ein Semikolon eingefügt wird und es nicht sofort offensichtlich ist, warum Ihr Code beschädigt wird, es sei denn, Sie kennen die Details der automatischen Semikolon-Einfügung.quelle
return
ist einer von nur wenigen Fällen, in denen JavaScript ein Semikolon einfügt, selbst wenn das Programm ohne dieses Semikolon gültig wäre. (Aber natürlich untergräbt dies den Standpunkt von Mason Wheeler. Das Problem ist nicht, dass die Semikolons optional sind, sondern dass die Regeln inkonsistent sind.)Es vereinfacht Ihre Grammatik und Ihren Parser etwas, sodass die Semikolons obligatorisch sind. Im Wesentlichen ermöglicht es dem Lexer, alle Leerzeichen einschließlich Zeilenumbrüchen zu löschen, und der Parser muss sich überhaupt nicht darum kümmern.
Wenn Sie dem Parser jedoch ohnehin etwas über Leerzeichen erzählen möchten, ist es nicht so schwer, die Semikolons optional zu machen. Sie können sie oft einfach mit einem
whitespace
Token zusammenfassen und Ihr Parser kann damit gut umgehen.Versuchen Sie beispielsweise, die Semikolons in die folgende Reihe von C-Anweisungen einzufügen.
Obwohl es einige seltsame Dinge gibt, die Sie nicht mehr tun können, wie
while(1);
zum Beispiel zum größten Teil, ist es mit modernen Parsing-Techniken relativ einfach zu bestimmen, wo die Anweisungen ohne ein bestimmtes Trennzeichen enden. Selbst wenn Sie immer noch das seltsame Zeug zulassen möchten, ist es nicht so schwer, einnewline_or_semicolon
Nicht-Terminal zu erstellen.quelle
Semikolons sind in einer Grammatik aus zwei Gründen nützlich. Erstens können Sie lange Anweisungen in mehrere Zeilen aufteilen, ohne gottesfürchtige Fortsetzungszeichen zu haben (ich spreche von Ihnen, Fortran und Basic). Zweitens kann der Parser das Parsen "aufgeben", wenn die Syntax aufgrund eines Tippfehlers wirklich verworren ist. Diebstahl von Karl Bielefeldts Beispiel,
Stellen Sie sich vor, Sie haben einen zusätzlichen offenen Paren eingegeben:
Wo ist nun der Fehler? Wenn Sie die Semikolons hatten, ist es für den Parser einfacher, beim ersten Semikolon aufzugeben. Es könnte sogar nach dem Semikolon weiter analysiert werden, wenn es wollte.
Jetzt ist es für den Parser einfacher, einen Fehler zu melden und die Zeile / Spalte, in der er aufgetreten ist, leichter zu finden.
quelle
Semikolons sind nicht immer alles oder nichts, wie Sie es in Ihrer Frage erwähnen. Zum Beispiel Lua Grammatik s‘ist sorgfältig freie Form sein (alle Leerzeichen, einschließlich Zeilenumbrüche kann ignoriert werden) , sondern auch , ohne zu verwenden , um alle Semikolons gestaltet. Die folgenden Programme sind beispielsweise gleichwertig:
quelle
Abgesehen von Design und Konstruktion glaube ich, dass viele Programmierer aus unterschiedlichen Bereichen stammen und einige gelernt haben, das Semikolon zu verwenden, andere nicht. Viele neuere Sprachen, die auftauchen, benötigen kein Semikolon, lassen es aber dennoch zu. Ich denke, es könnte nur eine Möglichkeit sein, mehr Programmierer dazu zu bringen, das Codieren in diesen neuen Sprachen zu lernen, ohne ihre Gewohnheiten von Anfang an aufgeben zu müssen.
quelle