Lesson 14 — Sinh mã điều khiển luồng (if/while → jumps)
Ba module tương tác: (1) Compiler dịch if/while/for thành bytecode có nhãn + JMP/JMPF; (2) VM stepper chạy bytecode, vẽ PC nhảy qua các nhãn cùng stack & biến; (3) CFG viewer vẽ basic block + cạnh. Compiler và VM là code JS thật, không phải hình tĩnh.
1. Compiler: cấu trúc cao cấp → bytecode
Compiler sinh nhãn (
Lelse, Lend, Lstart) rồi backpatch địa chỉ — cột địa chỉ là số thật VM thấy. Lệnh nhảy tô tím.2. VM stepper: chạy bytecode với lệnh nhảy
Bytecode lấy từ module 1. Bấm Bước để chạy từng lệnh — chú ý PC nhảy khi gặp JMP/JMPF (không tăng đều). Mặc định:
i=0; while i<3 { print i; i=i+1 }.PC = 0 · số bước đã chạy: 0 · số lần nhảy: 0
Stack (đỉnh ở trên)
Biến
Output (PRINT)
3. CFG viewer: basic block + cạnh nhánh
Cắt bytecode hiện tại thành basic block (leader = lệnh đầu, đích nhảy, hoặc lệnh ngay sau nhảy) rồi nối cạnh luồng điều khiển.
if → hình kim cương; while → có cạnh lùi (back edge, tô tím).
fall-through / true
nhánh false (JMPF)
back edge (vòng lặp)