Warum benötigt Swift keine Semikolons? [geschlossen]

20

Normalerweise codiere ich entweder in c # oder in Objective-C und habe es mir kürzlich zur Aufgabe gemacht, die neue Programmiersprache von Apple - Swift - zu lernen.

Das Erste, was mir aufgefallen ist, ist, dass Sie keine Semikolons hinzufügen müssen, um eine Zeile in Swift zu beenden, aber wenn Sie dies tun - zumindest nach dem, was ich getestet habe -, wird der Compiler nicht beeinträchtigt.

Wenn ich schreibe:

int someNumber = 0;

In Objective-C teilt das Semikolon dem Programm mit, dass die Zeile abgelaufen ist und nicht bis zur nächsten Zeile durchgefallen werden soll.

Mit Swift kann ich eine Variable mit deklarieren

var someNumber:Int = 5

und kein Semikolon hinzufügen und das System weiß, dass dies das Ende der Zeile ist.

Was erlaubt es einigen Sprachen, dies zu tun und anderen nicht? Warum nicht ein einheitliches System zum Hinzufügen des Semikolons am Ende beibehalten?

Memj
quelle
Nicht jeder kommt aus einer anderen Sprache. Woher wissen sie also, dass sie nicht einheitlich sind? Wird Apple mit Swift nicht mehr neue Programmierer anlocken, indem es die Objective-C-Teile beseitigt, die viele Leute nicht mögen?
JeffO
2
Viele Obj-C-Tierärzte sind mit Swift unzufrieden und bevorzugen Obj-C. Dies ist in den Apple-Foren nachzulesen. Swift ist erst 2014 herausgekommen und wenn alle paar Monate FULL von Bugs und Änderungen an der Sprache vorgenommen werden, kommt Swift2.0 in diesem Herbst heraus. Swift basiert auf Obj-C, zielt jedoch darauf ab, das Erlernen der Codierung mit einfacherem Englisch zu vereinfachen.
Memj
Alte Compiler-Implementierer waren nur faul und / oder mussten effizienter mit einfacherem Parsen sein. Dafür besteht keine Notwendigkeit mehr. Dies ist das Gleiche wie bei der lokalen Typinferenz. Sie haben es nicht nur, wenn Ihr Compiler-Writer faul ist und sich nicht um Entwicklererfahrung kümmert.
Ebuall

Antworten:

18

Was erlaubt es einigen Sprachen, dies zu tun und anderen nicht? Warum nicht ein einheitliches System zum Hinzufügen des Semikolons am Ende beibehalten?

Robert gab eine gute Antwort in Bezug auf Swift. Ich werde versuchen, ein bisschen mehr über das Parsen im Allgemeinen und warum man Semikolons verwendet oder nicht, hinzuzufügen.

Wenn Sie das Programm kompilieren, müssen Sie mehrere Schritte ausführen, bevor Ihre Quelldatei in ausführbaren Code umgewandelt wird. Einer der ersten Schritte ist das Lesen und Parsen . Während der Syntaxanalyse wird Ihr Code aus einer Folge von Zeichen in eine strukturierte Darstellung umgewandelt, die der Grammatik der Sprache entspricht. Dazu ist es notwendig, dass die Elemente, aus denen sich Ihr Code zusammensetzt (Variablen, Konstanten, Deklarationen usw.), irgendwie identifiziert und getrennt werden. Wenn Sie eine Erklärung abgeben wie:

int someNumber = 0;

Es ist nur eine Folge von Zeichen, die irgendwie auf das Konzept "ein Ding namens someNumberTyp erstellen intund ihm zuweisen 0" umgestellt werden müssen .

Dies erfordert die Identifizierung, wo genau die Anweisung beginnt und endet. Stellen Sie sich vor, Sie hätten folgendes:

int someNumber = 0;
int otherNumber = 1;

Sie müssen wissen, dass dies zwei verschiedene Erklärungen sind. Die ;in C-ähnlichen Sprachen wird dafür verwendet, so dass der Parser die Zeichen liest, bis er eine findet, und versucht zu verstehen, was gerade als einzelne Anweisung gelesen wurde. Dies erlaubt, wie Robert sagte, mehrere Aussagen in derselben Zeile zu haben, wie:

int someNumber = 0; int otherNumber = 1;

Was genau den gleichen Effekt hat, als würde man sie in zwei Zeilen schreiben.

In anderen Sprachen wie Python müssen Sie jede Anweisung in eine andere Zeile setzen.

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

Sie müssen also kein hinzufügen ;, da die Sprache selbst Sie daran hindert, Anweisungen in derselben Zeile hinzuzufügen!

Wieder andere Sprachen, wie LISP oder Scheme , haben eine ganz andere Art, Anweisungen zu gruppieren (ok, sie sind keine wirklichen Anweisungen, aber lassen Sie uns das vorerst ignorieren). Sie haben also nur Klammern für alles:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

Auch hier müssen Sie nicht das , ;nur weil man die gleichen Symbole verwenden ( ), () für Dinge , die in anderen Sprachen sind {, }, :etc. Jemand, der Sie kennt nur Lisp Syntax vielleicht fragen: Warum brauchen Sie ;Aussagen am Ende Ihrer ?

Nur um ein fremdes Beispiel hinzuzufügen: OCaml hat nicht nur ein Semikolon am Ende der Anweisungen ... es hat zwei!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

Warum? Ich weiß es nicht. :)

Unterschiedliche Sprachen werden mit unterschiedlichen Zwecken und unterschiedlichen Philosophien entworfen. Wenn alle Sprachen dieselbe Syntax und dieselben Konventionen hätten, könnten Sie wahrscheinlich nur dieselben Dinge auf dieselbe Weise tun.

Sebastian
quelle
4
Guter Schlusssatz.
Thomas Eding
Schöne Beispiele, aber Sie haben die Frage nicht beantwortet.
Robo Robok
Zusätzlicher Datenpunkt: Einige Sprachen verwenden einen umgekehrten Ansatz zur C-Stil-Familie: Beispielsweise verwendet HyperTalk Zeilenumbrüche als hartes Ende einer Zeile (anstelle von Semikolons) und erfordert Escape-Zeilenumbrüche, wenn Sie eine Anweisung fortsetzen möchten über mehrere Zeilen. Komischerweise funktioniert Cs eigener Präprozessor auch so.
uliwitness
11

Zeilenumbrüche werden anstelle von Semikolons verwendet, um das Ende einer Anweisung abzugrenzen.

Im Sprachführer: Die Grundlagen heißt es:

Im Gegensatz zu vielen anderen Sprachen müssen Sie in Swift nach jeder Anweisung in Ihrem Code kein Semikolon (;) schreiben, obwohl Sie dies auf Wunsch auch tun können. Semikolons sind jedoch erforderlich, wenn Sie mehrere separate Anweisungen in eine einzelne Zeile schreiben möchten.

Warum? Denn so wollten es die Sprachdesigner machen.

Der zweite Satz oben gibt an, warum Sie keine Semikolons benötigen. Die meisten Aussagen sind einzeilig. Beachten Sie dieses Beispiel für die Blasensortierung. Die Kombination aus einzeiligen Anweisungen und keinen Semikolons sorgt für eine sehr saubere Syntax, die VB-ähnlich, aber weniger ausführlich ist:

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

Da Anweisungen in Swift normalerweise mit einem Zeilenumbruch enden, werden Semikolons weniger benötigt, um das Ende einer Anweisung zu markieren. Andere Sprachen, die Semikolons verwenden, funktionieren nicht so. Sie können mehrzeilige Anweisungen frei schreiben. Der Compiler weiß jedoch nur, dass die Anweisung beendet wurde, wenn Sie das Semikolon am Ende der Anweisung einfügen.

Wenn Anweisungen nicht mit einem Zeilenumbruch enden, müssen Sie den Zeilenumbruch an eine Stelle setzen, die der Swift-Compiler als Fortsetzung der vorherigen Zeile erkennen kann:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")
Robert Harvey
quelle
2
Die letzte Aussage ist falsch, es gibt keinen bestimmten Ort für Zeilenumbrüche. Es ist gut, die Codezeilen eingerückt und ausgerichtet zu lassen, um die Lesbarkeit zu verbessern.
Eneko Alonso
Unterhaltsame Tatsache: Dies wirkt sich unmittelbar auf die Fehlerberichterstattung aus. Viele C-Compiler (besonders Clang) verwenden Semikolons, um das Ende einer Anweisung mit einem Syntaxfehler zu finden, und können diese Informationen verwenden, um z. B. fehlende schließende Klammern näher an der tatsächlichen Position zu melden. Wenn in Swift Semikolons fehlen und ein Fehler auftritt, wird die folgende Zeile häufig in die fehlerhafte Vorgängerzeile eingeteilt, was zu sehr seltsamen Fehlermeldungen führt.
uliwitness