Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 27 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
27
Dung lượng
297,44 KB
Nội dung
Bài SINH MÃ TRUNG GIAN Hoàng Anh Việt Viện CNTT&TT - ĐHBKHN Mô tả bước dịch (1) Mã nguồn (dãy kí tự) Phân tích từ vựng If (a == 0) = a; Dãy từ tố (token) If ( Id:a == ) Id:min = Id:a ; if Cây cú pháp == a = Cây cú pháp điều khiển boolean == int a Phân tích cú pháp ; a Phân tích ngữ nghĩa if = int int int lvalue a ; int Mô tả bước dịch (2) if boolean == = int Sinh mã trung gian ; int int int a lvalue SEQ(CJUMP(TEMP(a) == 0, L1, L2), LABEL(L1), TEMP(min) = TEMP(a) LABEL(L2)) int a cmp rb, jnz L2 L1: mov ra, rb L2: Sinh mã assembly Tối ưu mã cmp ecx, cmovz edx,ecx Ngôn ngữ trung gian • Là ngơn ngữ cho loại máy trừu tượng • Cho phép sinh mã khơng phụ thuộc vào máy đích • Cho phép tối ưu mã trước sinh mã máy thật Pentium Cây cú pháp + thông tin điều khiển Java bytecode AMD Ngôn ngữ trung gian • Dễ sinh từ cú pháp • Dễ sinh mã máy • Số lượng lệnh nhỏ, gọn – Dễ tối ưu mã – Dễ chuyển sang loại mã máy khác Cây cú pháp (>40 nút) Mã trung gian (13 nút) Pentium (>200 lệnh) Ngôn ngữ trung gian • Một dạng thể chương trình nằm cú pháp điều khiển mã máy • Sử dụng – Lệnh nhảy – Thanh ghi – Vị trí nhớ Tối ưu mã Cây cú pháp Mã trung + gian thông tin điều khiển Pentium Java bytecod AMD Một ngơn ngữ trung gian • IR (Intermediate Representation) thể lệnh loại máy trừu tượng • Nút lệnh khơng trả lại giá trị, thực theo thứ tự định – Ví dụ: MOVE, SEQ, CJUMP • Nút biểu thức trả lại giá trị, nút thực theo thứ tự – Ví dụ: ADD, SUB – Cho phép tối ưu mã Mô tả nút biểu thức IR • CONST(i): số nguyên i • TEMP(t): ghi t, máy trừu tượng có vơ hạn ghi • OP(e1, e2): phép tốn – Số học: ADD, SUB, MUL, DIV, MOD – Logic: AND, OR, XOR, LSHIFT, RSHIFT – So sánh: EQ, NEQ, LT, GT, LEQ, GEQ • • • • MEM(e): giá trị nhớ vị trí e CALL(f, a0, a1, …): giá trị hàm f với tham số a0, a1, … NAME(n): địa lệnh liệu có tên n ESEQ(s, e): giá trị e sau lệnh s thực CONST • Nút CONST đại diện cho số CONST(i) • Giá trị nút i TEMP • Nút TEMP đại diện cho ghi số vô hạn ghi máy trừu tượng • Các biến cục biến tạm • Để dễ viết, ký hiệu FP = TEMP(FP) địa bắt đầu nhớ hàm • Giá trị nút giá trị ghi thời điểm tính tốn TEMP(t) CALL • Nút CALL đại diện cho lời gọi hàm CALL … Địa hàm Tham số ef e0e1e2 • Không định nghĩa cách cài đặt việc truyền tham số, quản lý ngăn xếp • Giá trị nút giá trị hàm CALL(ef, e0, e1,…) NAME • Nút NAME đại diện cho địa tên nhớ • VD: địa nhãn nhảy NAME(n) ESEQ • Nút ESEQ tính tốn giá trị biểu thức e sau thực lệnh s ESEQ(s, e) ESEQ s e Mô tả nút lệnh IR • MOVE(dest, e): chuyển giá trị e vào dest • EXP(e): tính tốn giá trị e, khơng cần lưu lại kết • SEQ(s1, s2, … sn): thực lệnh theo thứ tự • JUMP(e): nhảy đến địa e • CJUMP(e, l1, l2): nhảy đến l1 l2 tuỳ thuộc vào giá trị e true false • LABEL(n): tạo nhãn có tên n Ví dụ n = 0; while (n < 10) { n = n + 1; } SEQ( MOVE(TEMP(n), CONST(0)), LABEL(HEAD), CJUMP(LT(TEMP(n), CONST(10)), NAME(BODY), NAME(END)), LABEL(BODY), MOVE(TEMP(n), ADD(TEMP(n), CONST(1))), JUMP(NAME(HEAD)), LABEL(END) ) SEQ MOVE LABEL(HEAD) CJUMP LABEL(BODY) OVEJUMP M TEMP(n) CONST(0) LT NAME(BODY) NAME(END) TEMP(n) CONST(10) LABEL(END) NAME(HEAD) TEMP(n) ADD TEMP(n) CONST(1) Cấu trúc IR • Gốc nút lệnh • Các nút biểu thức nằm nút lệnh • Chỉ có nút biểu thức ESEQ có nút lệnh nằm • Có thể duyệt IR để chạy chương trình Sinh IR (mã trung gian) • Kỹ thuật: phương pháp dịch sử dụng cú pháp điều khiển (giống kiểm tra kiểu) • Chuyển cú pháp điều khiển thành IR • Mỗi cú pháp chuyển thành dạng IR có giá trị Sinh IR • Giống kiểm tra kiểu: thêm phương thức vào nút tương ứng cú pháp abstract class ASTNode { IRNode translate(SymTab A) { … } } • Cài đặt kiểu đệ quy • Vấn đề: giống kiểm tra kiểu, cần mơ tả xác cách viết hàm translate() Biểu thức • Các nút cú pháp thể biểu thức chuyển thành nút IR tương ứng + ADD e1 e2 [e1] [e2] • Kí hiệu [e] biểu diễn IR nút e cú pháp Câu lệnh • Dãy lệnh biểu diễn nút SEQ biểu diễn IR • Nếu [s1] [s2] biểu diễn IR nút s1 s2 • SEQ([s1], [s2]) biểu diễn IR s1; s2 s1; s2 SEQ [s1] [s2] Biến • Biến cục v chuyển thành nút TEMP(v) • Tham số thứ i nằm vị trí MEM(ADD(FP,4*i+4)) Stack arg n-1 v TEMP(v) … arg arg MEM return FP addr ADD SS FP CONST(4*i+4) Phép gán • Phép gán v = e chuyển thành nút MOVE(dest, [e]) với dest địa v, [e] biểu diễn IR e • Ví dụ MOVE x=2 MEM CONST(2) ADD FP CONST(8) Phép gán • Cách dịch e1 = e2 MOVE [e1] [e2] • Vấn đề: nút MOVE khơng có giá trị, làm để dịch x = (y = 2)? ESEQ MOVE e1 = e2 [e1] [e2] [e1] Phép gán • Như vậy, [e1] phải chạy lần, cần lưu lại giá trị [e1] ESEQ SEQ e1 = e2 MOVE TEMP(te) TEMP(te) MOVE [e2] [e1] TEMP(te) Thảo luận 27 ... Sinh mã assembly Tối ưu mã cmp ecx, cmovz edx,ecx Ngơn ngữ trung gian • Là ngơn ngữ cho loại máy trừu tượng • Cho phép sinh mã khơng phụ thuộc vào máy đích • Cho phép tối ưu mã trước sinh mã máy... bytecode AMD Ngơn ngữ trung gian • Dễ sinh từ cú pháp • Dễ sinh mã máy • Số lượng lệnh nhỏ, gọn – Dễ tối ưu mã – Dễ chuyển sang loại mã máy khác Cây cú pháp (>40 nút) Mã trung gian (13 nút) Pentium... lệnh) Ngơn ngữ trung gian • Một dạng thể chương trình nằm cú pháp điều khiển mã máy • Sử dụng – Lệnh nhảy – Thanh ghi – Vị trí nhớ Tối ưu mã Cây cú pháp Mã trung + gian thông tin điều khiển Pentium