Các ngôn ngữ được nhập tĩnh thường yêu cầu bạn khai báo các loại biến, sau đó được kiểm tra tại thời điểm biên dịch để giảm lỗi. Từ "tĩnh" trong "gõ tĩnh" dùng để chỉ "phân tích mã tĩnh", đây là quá trình kiểm tra mã trước khi thực thi nó. Mặc dù ngôn ngữ gõ tĩnh có thể suy ra loại biến từ phía bên phải của biểu thức hoặc tham số thực tế, trong thực tế, hầu hết các ngôn ngữ gõ tĩnh yêu cầu các loại biến phải được khai báo rõ ràng.
Các ngôn ngữ được gõ động thường không yêu cầu khai báo biến phải có loại và chúng suy ra các loại biến dựa trên loại được tính như là kết quả của việc đánh giá phía bên phải của mỗi câu lệnh gán hoặc tham số thực cho lệnh gọi hàm. Vì biến có thể được gán nhiều lần trong suốt vòng đời của nó, nên loại của nó có thể thay đổi theo thời gian và đây là lý do tại sao nó được gọi là "gõ động". Ngoài ra, môi trường thời gian chạy cần theo dõi loại hiện tại cho mỗi biến, vì vậy loại này được liên kết với giá trị hơn là với khai báo biến. Đây có thể được coi là một hệ thống thông tin loại thời gian chạy (RTTI).
Các yếu tố của ngôn ngữ gõ tĩnh và động có thể được kết hợp. Ví dụ, C # hỗ trợ cả các biến được nhập tĩnh và động và các ngôn ngữ hướng đối tượng thường hỗ trợ phân cấp kiểu truyền xuống. Các ngôn ngữ được nhập tĩnh thường cung cấp nhiều cách khác nhau để bỏ qua việc kiểm tra kiểu, ví dụ bằng cách sử dụng phép truyền, phản xạ và gọi động.
Nhập mạnh so với gõ yếu đề cập đến sự liên tục về mức độ ngôn ngữ cố gắng ngăn chặn lỗi do sử dụng một biến như thể nó là một loại khi thực tế nó là một loại khác. Ví dụ, cả C và Java đều là các ngôn ngữ được nhập tĩnh, tuy nhiên Java sử dụng kiểm tra kiểu mạnh hơn nhiều so với C. Mã C sau đây rất vui khi biên dịch và chạy và sẽ đặt một giá trị ngẫu nhiên vào biến b khi chạy, rất có thể gây ra một bọ cánh cứng:
char *a = "123";
int b = (int)a;
Mã Java tương đương sẽ tạo ra một lỗi biên dịch, thường được ưu tiên hơn:
String a = "123"
int b = (int)a;