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
357,44 KB
Nội dung
Bài SINH MÃ TRUNG GIAN Hoàng Anh Việt Viện CNTT&TT - ĐHBKHN CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 ; a Phân tích ngữ nghĩa if = int int int lvalue CuuDuongThanCong.com Phân tích cú pháp a ; int https://fb.com/tailieudientucntt 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: CuuDuongThanCong.com Sinh mã assembly Tối ưu mã cmp ecx, cmovz edx,ecx https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com Java bytecode AMD https://fb.com/tailieudientucntt Ngơn ngữ trung gian • Dễ sinh từ cú pháp • Dễ sinh mã máy • Số lượng lệnh nhỏ, gọn Cây cú pháp (>40 nút) Mã trung gian (13 nút) – Dễ tối ưu mã – Dễ chuyển sang loại mã máy khác CuuDuongThanCong.com Pentium (>200 lệnh) https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com Pentium Java bytecod AMD https://fb.com/tailieudientucntt 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ã CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 toá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 CuuDuongThanCong.com https://fb.com/tailieudientucntt CONST • Nút CONST đại diện cho số CONST(i) • Giá trị nút i CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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,…) CuuDuongThanCong.com https://fb.com/tailieudientucntt NAME • Nút NAME đại diện cho địa tên nhớ • VD: địa nhãn nhảy NAME(n) CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com e https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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)MOVEJUMP TEMP(n) CONST(0) LT NAME(BODY)NAME(END) TEMP(n) CONST(10) LABEL(END) NAME(HEAD) TEMP(n) ADD TEMP(n) CONST(1) CuuDuongThanCong.com https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt 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ị CuuDuongThanCong.com https://fb.com/tailieudientucntt 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() CuuDuongThanCong.com https://fb.com/tailieudientucntt ... https://fb.com/tailieudientucntt 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... ưu mã trước sinh mã máy thật Pentium Cây cú pháp + thông tin điều khiển CuuDuongThanCong.com Java bytecode AMD https://fb.com/tailieudientucntt Ngôn ngữ trung gian • Dễ sinh từ cú pháp • Dễ sinh. .. CuuDuongThanCong.com Sinh mã assembly Tối ưu mã cmp ecx, cmovz edx,ecx https://fb.com/tailieudientucntt 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