Tóm lại: làm thế nào các hệ thống loại được phân loại trong bối cảnh học thuật; đặc biệt, tôi có thể tìm các nguồn có uy tín ở đâu để làm rõ sự khác biệt giữa các loại hệ thống loại khác nhau?
Theo một nghĩa nào đó, khó khăn với câu hỏi này không phải là tôi không thể tìm thấy câu trả lời, mà là tôi có thể tìm thấy quá nhiều, và không có gì nổi bật là chính xác. Bối cảnh là tôi đang cố gắng cải thiện một bài viết trên wiki Haskell về việc gõ , hiện đang tuyên bố những điểm khác biệt sau:
- Không gõ: Ngôn ngữ không có khái niệm về loại hoặc theo quan điểm đánh máy: Có chính xác một loại trong ngôn ngữ. Ngôn ngữ hội chỉ có loại 'mẫu bit', Rexx và Tk chỉ có loại 'văn bản', MatLab lõi chỉ có loại 'ma trận có giá trị phức tạp'.
- Gõ yếu: Chỉ có một vài loại phân biệt và có thể loại từ đồng nghĩa cho một số loại. Ví dụ C sử dụng số nguyên cho booleans, số nguyên, ký tự, tập bit và liệt kê.
- Gõ mạnh: Tập hợp các loại tốt như trong ngôn ngữ Ada, Wirthian (Pascal, Modula-2), Eiffel
Điều này hoàn toàn trái ngược với nhận thức cá nhân của tôi, vốn nằm dọc theo dòng:
- Gõ yếu: Các đối tượng có các loại, nhưng được chuyển đổi hoàn toàn sang các loại khác khi bối cảnh yêu cầu. Ví dụ, Perl, PHP và JavaScript là tất cả các ngôn ngữ
"1"
có thể được sử dụng trong nhiều hoặc ít hơn bất kỳ ngữ cảnh nào1
có thể. - Gõ mạnh: Các đối tượng có các loại và không có chuyển đổi ngầm định (mặc dù quá tải có thể được sử dụng để mô phỏng chúng), vì vậy sử dụng một đối tượng trong ngữ cảnh sai là một lỗi. Trong Python, lập chỉ mục một mảng bằng chuỗi hoặc float sẽ ném ngoại lệ TypeError; trong Haskell nó sẽ thất bại tại thời gian biên dịch.
Tôi đã hỏi ý kiến về điều này từ những người khác có nhiều kinh nghiệm trong lĩnh vực này hơn tôi và một người đã đưa ra đặc điểm này:
- Gõ yếu: Thực hiện các thao tác không hợp lệ trên dữ liệu không được kiểm soát hoặc từ chối mà chỉ tạo ra kết quả không hợp lệ / tùy ý.
- Gõ mạnh: Thao tác trên dữ liệu chỉ được phép nếu dữ liệu tương thích với thao tác.
Theo tôi hiểu, các đặc điểm đầu tiên và cuối cùng sẽ gọi C là đánh máy yếu, thứ hai sẽ gọi nó là gõ mạnh. Đầu tiên và thứ hai sẽ gọi Perl và PHP gõ yếu, thứ ba sẽ gọi chúng là gõ mạnh. Cả ba sẽ mô tả Python như được gõ mạnh.
Tôi nghĩ rằng hầu hết mọi người sẽ nói với tôi "tốt, không có sự đồng thuận, không có ý nghĩa được chấp nhận của các điều khoản". Nếu những người đó sai, tôi rất vui khi nghe về điều đó, nhưng nếu họ đúng, thì làm thế nào để các nhà nghiên cứu CS mô tả và so sánh các hệ thống loại? Tôi có thể sử dụng thuật ngữ nào ít vấn đề hơn?
Là một câu hỏi liên quan, tôi cảm thấy sự phân biệt động / tĩnh thường được đưa ra theo nghĩa "thời gian biên dịch" và "thời gian chạy", điều mà tôi thấy không thỏa đáng khi cho rằng một ngôn ngữ được biên dịch hay không không phải là một đặc tính của ngôn ngữ đó như việc thực hiện của nó. Tôi cảm thấy nên có một mô tả thuần túy về ngữ nghĩa của kiểu gõ động so với tĩnh; một cái gì đó dọc theo dòng chữ "một ngôn ngữ tĩnh là một ngôn ngữ trong đó mọi biểu hiện phụ có thể được gõ". Tôi sẽ đánh giá cao bất kỳ suy nghĩ, đặc biệt là tài liệu tham khảo, mang lại sự rõ ràng cho khái niệm này.