Slide trình biên dịch chương 6 sinh mã trung gian

27 7 0
Slide trình biên dịch chương 6 sinh mã trung gian

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 29/07/2021, 08:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan