it-swarm.com.de

Warum benötigt Swift keine Semikolons?

Normalerweise codiere ich entweder in c # oder in Objective-C und habe es mir kürzlich zur Aufgabe gemacht, Apples neue Programmiersprache 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 Compiler.

Wenn ich schreibe:

int someNumber = 0;

in Objective-C teilt das Semikolon dem Programm mit, dass die Zeile beendet ist und nicht in die nächste Zeile fallen 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 beibehalten, bei dem das Semikolon am Ende hinzugefügt wird?

20
Memj

Was erlaubt es einigen Sprachen, dies zu tun und anderen nicht? Warum nicht ein einheitliches System beibehalten, bei dem das Semikolon am Ende hinzugefügt wird?

Robert gab eine gute Antwort in Bezug auf Swift. Ich werde versuchen, etwas mehr über das Parsen im Allgemeinen und warum Semikolons verwendet werden sollen oder nicht.

Wenn Sie das Programm kompilieren, gibt es mehrere Schritte, bevor Ihre Quelldatei in ausführbaren Code umgewandelt wird. Einer der ersten ist Lesen und Parsen . Während des Parsens wird Ihr Code von einer Zeichenfolge in eine strukturierte Darstellung gemäß Grammatik der Sprache umgewandelt. Dazu ist es notwendig, dass die Elemente, aus denen Ihr Code besteht (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 "Erstellen Sie ein 'Ding' namens someNumber vom Typ int und weisen Sie 0 Dazu ".

Dazu muss ermittelt werden, 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. Dafür wird ; In C-ähnlichen Sprachen verwendet, sodass der Parser die Zeichen liest, bis er eines findet, und versucht, zu verstehen, was gerade als einzelne Anweisung gelesen wurde. Dies ermöglicht, wie Robert sagte, mehrere Aussagen in derselben Zeile zu haben, wie:

int someNumber = 0; int otherNumber = 1;

Das hat genau den gleichen Effekt wie das Schreiben in zwei Zeilen.

In anderen Sprachen wie Python wird erwartet, dass 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'

Es ist also nicht erforderlich, einen ; Hinzuzufü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 nicht wirklich 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 benötigen Sie den ; Nicht, nur weil Sie dieselben Symbole (), () Für Dinge verwenden, die in anderen Sprachen { Sind. }, : Usw. Jemand, der nur die LISP-Syntax kennt, könnte Sie fragen: Warum brauchen Sie ; Am Ende Ihrer Anweisungen?

Um nur ein fremdes Beispiel hinzuzufügen: OCaml hat nicht nur ein Semikolon am Ende von 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 verwenden würden, könnten Sie wahrscheinlich nur dieselben Aufgaben auf dieselbe Weise ausführen.

18
Sebastian

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

In Sprachführer: The Basics heißt es:

Im Gegensatz zu vielen anderen Sprachen erfordert Swift nicht, dass Sie nach jeder Anweisung in Ihrem Code ein Semikolon (;) schreiben, obwohl Sie dies tun können, wenn Sie dies wünschen. Semikolons sind jedoch erforderlich, wenn Sie dies wünschen Ich möchte mehrere separate Anweisungen in eine einzelne Zeile schreiben.

Warum? Denn so wollten es die Sprachdesigner machen.

Der zweite Satz oben zeigt, warum Sie keine Semikolons benötigen. Die meisten Anweisungen 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 weniger Semikolons zum Markieren des Endes einer Anweisung benötigt. Andere Sprachen, die Semikolons verwenden, funktionieren nicht auf diese Weise. Sie können frei schreiben mehrzeilige Anweisungen, aber der Compiler weiß nur, dass die Anweisung beendet wurde, wenn Sie Ihr Semikolon am Ende platzieren.

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

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")
11
Robert Harvey