Lesson 08 — Kiểm tra kiểu (Type Checking)
Ba công cụ tương tác: type checker bottom-up vẽ AST và gán kiểu từng node (tô đỏ chỗ lỗi), demo static vs dynamic bắt lỗi lúc-dịch vs lúc-chạy, và coercion explorer so kết quả ép kiểu giữa Go / Python / JS.
1. Type Checker bottom-up — vẽ AST & gán kiểu
Nhập biểu thức: literal
int (vd 2), float (3.14),
bool (true/false), string ("hi"), và biến
age (int) · name (string) · ok (bool) · price (float).
Toán tử: + - * /, so sánh < > ==, logic && ||. Dùng () nhóm.
Mẫu:
2. Static vs Dynamic — bắt lỗi lúc-dịch hay lúc-chạy?
Cùng một snippet (gán string vào biến rồi sau đó cộng số). Nhấn Dịch & chạy để xem
static (Go) chặn ngay lúc dịch, còn dynamic (Python) chạy được tới khi gặp dòng lỗi.
🛂 Static (Go) — kiểm lúc DỊCH
🚆 Dynamic (Python) — kiểm lúc CHẠY
3. Coercion Explorer — cùng phép, khác ngôn ngữ
Chọn một phép ép kiểu rồi xem ba ngôn ngữ xử lý khác nhau thế nào. Go (static+strong) thường từ chối; Python (dynamic+strong) báo lỗi runtime; JS (dynamic+weak) ép ngầm.
4. Bảng so sánh static / dynamic / strong / weak
| Ngôn ngữ | Static / Dynamic | Strong / Weak | "a" + 1 | Lỗi kiểu lộ khi nào |
|---|---|---|---|---|
| Go | Static | Strong | lỗi biên dịch | lúc dịch |
| Rust | Static | Strong | lỗi biên dịch | lúc dịch |
| Java | Static | Strong-ish | "a1" (+ với String) | lúc dịch (nếu kiểu khác hẳn) |
| Python | Dynamic | Strong | TypeError | lúc chạy |
| JavaScript | Dynamic | Weak | "a1" | hiếm khi — ép ngầm |
| C | Static | Weak | con trỏ + int (UB) | lúc dịch một phần |