Mengapa di hampir semua bahasa pemrograman modern (Go, Rust, Kotlin, Swift, Scala, Nim, bahkan versi terakhir Python) selalu muncul setelah deklarasi variabel, dan bukan sebelumnya?
Premis Anda cacat di dua bidang:
- Ada bahasa pemrograman new-ish yang memiliki tipe sebelum pengenal. C♯, D, atau Ceylon, misalnya.
- Memiliki tipe setelah pengenal bukan merupakan fenomena baru, itu kembali ke setidaknya Pascal (dirancang 1968-1969, dirilis pada 1970), tetapi sebenarnya digunakan dalam teori tipe matematika, yang dimulai ~ 1902. Itu juga digunakan dalam ML (1973), CLU (1974), Hope (1970-an), Modula-2 (1977–1985), Ada (1980), Miranda (1985), Caml (1985), Eiffel (1985), Oberon (1986), Modula-3 (1986–1988), dan Haskell (1989).
Pascal, ML, CLU, Modula-2, dan Miranda semuanya adalah bahasa yang sangat berpengaruh, sehingga tidak mengherankan bahwa gaya deklarasi tipe ini tetap populer.
Kenapa x: int = 42
dan tidak int x = 42
? Apakah yang terakhir tidak lebih mudah dibaca daripada yang pertama?
Keterbacaan adalah masalah keakraban. Secara pribadi, saya menemukan bahasa Mandarin tidak dapat dibaca, tetapi ternyata, orang-orang Tionghoa tidak. Setelah mempelajari Pascal di sekolah, mencoba-coba Eiffel, F♯, Haskell, dan Scala, dan setelah melihat TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml,…, itu terlihat sangat alami bagi saya .
Apakah ini hanya tren atau adakah alasan yang benar-benar bermakna di balik solusi semacam itu?
Jika tren, itu cukup gigih: seperti yang saya sebutkan, itu kembali seratus tahun dalam matematika.
Salah satu keuntungan utama memiliki jenis setelah pengidentifikasi, adalah mudah untuk meninggalkan jenis jika Anda ingin disimpulkan. Jika deklarasi Anda terlihat seperti ini:
val i: Int = 10
Maka sepele untuk meninggalkan jenis dan disimpulkan seperti ini:
val i = 10
Sedangkan jika jenisnya datang sebelum pengenal seperti ini:
Int i = 10
Kemudian mulai menjadi sulit bagi parser untuk membedakan ekspresi dari deklarasi:
i = 10
Solusi yang biasanya muncul oleh perancang bahasa adalah dengan memperkenalkan kata kunci "Saya tidak ingin menulis jenis" yang harus ditulis alih-alih jenis:
var i = 10; // C♯
auto i = 10; // C++
Tapi ini sebenarnya tidak masuk akal: Anda pada dasarnya harus secara eksplisit menulis jenis yang mengatakan bahwa Anda tidak menulis jenis. Hah? Akan jauh lebih mudah dan lebih masuk akal untuk meninggalkannya, tetapi itu membuat tata bahasanya jauh lebih kompleks.
(Dan mari kita bahkan tidak berbicara tentang jenis pointer fungsi di C.)
Para perancang dari beberapa bahasa yang disebutkan di atas telah mempertimbangkan masalah ini:
Catatan: desainer Ceylon juga mendokumentasikan mengapa mereka menggunakan sintaks tipe awalan :
Awalan bukan anotasi jenis postfix
Mengapa Anda mengikuti C dan Java dalam menempatkan anotasi jenis terlebih dahulu, alih-alih Pascal dan ML dalam menempatkannya setelah nama deklarasi?
Karena kami pikir ini:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
Jauh lebih mudah dibaca daripada ini:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
Dan kami sama sekali tidak mengerti bagaimana orang bisa berpikir sebaliknya!
Secara pribadi, saya menemukan "argumen" mereka jauh kurang meyakinkan daripada yang lain.