Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Phân tích biến sống (live variable analysis) trên mã ba địa chỉ tuyến tính

    Cho đoạn mã TAC tuyến tính (không rẽ nhánh) gồm nnn dòng, mỗi dòng dạng x = a hoặc x = a op b (a, b là tên biến hoặc hằng số nguyên, op ∈{+,−,∗,/}\in \{+,-,*,/\}∈{+,−,∗,/}), và tập các biến "sống ở đầu ra" (live-out) ngay sau khi thực hiện xong dòng lệnh cuối cùng (các biến này còn được sử dụng ở phần mã phía sau, không được cho biết trong đề).

    Với straight-line code, định nghĩa dataflow lùi (backward) kinh điển: gọi def(i)\mathrm{def}(i)def(i) là biến được gán ở dòng iii (vế trái), use(i)\mathrm{use}(i)use(i) là tập các biến (không tính hằng số) xuất hiện ở vế phải dòng iii. Đặt OUT(n)=live_out\mathrm{OUT}(n) = \text{live\_out}OUT(n)=live_out (cho trước). Với iii chạy từ nnn xuống 111: IN(i)=(OUT(i)∖{def(i)})∪use(i)\mathrm{IN}(i) = \big(\mathrm{OUT}(i) \setminus \{\mathrm{def}(i)\}\big) \cup \mathrm{use}(i)IN(i)=(OUT(i)∖{def(i)})∪use(i) và với i>1i > 1i>1: OUT(i−1)=IN(i)\mathrm{OUT}(i-1) = \mathrm{IN}(i)OUT(i−1)=IN(i).

    IN(i)\mathrm{IN}(i)IN(i) chính là tập các biến còn sống ngay trước khi thực hiện dòng iii. Hãy in ra tập IN(i)\mathrm{IN}(i)IN(i) cho mọi iii từ 111 đến nnn.

    Ví dụ: với đoạn mã a=1; b=2; c=a+b; d=c*2 và live-out ={d}=\{d\}={d}, kết quả là IN(1)=∅\mathrm{IN}(1)=\emptysetIN(1)=∅, IN(2)={a}\mathrm{IN}(2)=\{a\}IN(2)={a}, IN(3)={a,b}\mathrm{IN}(3)=\{a,b\}IN(3)={a,b}, IN(4)={c}\mathrm{IN}(4)=\{c\}IN(4)={c}.

    • Định dạng đầu vào:

      Dòng 1: số nguyên nnn. nnn dòng tiếp theo: các lệnh TAC. Dòng tiếp theo: số nguyên mmm (số biến live-out). Nếu m>0m>0m>0: một dòng chứa mmm tên biến cách nhau bởi khoảng trắng. Nếu m=0m=0m=0, dòng này có thể để trống hoặc không xuất hiện.

    • Định dạng đầu ra:

      In nnn dòng, dòng thứ iii có dạng i: <danh sach bien trong IN(i), sap xep tang dan theo bang chu cai, cach nhau boi dau phay khong co khoang trang>; nếu IN(i)\mathrm{IN}(i)IN(i) rỗng thì in i: EMPTY.

    Ví dụ:

    Đầu vào:

    4
    a = 1
    b = 2
    c = a + b
    d = c * 2
    1
    d
    

    Đầu ra:

    1: EMPTY
    2: a
    3: a,b
    4: c
    

    Đầu vào:

    3
    x = a + b
    y = x + a
    z = y - b
    1
    z
    

    Đầu ra:

    1: a,b
    2: a,b,x
    3: b,y
    

    Đang tải editor...