Dlaczego w prawie wszystkich współczesnych językach programowania (Go, Rust, Kotlin, Swift, Scala, Nim, a nawet ostatnia wersja Python) typy zawsze pojawiają się po deklaracji zmiennej, a nie wcześniej?
Twoje założenie jest wadliwe na dwóch frontach:
- Istnieją nowe języki programowania, które mają typ przed identyfikatorem. Na przykład C♯, D lub Ceylon.
- Mając typ po identyfikatorze, nie jest nowym zjawiskiem, wraca do przynajmniej Pascala (zaprojektowany 1968–1969, wydany w 1970 r.), Ale w rzeczywistości został użyty w matematycznej teorii typów, która zaczyna się około 1902 r. Był również używany w ML (1973), CLU (1974), Hope (1970s), Modula-2 (1977–1985), Ada (1980), Miranda (1985), Caml (1985), Eiffel (1985), Oberon (1986), Modula-3 (1986–1988) i Haskell (1989).
Pascal, ML, CLU, Modula-2 i Miranda były bardzo wpływowymi językami, więc nic dziwnego, że ten styl deklaracji typu pozostał popularny.
Dlaczego x: int = 42
nie int x = 42
? Czy ten drugi nie jest bardziej czytelny niż ten pierwszy?
Czytelność to kwestia znajomości. Osobiście uważam, że Chińczycy są nieczytelni, ale najwyraźniej Chińczycy nie. Kiedy nauczyłem się Pascala w szkole, bawiąc się Eiffelem, F♯, Haskellem i Scalą, i patrząc na TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml,… wydaje mi się to całkowicie naturalne .
Czy to tylko trend, czy istnieją naprawdę istotne powody takiego rozwiązania?
Jeśli jest to trend, jest dość trwały: jak wspomniałem, matematyka sięga stu lat wstecz.
Jedną z głównych zalet posiadania typu po identyfikatorze jest to, że łatwo jest pominąć typ, jeśli chcesz go wywnioskować. Jeśli twoje deklaracje wyglądają tak:
val i: Int = 10
W takim razie pominięcie tego typu i wyciągnięcie z niego wniosku jest takie proste:
val i = 10
Natomiast jeśli typ występuje przed takim identyfikatorem:
Int i = 10
Następnie parser zaczyna mieć trudności z odróżnieniem wyrażenia od deklaracji:
i = 10
Rozwiązaniem, które zwykle wymyślają projektanci języków, jest wprowadzenie słowa kluczowego „Nie chcę pisać typu”, które należy wpisać zamiast typu:
var i = 10; // C♯
auto i = 10; // C++
Ale to nie ma większego sensu: po prostu musisz wyraźnie napisać typ, który mówi, że nie piszesz typu. Co? Byłoby o wiele łatwiejsze i rozsądniejsze po prostu pominięcie tego, ale to czyni gramatykę znacznie bardziej złożoną.
(I nie mówmy nawet o typach wskaźników funkcji w C.)
Projektanci kilku wyżej wymienionych języków zastanawiali się nad tym tematem:
Uwaga: projektanci Ceylonu również udokumentowali, dlaczego używają składni typu prefiksu :
Prefiks zamiast adnotacji typu postfiks
Dlaczego postępujesz zgodnie z C i Javą, umieszczając adnotacje na pierwszym miejscu, zamiast Pascal i ML, umieszczając je po nazwie deklaracji?
Ponieważ uważamy, że:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
Jest po prostu o wiele łatwiejszy do odczytania niż to:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
Po prostu nie rozumiemy, jak ktokolwiek mógłby myśleć inaczej!
Osobiście uważam, że ich „argument” jest o wiele mniej przekonujący niż inni.