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] Tối ưu hoá peephole cho bytecode ngăn xếp

    Tối ưu hoá peephole (peephole optimization) là kỹ thuật tối ưu bytecode bằng cách xét một cửa sổ nhỏ các lệnh liên tiếp và thay thế bằng một dãy lệnh tương đương ngắn/nhanh hơn. Cho một chương trình thẳng (không nhãn, không rẽ nhánh) gồm các lệnh PUSH x, ADD, SUB, MUL, DUP, POP (lưu ý: chương trình chỉ mang tính cú pháp để luyện viết lại, không cần đảm bảo có thể thực thi hợp lệ mà không tràn dưới ngăn xếp — bạn chỉ cần áp dụng máy móc các luật viết lại dưới đây trên dãy lệnh).

    Áp dụng lặp đi lặp lại các luật viết lại sau, cho đến khi không còn luật nào áp dụng được (điểm bất động):

    1. PUSH a, PUSH b, ADD →\to→ PUSH (a+b)
    2. PUSH a, PUSH b, SUB →\to→ PUSH (a-b)
    3. PUSH a, PUSH b, MUL →\to→ PUSH (a*b)
    4. PUSH a, POP →\to→ (xoá cả hai lệnh)
    5. PUSH a, DUP →\to→ PUSH a, PUSH a

    Thuật toán xác định (bắt buộc tuân theo để đảm bảo kết quả duy nhất): lặp lại nhiều vòng; ở mỗi vòng, quét từ trái sang phải để tìm vị trí iii nhỏ nhất mà tại đó có một luật khớp (luật 1–3 xét cửa sổ 3 lệnh, luật 4–5 xét cửa sổ 2 lệnh; tại một vị trí không thể có hai luật cùng khớp), áp dụng luật đó, rồi bắt đầu lại việc quét từ đầu danh sách đã cập nhật. Dừng khi một vòng quét đầy đủ không tìm thấy vị trí nào khớp.

    Ví dụ: PUSH 3; DUP; ADD →\to→ (luật 5 tại vị trí 0) PUSH 3; PUSH 3; ADD →\to→ (luật 1 tại vị trí 0) PUSH 6.

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

      Dòng đầu chứa số nguyên nnn (0≤n≤10000 \le n \le 10000≤n≤1000) là số lệnh. nnn dòng tiếp theo là các lệnh theo cú pháp trên (các số nguyên có trị tuyệt đối không vượt quá 10910^9109, kết quả trung gian không vượt quá 101510^{15}1015 về trị tuyệt đối).

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

      In ra danh sách lệnh sau khi tối ưu, mỗi lệnh một dòng, theo đúng cú pháp ban đầu (PUSH x hoặc tên lệnh). Nếu danh sách rỗng sau khi tối ưu (hoặc n=0n=0n=0), in ra một dòng trống.

    Ví dụ:

    Đầu vào:

    3
    PUSH 3
    DUP
    ADD
    

    Đầu ra:

    PUSH 6
    

    Đầu vào:

    5
    PUSH 1
    PUSH 2
    PUSH 3
    ADD
    ADD
    

    Đầu ra:

    PUSH 6
    

    Đang tải editor...