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

Chươ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  
1
ðꢂ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”  
2
Nꢃ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  
3
Ngꢅ 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ꢌ  
4
Thꢀ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”  
5
Thꢀ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  
6
Thꢀc hiꢁn CTC ñơn giꢇn: Parts  
ꢀ 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)  
7
Bꢇn hoꢉt ñꢃng cꢄa chương trình  
con ñơn giꢇn  
8
Code và bꢇn hoꢉt  
ñꢃng cꢄa chương  
trình vꢊi chương  
trình con ñơn giꢇn  
9
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ꢄ  
10  
Bꢇn hoꢉt ñꢃng cꢄa NN vꢊi biꢌn cꢍc  
bꢃ ñꢃng Stack  
11  
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  
12  
Ví dꢍ: Hàm C  
void sub(float total, int part)  
{
int list[5];  
float sum;  
…
}
13  
Ví dꢍ không ñꢁ qui  
void fun1(int x) {  
int y;  
...  
ꢂ 2  
fun3(y);  
}
void fun2(float r) {  
int s, t;  
...  
ꢂ 1  
fun1(s);  
Hàm main gꢆi fun2  
Hàm fun2 gꢆi fun1  
}
void fun3(int q) {  
... ꢂ 3  
Hàm fun1 gꢆi fun3  
}
void main() {  
float p;  
...  
fun2(p);  
}
14  
Ví dꢍ không ñꢁ qui  
15  
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  
16  
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  
}
17  
Bꢇn hoꢉt ñꢃng cꢄa factorial  
18  
19  
Tải về để xem bản đầy đủ
pdf 32 trang myanh 13100 Free
Bạn đang xem 20 trang mẫu của tài liệu "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ải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_nguyen_ly_ngon_ngu_lap_trinh_chuong_5_thuc_hien_ch.pdf