Warum kommen in fast allen modernen Programmiersprachen (Go, Rust, Kotlin, Swift, Scala, Nim, sogar Python letzte Version) Typen immer nach der Variablendeklaration und nicht vorher?
Ihre Prämisse ist an zwei Fronten fehlerhaft:
- Es gibt neue Programmiersprachen, deren Typ vor dem Bezeichner steht. C♯, D oder Ceylon zum Beispiel.
- Wenn der Typ nach dem Bezeichner kein neues Phänomen ist, geht er mindestens auf Pascal (Entwurf 1968–1969, Erscheinen 1970) zurück, wurde aber tatsächlich in der mathematischen Typentheorie verwendet, die ~ 1902 beginnt. Es wurde auch in ML (1973), CLU (1974), Hope (1970), Modula-2 (1977–1985), Ada (1980), Miranda (1985), Caml (1985), Eiffel (1985), Oberon verwendet (1986), Modula-3 (1986–1988) und Haskell (1989).
Pascal, ML, CLU, Modula-2 und Miranda waren alle sehr einflussreiche Sprachen, so dass es nicht verwunderlich ist, dass dieser Stil von Typdeklarationen beliebt blieb.
Warum x: int = 42
nicht int x = 42
? Ist das letztere nicht besser lesbar als das erstere?
Lesbarkeit ist Vertrautheitssache. Ich persönlich finde Chinesisch unleserlich, aber anscheinend tun es die Chinesen nicht. Nachdem ich Pascal in der Schule gelernt habe, mich mit Eiffel, F H, Haskell und Scala beschäftigt habe und mir TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml, ... angesehen habe, sehe ich ganz natürlich aus .
Ist es nur ein Trend oder gibt es wirklich sinnvolle Gründe für eine solche Lösung?
Wenn es sich um einen Trend handelt, ist er ziemlich hartnäckig: Wie ich bereits erwähnte, reicht er in der Mathematik hundert Jahre zurück.
Einer der Hauptvorteile des Typs nach dem Bezeichner besteht darin, dass der Typ einfach weggelassen werden kann, wenn Sie ihn ableiten möchten. Wenn Ihre Erklärungen so aussehen:
val i: Int = 10
Dann ist es trivial, den Typ wegzulassen und ihn so ableiten zu lassen:
val i = 10
Wenn der Typ wie folgt vor dem Bezeichner steht:
Int i = 10
Dann wird es für den Parser immer schwieriger, einen Ausdruck von einer Deklaration zu unterscheiden:
i = 10
Die Lösung, die Sprachdesigner dann normalerweise finden, ist die Einführung eines Schlüsselworts "Ich möchte keinen Typ schreiben", das anstelle des Typs geschrieben werden muss:
var i = 10; // C♯
auto i = 10; // C++
Das macht aber eigentlich nicht viel Sinn: Sie müssen grundsätzlich explizit einen Typ schreiben, der besagt, dass Sie keinen Typ schreiben. Huh? Es wäre viel einfacher und sinnvoller, es einfach wegzulassen, aber das macht die Grammatik viel komplexer.
(Und lassen Sie uns nicht einmal über Funktionszeigertypen in C sprechen .)
Die Designer mehrerer der oben genannten Sprachen haben sich zu diesem Thema geäußert:
Hinweis: Die Entwickler von Ceylon haben auch dokumentiert, warum sie die Präfixtypsyntax verwenden :
Präfix anstelle von Postfix-Typanmerkungen
Warum folgen Sie C und Java, wenn Sie Typanmerkungen an die erste Stelle setzen, anstatt Pascal und ML, wenn Sie sie nach dem Deklarationsnamen setzen?
Weil wir das denken:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
Ist einfach viel einfacher zu lesen als das:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
Und wir verstehen einfach nicht, wie jemand anders denken könnte!
Persönlich finde ich ihr "Argument" viel weniger überzeugend als die anderen.