Tại sao trong gần như tất cả các ngôn ngữ lập trình hiện đại (Go, Rust, Kotlin, Swift, Scala, Nim, thậm chí phiên bản Python cuối cùng) luôn xuất hiện sau khai báo biến, chứ không phải trước?
Tiền đề của bạn là thiếu sót trên hai mặt trận:
- Có những ngôn ngữ lập trình mới có loại trước định danh. C, D, hoặc Ceylon chẳng hạn.
- Có loại sau khi định danh không phải là một hiện tượng mới, nó quay trở lại ít nhất là Pascal (được thiết kế năm 196819191969, phát hành năm 1970), nhưng thực sự đã được sử dụng trong lý thuyết loại toán học, bắt đầu ~ 1902. Nó cũng được sử dụng trong ML (1973), CLU (1974), Hope (1970), Modula-2 (1977 Hóa1985), Ada (1980), Miranda (1985), Caml (1985), Eiffel (1985), Oberon (1986), Modula-3 (1986 Từ1988) và Haskell (1989).
Pascal, ML, CLU, Modula-2 và Miranda đều là những ngôn ngữ có ảnh hưởng rất lớn, vì vậy không có gì đáng ngạc nhiên khi phong cách khai báo kiểu này vẫn phổ biến.
Tại sao x: int = 42
và không int x = 42
? Là cái sau không dễ đọc hơn cái trước?
Khả năng đọc là một vấn đề quen thuộc. Cá nhân, tôi thấy tiếng Trung là không thể đọc được, nhưng rõ ràng, người Trung Quốc thì không. Học Pascal ở trường, học hỏi về Eiffel, F♯, Haskell và Scala, và đã xem TypeScript, Fortress, Go, Rust, Kotlin, Idris, Frege, Agda, ML, Ocaml, Nott, nó trông hoàn toàn tự nhiên đối với tôi .
Nó chỉ là một xu hướng hoặc có bất kỳ lý do thực sự có ý nghĩa đằng sau một giải pháp như vậy?
Nếu đó là một xu hướng, nó khá dai dẳng: như tôi đã đề cập, nó đã tồn tại hàng trăm năm trong toán học.
Một trong những lợi thế chính của việc có loại sau mã định danh, là dễ dàng loại bỏ loại này nếu bạn muốn nó được suy ra. Nếu khai báo của bạn trông như thế này:
val i: Int = 10
Sau đó, thật là tầm thường khi loại bỏ các loại và suy ra nó như thế này:
val i = 10
Trong khi đó nếu loại đi trước định danh như thế này:
Int i = 10
Sau đó, nó bắt đầu khó phân tích cú pháp để phân biệt một biểu thức với một khai báo:
i = 10
Giải pháp mà các nhà thiết kế ngôn ngữ thường đưa ra là giới thiệu từ khóa "Tôi không muốn viết một loại" phải viết thay vì loại:
var i = 10; // C♯
auto i = 10; // C++
Nhưng điều này thực sự không có nhiều ý nghĩa: về cơ bản bạn phải viết một loại rõ ràng rằng bạn không viết một loại. Huh? Sẽ dễ dàng và hợp lý hơn nhiều nếu chỉ bỏ nó đi, nhưng điều đó làm cho ngữ pháp phức tạp hơn nhiều.
(Và chúng ta thậm chí không nói về các loại con trỏ hàm trong C.)
Các nhà thiết kế của một số ngôn ngữ nói trên đã cân nhắc về chủ đề này:
Lưu ý: các nhà thiết kế của Ceylon cũng ghi lại lý do tại sao họ sử dụng cú pháp loại tiền tố :
Tiền tố thay vì chú thích loại hậu tố
Tại sao bạn theo dõi C và Java trong việc đặt các chú thích kiểu trước, thay vì Pascal và ML đặt chúng sau tên khai báo?
Bởi vì chúng tôi nghĩ rằng:
shared Float e = ....
shared Float log(Float b, Float x) { ... }
Đơn giản là dễ đọc hơn nhiều so với điều này:
shared value e: Float = ....
shared function log(b: Float, x: Float): Float { ... }
Và chúng tôi chỉ đơn giản là không hiểu làm thế nào bất cứ ai có thể nghĩ khác!
Cá nhân, tôi thấy "lập luận" của họ kém thuyết phục hơn những người khác.