1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 6: Kiểm tra kiểu

7 11 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 229,13 KB

Nội dung

Hai cách kiểm tra kiểu là kiểm tra tĩnh được thực hiện trong thời gian biên dịch chương trình nguồn và kiểm tra động được thực hiện trong thời gian thực thi chương trình đích. Trong chương này ta tập trung vào phần xử lý ngữ nghĩa bằng cách kiểm tra tĩnh mà cụ thể là kiểm tra kiểu. Phần đầu của chương trình bày các khái niệm về hệ thống kiểu, các biểu thức kiểu. Phần còn lại mô tả cách tạo ra một bộ kiểm tra kiểu đơn giản.

CHƯƠNG VI KIỂM TRA KIỂU Nội dung chính: Hai cách kiểm tra kiểu kiểm tra tĩnh thực thời gian biên dịch chương trình nguồn kiểm tra động thực thời gian thực thi chương trình đích Trong chương ta tập trung vào phần xử lý ngữ nghĩa cách kiểm tra tĩnh mà cụ thể kiểm tra kiểu Phần đầu chương trình bày khái niệm hệ thống kiểu, biểu thức kiểu Phần cịn lại mơ tả cách tạo kiểm tra kiểu đơn giản Mục tiêu cần đạt: Sau học xong chương này, sinh viên phải nắm được: • Hệ thống kiểu với biểu thức kiểu (kiểu sở kiểu có cấu trúc) thường gặp ngôn ngữ lập trình • Dịch trực tiếp cú pháp cài đặt kiểm tra kiểu đơn giản từ mở rộng để cài đặt cho ngôn ngữ phức tạp Kiến thức bản: Sinh viên phải biết số ngơn ngữ lập trình cấp cao Pascal, C++, Java, v.v học môn ngôn ngữ lập trình (phần đề cập đến kiểu sở kiểu có cấu trúc) Tài liệu tham khảo: [1] Compilers : Principles, Technique and Tools - Alfred V.Aho, Jeffrey D.Ullman - Addison - Wesley Publishing Company, 1986 [2] Modern Compiler Implementation in C - Andrew W Appel - Cambridge University Press, 1997 [3] Compiler Design – Reinhard Wilhelm, Dieter Maurer - Addison - Wesley Publishing Company, 1996 I HỆ THỐNG KIỂU Trong ngơn ngữ nói chung có kiểu sở kiểu có cấu trúc Chẳng hạn trang Pascal, kiểu sở là: boolean, char, integer, real, kiểu miền kiểu liệt kê Các kiểu có cấu trúc mảng, mẩu tin, tập hợp, Biểu thức kiểu Biểu thức kiểu bao gồm: Kiểu sở biểu thức kiểu: boolean, char, integer, real Ngồi cịn có kiểu sở đặc biệt như: kiểu type_error: lỗi trình kiểm tra kiểu; kiểu void, “khơng có giá trị”, cho phép kiểm tra kiểu lệnh 135 Vì biểu thức kiểu đặt tên, tên kiểu biểu thức kiểu Cấu trúc kiểu biểu thức kiểu, cấu trúc bao gồm: a Mảng (array): Nếu T biểu thức kiểu array(I, T) biểu thức kiểu Một mảng có tập số I phần tử có kiểu T b Tích (products): Nếu T1, T2 biểu thức kiểu tích Decas T1* T2 biểu thức kiểu c Mẩu tin (records): Là cấu trúc bao gồm tên trường, kiểu trường d Con trỏ (pointers): Nếu T biểu thức kiểu pointer(T) biểu thức kiểu T e Hàm (functions): Một cách toán học, hàm ánh xạ phần tử tập xác định (domain) lên tập giá trị (range) Một hàm biểu thức kiểu D Ỉ R Hệ thống kiểu Hệ thống kiểu sưu tập quy tắc để gán biểu thức kiểu vào phần chương trình Bộ kiểm tra kiểu cài đặt hệ thống kiểu Kiểm tra kiểu tĩnh động Kiểm tra thực chương trình dịch gọi kiểm kiểu tĩnh Kiểm tra thực chạy chương trình đích gọi kiểm tra kiểu động II ÐẶC TẢ MỘT BỘ KIỂM TRA KIỂU ÐƠN GIẢN Trong phần mô tả kiểm tra kiểu cho ngơn ngữ đơn giản kiểu danh biểu phải khai báo trước sử dụng Bộ kiểm tra kiểu lược đồ dịch mà tổng hợp kiểu biểu thức từ kiểu biểu thức Một ngơn ngữ đơn giản Văn phạm sau sinh chương trình, biểu diễn ký hiệu chưa kết thúc P chứa chuỗi khai báo D biểu thức đơn giản E PỈD;E D Ỉ D ; D | id : T T Ỉ char | integer | array[num] of T1 | ↑T1 E Ỉ literal | num | id | E1 mod E2 | E1 [E2] | E1↑ Hình 6.1 - Văn phạm ngơn ngữ đơn giản • Các kiểu sở: char, integer type-error • Mảng Chẳng hạn array[256] of char biểu thức kiểu (1 256, char) • Kiểu trỏ ↑T biểu thức kiểu pointer(T) Ta có lược đồ dịch để lưu trữ kiểu danh biểu PỈD;E 136 DỈD;D D Ỉ id : T {addtype(id.entry, T.type) } T Ỉ char {T.type := char } T Ỉ integer {T.type := integer } T Æ ↑T1 {T.type := pointer(T1.type) } T Æ array[num] of T1 {T.type := array(1 num.val, T1.type) } Hình 6.2- Lược đồ dịch lưu trữ kiểu danh biểu Kiểm tra kiểu biểu thức Lược đồ dịch cho kiểm tra kiểu biểu thức sau: E Ỉ literal {E.type := char } E Ỉ num {E.type := integer } E Ỉ id {E.type := lookup(id.entry) } E Æ E1 mod E2 {E.type := if E1.type = integer and E2.type = integer then integer else type_error } E Æ E1[E2] {E.type := if E2.type = integer and E1.type = array(s,t) then t else type_error } E Ỉ E1↑ { E.type := if E1.type = pointer(t) then t else type_error } Hình 6.3- Lược đồ dịch kiểm tra kiểu biểu thức Ở ta dùng hàm lookup(e) để tìm kiểu lưu trữ bảng ký hiệu mà trỏ e Kiểm tra kiểu lệnh Ta có lược đồ dịch cho kiểm tra kiểu lệnh S Ỉ id := E { S.type := if id.type = E.type then void else type_error } S Ỉ if E then S1 {S.type := if E.type = boolean then S1.type else type_error } S Ỉ while E S1 {S.type := if E.type = boolean then S1.type else type_error } S Ỉ S1 ; S2 {S.type := if S1.type = void and S2.type = void then void else type_error } Hình 6.4- Lược đồ dịch kiểm tra kiểu lệnh 137 Kiểm tra kiểu hàm Áp dụng hàm vào đối số cho luật sinh E → E (E) Lược đồ dịch cho kiểm tra kiểu cho áp dụng hàm là: E Ỉ E1 (E2) {E.type := if E2.type = s and E1.type = s -> t then t else type_error } Hình 6.5- Lược đồ dịch kiểm tra kiểu hàm Luật sinh biểu diễn biểu thức hình thành áp dụng E1 lên E2, kiểu E1 phải hàm s -> t từ kiểu s E2 tới kiểu giới hạn t đó; kiểu E1 (E2) t III SỰ TƯƠNG ÐƯƠNG CỦA CÁC BIỂU THỨC KIỂU Thơng thường kiểm tra kiểu có dạng: “nếu hai biểu thức kiểu trả kiểu ngược lại trả type_error” Ðiều quan trọng cần xác định hai biểu thức kiểu tương đương Tương đương cấu trúc Hai biểu thức kiểu gọi tương đương cấu trúc cấu trúc chúng giống hệt Ví dụ 6.1: - Biểu thức kiểu integer tương đương với integer chúng kiểu sở - pointer(integer) tương đương với pointer(integer) hai hình thành cách áp dụng cấu trúc trỏ pointer lên kiểu tương đương Giả sử, s t hai biểu thức kiểu, hàm sau kiểm tra xem chúng có tương đương hay không? Function sequiv(s, t) : boolean; Begin if s t kiểu sở then return true else if s = array(s1, s2) and t = array(t1, t2) then return sequiv(s1, t1) and sequiv(s2, t2) else if s = pointer(s1) and t = pointer(t1) then return sequiv(s1, t1) else if s = s1 -> s2 and t = t1 -> t2 then return sequiv(s1, t1) and sequiv(s2, t2) else return false; end; 138 Hình 6.6- Ðoạn ngôn ngữ giả kiểm tra tương đương cấu trúc hai biểu thức kiểu s t Tương đương tên Trong số ngôn ngữ, kiểu cho tên Ví dụ Pascal type link = ↑ cell; var next : link; last : link; p : ↑cell; q, r : ↑cell; Danh biểu link khai báo tên kiểu ↑cell Vấn đề đặt next, last, p, q, r có kiểu giống hay không? Câu trả lời phụ thuộc vào cài đặt Hai biểu thức kiểu tương đương tên tên chúng giống Theo quan niệm tương đương tên last next có kiểu; p, q r có kiểu next p có kiểu khác IV CHUYỂN ÐỔI KIỂU Xét biểu thức x + i x có kiểu real i có kiểu integer Vì biểu diễn số nguyên, số thực khác máy tính thị máy khác dùng cho số thực số ngun Trình biên dịch thực việc chuyển đổi kiểu để hai toán hạng có kiểu phép tốn cộng xảy Bộ kiểm tra kiểu trình biên dịch dùng để thêm phép toán biến đổi kiểu vào biểu diễn trung gian chương trình nguồn Chẳng hạn ký hiệu hậu tố x + i là: x i inttoreal real+ Trong đó: inttoreal đổi số nguyên i thành số thực, real+ thực phép cộng số thực Sự ép buộc chuyển đổi kiểu Sự chuyển đổi từ kiểu sang kiểu khác gọi ẩn (implicit) làm cách tự động chương trình dịch Chuyển đổi kiểu ẩn gọi ép buộc chuyển đổi kiểu (coercions) Ví dụ 6.2: Ðịnh nghĩa trực tiếp cú pháp cho kiểm tra kiểu ép buộc chuyển đổi kiểu biến đổi kiểu từ integer thành real: Luật sinh Luật ngữ nghĩa E Ỉ num E.type := integer E Ỉ num.num E.type := real E Ỉ id E.type := lookup(id.entry) E Æ E1 op E2 E.type := if E1.type = integer and E2.type = integer then integer else if E1.type = integer and E2.type = real 139 then real else if E1.type = real and E2.type = integer then real else if E1.type = real and E2.type = real then real else type_error Hình 6.7- Ðịnh nghĩa trực tiếp cú pháp cho kiểm tra kiểu ép buộc chuyển đổi kiểu Chý ý việc ép buộc chuyển đổi kiểu dẫn đến lãng phí thời gian thực chương trình Ví dụ 6.3: Với khai báo x mảng số thực lệnh for i:=1 to n x[i]:=1 thực 48,4 micro giây lệnh for i:=1 to n x[i]:=1.0 thực 5,4 micro giây Sở dĩ mã phát sinh cho lệnh thứ chứa lời gọi thủ tục đổi số nguyên thành số thực thời gian thực 140 BÀI TẬP CHƯƠNG VI 6.1 Viết biểu thức kiểu cho kiểu liệu sau đây: a) Một mảng trỏ có kích thước từ đến 100, trỏ đến đối tượng số thực b) Mảng chiều số nguyên, hàng có kích thước từ đến 9, cột có số từ -10 đến 10 c) Các hàm mà miền định nghĩa hàm với đối số nguyên, trị trỏ trỏ đến số nguyên miền xác định mẫu tin chứa số nguyên ký tự 6.2 Giả sử có khai báo C sau: typedef struct { CELL PCELL int a, b ; } CELL, * PCELL ; foo [ 100 ] ; bar (x, y) int x ; CELL y { } Viết biểu thức kiểu cho kiểu liệu foo bar 6.3 Cho văn phạm sau định nghĩa chuỗi chuỗi ký tự: P→ D→ T→ E→ L→ D; E D ; D | id : T list of T | char | integer ( L ) | literal | num | id E,L| E Hãy viết quy tắc biên dịch để xác định biểu thức kiểu (E) list (L) 6.4 Giả sử tên kiểu link cell định nghĩa phần tên cho biểu thức kiểu Hãy xác định biểu thức kiểu tương đương cấu trúc, biểu thức kiểu tương đương tên a) link b) pointer (cell) c) pointer (link) d) pointer (record ((info x integer) x ( next x pointer (cell))) 6.5 Giả sử kiểu định danh miền số nguyên Cho biểu thức với phép toán +, - , * , div mod Pascal, viết quy tắc kiểm tra kiểu để gán biểu thức vào vùng miền giá trị mă nằm 141 ... thức kiểu D Ỉ R Hệ thống kiểu Hệ thống kiểu sưu tập quy tắc để gán biểu thức kiểu vào phần chương trình Bộ kiểm tra kiểu cài đặt hệ thống kiểu Kiểm tra kiểu tĩnh động Kiểm tra thực chương trình. .. trình dịch gọi kiểm kiểu tĩnh Kiểm tra thực chạy chương trình đích gọi kiểm tra kiểu động II ÐẶC TẢ MỘT BỘ KIỂM TRA KIỂU ÐƠN GIẢN Trong phần mô tả kiểm tra kiểu cho ngơn ngữ đơn giản kiểu danh biểu... type_error } Hình 6. 3- Lược đồ dịch kiểm tra kiểu biểu thức Ở ta dùng hàm lookup(e) để tìm kiểu lưu trữ bảng ký hiệu mà trỏ e Kiểm tra kiểu lệnh Ta có lược đồ dịch cho kiểm tra kiểu lệnh S Ỉ id :=

Ngày đăng: 11/05/2021, 04:40

w