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)