Trong một hệ thống được gõ động, các giá trị có các kiểu trong thời gian chạy nhưng các biến và hàm thì không. Trong một hệ thống gõ tĩnh, các biến và hàm có các loại được biết và kiểm tra tại thời gian biên dịch. Ví dụ, trong Python xcó thể là bất cứ điều gì ; trong thời gian chạy, nếu đó là 1một số và nếu có "foo", đó là một chuỗi. Bạn sẽ chỉ biết loại nào xlà trong thời gian chạy, và nó có thể khác nhau mỗi khi bạn chạy chương trình. Trong một ngôn ngữ như Java, bạn sẽ viết int xnếu xlà một số và bạn sẽ biết vào thời gian biên dịch xluôn phải là một số int.
Cả hai loại "ngầm" và "ngầm" đều đề cập đến các hệ thống kiểu tĩnh . Đặc điểm xác định của một hệ thống tĩnh là các loại được biết tại thời điểm biên dịch, nhưng không nhất thiết là chúng phải được viết ra. Trong Java, các kiểu là rõ ràng - bạn phải viết chúng ra. Vì vậy, trong Java, một phương thức có thể trông giống như:
public int foo(String bar, Object baz) { ... }
Các loại đều được biết đến tại thời gian biên dịch (tĩnh) và viết ra (rõ ràng). Tuy nhiên, cũng có những ngôn ngữ không bắt buộc bạn phải viết ra. Họ có thể suy ra loại chức năng từ cơ thể của nó và cách nó được sử dụng. Một ví dụ sẽ là OCaml, nơi bạn có thể viết một cái gì đó như:
let foo x = x + 1
Vì bạn đã sử dụng +, OCaml có thể tự mình hiểu ra rằng đó xphải là inttất cả. Vì vậy, loại foo( foo : int -> int) được biết đến tại thời điểm biên dịch, giống như ví dụ Java. Nó hoàn toàn tĩnh. Tuy nhiên, vì trình biên dịch có thể tự tìm ra các loại phải là gì, bạn không cần phải tự viết chúng ra: chúng ẩn.
Tóm lại: liệu một hệ thống loại là rõ ràng hay ẩn là một thuộc tính của các hệ thống tĩnh . Đó là một câu hỏi hoàn toàn khác với việc một hệ thống kiểu là động hay tĩnh.
Thông thường, bạn có các hệ thống loại đôi khi rõ ràng và đôi khi ẩn.
Ví dụ: tôi tin rằng C # cho phép bạn suy luận các loại bằng cách sử dụng vartừ khóa. Vì vậy, thay vì viết int x = 10, bạn có thể viết var x = 10và trình biên dịch chỉ ra rằng đó xphải là một int. C ++ làm một cái gì đó tương tự với auto. Các hệ thống này thường rõ ràng nhưng có một số suy luận.
Trên flipside, có những hệ thống thường ẩn nhưng đôi khi buộc bạn phải viết ra một chữ ký loại. Haskell là một ví dụ tuyệt vời. Hầu hết thời gian, Haskell có thể suy ra các loại cho bạn. Tuy nhiên, đôi khi bạn có thể viết mã không rõ ràng show . read, trong đó Haskell không thể tự mình tìm ra các loại. Trong trường hợp này, bạn sẽ buộc phải chỉ định rõ ràng loại showhoặc read. Ngoài ra, một số tính năng nâng cao hơn của hệ thống loại (như đa hình hạng n) làm cho suy luận không thể giải quyết được - nghĩa là, nó không được bảo đảm để dừng lại. Điều này có nghĩa là mã sử dụng tính năng này thường cần chữ ký loại rõ ràng.