Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 5: Thực hiện chương trình con - Nguyễn Văn Hòa
Tóm tắt Bài giảng Nguyên lý ngôn ngữ lập trình - Chương 5: Thực hiện chương trình con - Nguyễn Văn Hòa: ...de ủể cấp phỏt và giải phúng một cỏch tường minh cho cỏc tham số cục bộ Phải hỗ trợ ủệ qui “recursion” (tạo ủồng thời nhiều thể hiện bản hoạt ủộng của một chương trỡnh con) ðệ qui yờu cầu nhiều thể hiện của bản hoạt ủộng, mỗi thể hiện của bản hoạt ủộng tương ứng với 1 một lần gọi ủệ qu...iờn dịch ngay thời ủiểm dịch hoặc thời ủiểm thực thi 17 Vớ dụ với ủệ qui int factorial (int n) { <-----------------------------1 if (n <= 1) return 1; else return (n * factorial(n - 1)); <-----------------------------2 } void main() { int value; value = factorial(3); <-----... ủều phải kết nối với thể hiện bản hoạt ủộng của CTC tổ tiờn (ancestors) Phạm vi tĩnh 24 VD chương trỡnh Pascal program MAIN_2; var X : integer; procedure BIGSUB; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; <-----------------------1 end; { S...
1Chương 5: Thực hiện chương trỡnh con Giảng viờn: Ph.D Nguyễn Văn Hũa Khoa KT-CN-MT – ðH An Giang 2ðịnh nghĩa Trong NNLT, tỏc vụ gọi “call” và trả về (return) của chương trỡnh con ủược gọi chung là liờn kết chương trỡnh con “subprogram linkage” 3Nội dung chớnh của chương Giới thiệu chung về ngữ nghĩa của Call và Return Thực hiện chương trỡnh con ủơn giản Thực hiện chương trỡnh con với biến cục bộ ủộng Stack Chương trỡnh con lũng nhau (nested Subprograms) Khối (Blocks) Cài ủặt phạm vi ủộng 4Ngữ nghĩa của việc gọi (call) và trả về (return) Một số tỏc vụ cần thiết cho việc gọi chương trỡnh con Cơ chế truyền cỏc tham số (truyền tham trị, truyền quy chiếu, truyền kết quả, ...) Cỏc biến cục bộ là static hay not static Lưu lại trạng thỏi hiện hành (execution status) của chương trỡnh gọi CTC Chuyển quyền ủiều khiển cho CTC Cung cấp cỏc truy xuất ủến cỏc biến khụng cục bộ 5Thực hiện CTC ủơn giản: Call Chương trỡnh con ủơn giản “simple” Khụng lũng nhau và cỏc biến là tĩnh (static) Cỏc tỏc vụ cú cần thiết Lưu hiện trạng thực thị của chương trỡnh gọi “caller” Thực hiện tiến trỡnh truyền tham số Chuyển ủịa chỉ trả về cho chương trỡnh con “callee” Chuyển quyền ủiều khiển cho chương trỡnh con “callee” 6Thực hiện CTC ủơn giản: Return Nếu sử dụng truyền trị-kết quả, thỡ di chuyển giỏ trị hiện hành của cỏc tham số hỡnh thức ủến từng tham số thực tương ứng Nếu là hàm, di chuyển giỏ trị của hàm ủến vị trớ mà caller cú thể lấy ủược Phục hồi lại trạng thỏi thực thi của caller Trả quyền ủiều khiển lại cho caller 7 Cú 2 phần phõn biệt: phần code thực và phần noncode (biến cục bộ và dữ liệu cú thể bị thay ủổi) ðịnh dạng, hoặc layout, của phần noncode của một chương trỡnh thực thi con ủược gọi là bản hoạt ủộng (activation) Một thể hiện (instance) bản hoạt ủộng là mẫu cụ thể của bản hoạt ủộng (bao gồm dữ liệu hoạt ủộng của chương trỡnh con) Thực hiện CTC ủơn giản: Parts 8Bản hoạt ủộng của chương trỡnh con ủơn giản 9Code và bản hoạt ủộng của chương trỡnh với chương trỡnh con ủơn giản 10 Cài ủặt CTC với biến cục bộ ủộng Stack Bản hoạt ủộng phức tạp Trỡnh biờn dịch phải sinh code ủể cấp phỏt và giải phúng một cỏch tường minh cho cỏc tham số cục bộ Phải hỗ trợ ủệ qui “recursion” (tạo ủồng thời nhiều thể hiện bản hoạt ủộng của một chương trỡnh con) ðệ qui yờu cầu nhiều thể hiện của bản hoạt ủộng, mỗi thể hiện của bản hoạt ủộng tương ứng với 1 một lần gọi ủệ qui Mỗi thể hiện cầu 1 bản copy cỏc tham số hỡnh thức, cỏc biến cục bộ cấp phỏt ủộng và ủịa chỉ trả về 11 Bản hoạt ủộng của NN với biến cục bộ ủộng Stack 12 Cài ủặt CTC với biến cục bộ ủộng Stack : Bản hoạt ủộng ðịnh dạng của bản hoạt ủộng là tĩnh, nhưng kớch thước của nú cú thể ủộng Liờn kết ủộng (dynamic link) trỏ ủến ủỉnh của bản hoạt ủộng của caller Bản hoạt ủộng ủược xỏc ủịnh ra một cỏch ủộng khi gọi chương trỡnh con Run-time stack 13 Vớ dụ: Hàm C void sub(float total, int part) { int list[5]; float sum; } 14 Vớ dụ khụng ủệ qui void fun1(int x) { int y; ... 2 fun3(y); } void fun2(float r) { int s, t; ... 1 fun1(s); } void fun3(int q) { ... 3 } void main() { float p; ... fun2(p); } Hàm main gọi fun2 Hàm fun2 gọi fun1 Hàm fun1 gọi fun3 15 Vớ dụ khụng ủệ qui 16 Dynamic Chain và Local Offset Tập hợp cỏc dynamic links trong stack tại một thời ủiểm nào ủú ủược gọi là dynamic chain, hoặc call chain Cỏc biến cục bộ cú thể ủược truy xuất thụng qua cỏc offset của nú trong bản hoạt ủộng. Offset này ủược gọi là local_offset Local_offset của một biến cục bộ cú thể ủược xỏc ủịnh bởi trỡnh biờn dịch ngay thời ủiểm dịch hoặc thời ủiểm thực thi 17 Vớ dụ với ủệ qui int factorial (int n) { <-----------------------------1 if (n <= 1) return 1; else return (n * factorial(n - 1)); <-----------------------------2 } void main() { int value; value = factorial(3); <-----------------------------3 } 18 Bản hoạt ủộng của factorial 19 20 21 Chương trỡnh con lũng nhau Vài NNLT với phạm vi tĩnh (e.g., Fortran 95, Ada, JavaScript) dựng cỏc biến cục bộ ủộng stack và cho phộp cỏc chương trỡnh con lũng vào nhau Cỏc biến bờn trong cỏc bản hoạt ủộng trong stack cú thể ủược truy xuất một cỏch khụng cục bộ Hai bước ủể tham chiếu cỏc biến khụng cục bộ: Tỡm kiếm thể hiện bản hoạt ủộng tương ứng Xỏc ủịnh offset của biến trong thể hiện ủú 22 ðịnh vị cỏc tham chiếu khụng cục bộ Tỡm Offset: khỏ dễ dàng Tỡm thể hiện bản hoạt ủộng tương ứng ðể ủảm bảo cú thể tham chiếu ủến cỏc biến khụng cục bộ thỡ cỏc biến này phải ủược cấp phỏt trong cỏc thể hiện bản hoạt ủộng trong stack 23 Static chain là tập hợp cỏc static links liờn kết một vài bản hoạt ủộng trong stack Static chain là cỏch cài ủặt phổ biến trong cỏc NNLT hỗ trợ CTC lũng nhau Liờn kết tĩnh (static link) trong một thể hiện bản hoạt ủộng nào ủú của 1 CTC là 1 pointer trỏ ủến phần dưới cựng của thể hiện bản hoạt ủộng cha, liờn kết này dựng ủể truy xuất cỏc biến khụng cục bộ Chuỗi tĩnh (static chain) của một thể hiện bản hoạt ủộng nào ủú ủều phải kết nối với thể hiện bản hoạt ủộng của CTC tổ tiờn (ancestors) Phạm vi tĩnh 24 VD chương trỡnh Pascal program MAIN_2; var X : integer; procedure BIGSUB; var A, B, C : integer; procedure SUB1; var A, D : integer; begin { SUB1 } A := B + C; <-----------------------1 end; { SUB1 } procedure SUB2(X : integer); var B, E : integer; procedure SUB3; var C, E : integer; begin { SUB3 } SUB1; E := B + A: <--------------------2 end; { SUB3 } begin { SUB2 } SUB3; A := D + E; <-----------------------3 end; { SUB2 } begin { BIGSUB } SUB2(7); end; { BIGSUB } begin BIGSUB; end; { MAIN_2 } 25 Stack ở vi trớ 1 Thứ tự gọi cỏc hàm như sau: MAIN_2 calls BIGSUB BIGSUB calls SUB2 SUB2 calls SUB3 SUB3 calls SUB1 26 Khối là vựng hay phạm vi hoạt ủộng cỏc biến do người dựng chỉ ủịnh VD chương trỡnh C {int temp; temp = list [upper]; list [upper] = list [lower]; list [lower] = temp } Thời gian tồn tại của temp trong VD trờn bắt ủầu ngay khi chương trỡnh bắt ủầu tiến vào khối Ưu ủiểm của việc dựng biến cục bộ như temp là biến temps khụng trở ngại nào nếu như cú 1 biến khỏc cựng tờn Khối (blocks) 27 Cài ủặt khối Cú hai cỏch: Khối ủược xem như là cỏc tham số của chương trỡnh con mà nú ủược gọi tại ngay vị trớ của nú – Mỗi khối cú 1 thể hiện bản hoạt ủộng, nú ủược tạo ra ngay thời ủiểm khối ủược thực thi Vỡ kớch thước lưu trữ cho 1 khối cú thể xỏc ủịnh trong suốt thời gian thực hiện khối, kớch thước này cú thể ủược cấp phỏt sau cỏc biến cục bộ trong bản hoạt ủộng 28 29 Cài ủặt phạm vi ủộng Truy xuất sõu (deep access): Cỏc tham chiếu khụng cục bộ cú thể ủược tỡm thấy trong cỏc bản hoạt ủộng hiện hữu trong cỏc liờn kết ủộng (dynamic chain) Truy xuất cạn (shallow access): tập trung cỏc biến cục bộ vào một nơi Mỗi biến cú 1 stack Central table xỏc ủịnh cỏc biến và chương trỡnh con 30 VD chương trỡnh void sub3(){ int x,z; x=u+z; } void sub2(){ int w,x; } void sub1(){ int v,w; } void main(){ int v,u; } 31 Minh họa Deep access main gọi sub2 sub2 gọi sub1 sub1 gọi sub2 sub2 gọi sub3 32 Minh họa Shallow Access main gọi sub1 (A) sub1 gọi sub1 sub1 gọi sub2 (B) sub2 gọi sub3 (C)
File đính kèm:
- bai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_5_thuc_hien_ch.pdf