Kiểm tra kiểu mạnh
Có nhiều người lầm tưởng rằng ngôn ngữ C có kiểm tra kiểu mạnh. So với những ngôn ngữ script thì quả thật C có kiểm tra kiểu ở một chừng mực nào đó, nhưng các phép đổi kiểu tự động đã giáng cho an toàn kiểu một đòn thật là trí mạng. Kiểm tra kiểu trong Java hay là ngay cả Pascal cũng chỉ là những giải pháp nửa vời.
Chính hệ thống kiểm tra kiểu mạnh với việc cấm đổi kiểu tự động là con đường dẫn đến phát triển nhanh và rẻ những ứng dụng an toàn và tin cậy. Hệ thống kiểu của Ada dựa trên nguyên tắc là
các biến khác kiểu nhau không thể chuyển đổi qua lại cho nhau một cách mặc nhiên, mà chỉ có thể chuyển đổi một cách tường minh.
Thí dụ, có thể xác lập một kiểu
số nguyên 32 bit mẫu mực bằng câu khai báo đại loại như sau:
Code: type Integer is range -2**31 .. 2**31-1;
Thật quá bình dị phải không? Bộ biên dịch sẽ chọn cho khoảng đã cho một biểu diễn thích hợp nhất và sẽ kiểm tra tràn số. Mọi chuyện sẽ trở nên thú vị hơn khi ta bắt đầu xác lập kiểu dữ liệu cho một mục đích cụ thể nào đó. Thí dụ:
Code: type so_bac_si is new Integer;
type so_giuong_benh is new Integer;
Đây là khai báo tương tự như typedef của C. Nhưng dĩ nhiên hai câu khai báo này không đặt ra tên mới cho một kiểu đã có sẵn mà xác lập ra hai kiểu mới
dẫn xuất từ Integer,
kế thừa các tính chất và phép toán của Integer. Các biến của kiểu so_bac_si và so_giuong_benh không tương thích với nhau. Thí dụ, do không thể gán số_bác_sĩ cho số_giường_bệnh mặc dù hai kiểu ấy được biểu diễn vật lý giống hệt như nhau, mã nguồn sau đây không thể biên dịch được.
Code: declare
n_bac_si : so_bac_si := 10;
n_giuong_benh : so_giuong_benh;
begin
n_giuong_benh := n_bac_si; -- lỗi ngữ nghĩa tĩnh
end;
Như vậy ngôn ngữ đảm bảo rằng trong chương trình không lẫn lộn được số bác sĩ với số giường bệnh; nhưng nếu điều đó là thật sự cần thiết thì có thể viết một cách tường minh. Thí dụ, câu lệnh sau đây không thể là một sai sót vô tình của lập trình viên mà chỉ có thể là chủ ý rõ ràng, hoặc là sự phá hoại rành rành:
Code: n_giuong_benh := so_giuong_benh(n_bac_si); -- đổi kiểu tường minh