Tweeter gốc ở đây. :)
Trước hết, tôi có phần thích thú / sốc khi tweet của tôi đang được thực hiện nghiêm túc! Nếu tôi biết nó sẽ được phổ biến rộng rãi như vậy, tôi đã dành hơn 30 giây để viết nó!
Thiago Silva là chính xác để chỉ ra rằng "tĩnh" và "động" mô tả chính xác hơn việc kiểm tra loại , thay vì hệ thống loại . Trên thực tế, thật không chính xác khi nói rằng một ngôn ngữ được gõ tĩnh hoặc động. Thay vào đó, một ngôn ngữ có một hệ thống loại và việc triển khai ngôn ngữ đó có thể thực thi hệ thống loại bằng cách sử dụng kiểm tra tĩnh hoặc kiểm tra động hoặc cả hai hoặc không (mặc dù đó sẽ không phải là một triển khai ngôn ngữ rất hấp dẫn!).
Khi điều đó xảy ra, có một số hệ thống loại (hoặc tính năng của hệ thống loại) dễ kiểm tra tĩnh hơn và có một số hệ thống loại nhất định (hoặc tính năng của hệ thống loại) dễ kiểm tra động hơn. Ví dụ: nếu ngôn ngữ của bạn cho phép bạn chỉ định trong văn bản của chương trình rằng một giá trị cụ thể phải luôn là một mảng các số nguyên, thì việc viết một trình kiểm tra tĩnh để xác minh thuộc tính đó là hợp lý. Ngược lại, nếu ngôn ngữ của bạn có phân nhóm và nếu nó cho phép phát sóng, thì việc kiểm tra tính hợp lệ của một chương trình truyền phát trong thời gian chạy là vô cùng đơn giản, nhưng cực kỳ khó thực hiện trong thời gian biên dịch.
Điều tôi thực sự muốn nói về tweet của mình chỉ đơn giản là phần lớn các triển khai ngôn ngữ thực hiện một số lượng kiểm tra loại động. Hoặc, tương tự, phần lớn các ngôn ngữ có một số tính năng rất khó (nếu không thể) kiểm tra tĩnh. Downcasting là một ví dụ. Các ví dụ khác bao gồm tràn số học, kiểm tra giới hạn mảng và kiểm tra null. Một số trong số này có thể được kiểm tra tĩnh trong một số trường hợp, nhưng nhìn chung, bạn khó có thể tìm thấy một triển khai ngôn ngữ mà không thực hiện bất kỳ kiểm tra nào trong thời gian chạy.
Đây không phải là một điều xấu. Đó chỉ là một quan sát rằng có nhiều đặc tính thú vị mà chúng tôi muốn các ngôn ngữ của chúng tôi thực thi và chúng tôi không thực sự biết cách kiểm tra tĩnh. Và đó là một lời nhắc nhở rằng sự khác biệt như "loại tĩnh" so với "loại động" gần như không rõ ràng như một số người sẽ tin bạn. :)
Một lưu ý cuối cùng: thuật ngữ "mạnh" và "yếu" không thực sự được sử dụng trong cộng đồng nghiên cứu ngôn ngữ lập trình và chúng không thực sự có ý nghĩa nhất quán. Nói chung, tôi thấy rằng khi ai đó nói rằng một ngôn ngữ có "gõ mạnh" và một số ngôn ngữ khác có "gõ yếu", họ thực sự nói rằng ngôn ngữ yêu thích của họ (ngôn ngữ có "gõ mạnh") ngăn họ khỏi mắc một số sai lầm mà ngôn ngữ khác (ngôn ngữ "gõ yếu") không - hoặc ngược lại, ngôn ngữ yêu thích của họ (ngôn ngữ "gõ yếu") cho phép họ thực hiện một số điều thú vị mà ngôn ngữ kia ( một với "gõ mạnh") thì không.