Bài giảng Nhập môn chương trình dịch: Chương 6 - Hoàng Anh Việt

27 4 0
Bài giảng Nhập môn chương trình dịch: Chương 6 - Hoàng Anh Việt

Đ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 giảng Nhập môn chương trình dịch - Chương 6: Sinh mã trung gian giới thiệu tới sinh viên các kiến thức: Ngôn ngữ trung gian, một số ngôn ngữ trung gian, mô tả các nút biểu thức của IR, toán tử, mô tả các nút lệnh của IR, cây sinh IR,... Đây là một tài liệu hữu ích dành cho các bạn sinh viên công nghệ thông tin dùn làm tài liệu học tập và nghiên cứu.

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)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) 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 ... (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... 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... • 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

Ngày đăng: 10/05/2021, 13:36

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

Tài liệu liên quan