Lesson 11 — Mã trung gian (IR) & Three-Address Code

Ba công cụ tương tác: (1) AST → TAC generator — nhập biểu thức, xem cây AST và mã three-address sinh ra từng bước theo post-order; (2) CFG viewer — chương trình if/while chia thành basic block nối bằng cạnh; (3) TAC vs SSA — cùng một đoạn ở hai dạng.

1. AST → Three-Address Code (từng bước)

Cú pháp: biến là chữ thường a b c x y, hằng là số 0..9; toán tử + - * /, dấu ( ) để nhóm, - đứng trước là phép một ngôi (vd -x). Bấm Sinh từng bước để xem từng lệnh TAC xuất hiện đúng thứ tự post-order (temp t1, t2… hiện dần).
Mẫu:
Cây AST
Node lá (hằng/biến) — không phát lệnh Node phép tính — phát 1 lệnh, sinh 1 temp
Three-Address Code

2. Control Flow Graph (CFG)

Chọn một chương trình nhỏ. Viz dịch sang TAC (label/goto/if), chia thành basic block (mỗi block chạy một mạch) rồi vẽ đồ thị luồng điều khiển — đỉnh là block, cạnh là luồng chạy khả dĩ.

TAC (đã đánh dấu leader)
CFG — basic block + cạnh

3. TAC thường vs SSA

Cùng một đoạn có biến bị gán lại nhiều lần. Bên trái TAC thường (tên biến tái dùng); bên phải SSA — mỗi lần gán tạo một version mới (x1, x2…), nhờ vậy "tên = giá trị" và tối ưu dễ hơn.

TAC thường — biến gán nhiều lần
Ô tô vàng = lần gán lại cùng một tên → khó biết "ở đây giá trị tới từ đâu".
SSA — mỗi tên gán đúng 1 lần
Nhìn version (x2) là biết ngay lệnh nào tạo ra giá trị đó.