Чому майже у всіх сучасних мовах програмування (Go, Rust, Kotlin, Swift, Scala, Nim, навіть остання версія Python) типи завжди надходять після оголошення змінної, а не раніше?
Ваше приміщення є недоліком на двох фронтах:
- Існують нові мови програмування, які мають тип перед ідентифікатором. Наприклад, C♯, D або Цейлон.
- Наявність типу після ідентифікатора не є новим явищем, воно повертається принаймні до Паскаля (розроблений 1968-1969 рр., Випущений у 1970 р.), Але насправді використовувався в математичній теорії типів, яка починається з 1902 р. Він також використовувався в ML (1973), CLU (1974), Hope (1970), Modula-2 (1977–1985), Ada (1980), Міранда (1985), Caml (1985), Eiffel (1985), Oberon (1986), Модула-3 (1986–1988) та Хаскелл (1989).
Паскаль, ML, CLU, Modula-2 і Miranda всі були дуже впливовими мовами, тому не дивно, що цей стиль декларацій типу залишався популярним.
Чому x: int = 42
і ні int x = 42
? Чи останні не є більш читабельними, ніж перші?
Читання - це питання знайомства. Особисто я вважаю китайську мову нечитаючою, але, мабуть, китайці цього не роблять. Дізнавшись Паскаля в школі, посварившись з Ейфелем, F♯, Хаскеллом та Скалою, а також подивившись на TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml,…, мені це здається абсолютно природним .
Це просто тенденція чи є якісь справді значущі причини, що стоять за таким рішенням?
Якщо це тенденція, вона досить наполеглива: як я вже згадував, це математика йде на сто років назад.
Однією з головних переваг наявності типу після ідентифікатора є те, що легко залишити тип, якщо ви хочете, щоб він міг зробити висновок. Якщо ваші декларації виглядають так:
val i: Int = 10
Тоді тривіально виключати тип і робити це таким чином:
val i = 10
Беручи до уваги, якщо тип стоїть перед таким ідентифікатором:
Int i = 10
Тоді аналізатору починає важко відрізняти вираз від декларації:
i = 10
Рішення, яке зазвичай розробляють мовні дизайнери, - це ввести ключове слово "Я не хочу писати тип", яке потрібно писати замість типу:
var i = 10; // C♯
auto i = 10; // C++
Але це насправді не має великого сенсу: в основному ви повинні явно написати тип, який говорить про те, що ви не пишете тип. Так? Було б набагато простіше і розумніше просто залишити це, але це робить граматику набагато складнішою.
(І давайте навіть не говорити про типи вказівників функцій у C.)
Дизайнери кількох вищезгаданих мов зважили на цю тему:
Примітка: дизайнери Цейлону також задокументували, чому вони використовують синтаксис типу префікса :
Префікс замість анотацій типу постфікса
Чому ви дотримуєтесь C та Java, коли в першу чергу викладаєте анотації типу, а не Pascal та ML, а їх після імені декларації?
Тому що ми думаємо так:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
Просто читати набагато простіше, ніж це:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
І ми просто не розуміємо, як хтось може подумати інакше!
Особисто я вважаю їх "аргумент" набагато менш переконливим, ніж інші.