CƠ CHẾ GỌI CHƯƠNG TRÌNH CON

Một phần của tài liệu Giáo trình: Ngôn ngữ lập trình doc (Trang 113 - 117)

6.3.1 Ðịnh nghĩa và kích hoạt chương trình con

Người lập trình viết một định nghĩa chương trình con trong chương trình. Thông qua việc thực hiện chương trình, nếu chương trình con được gọi thì một kích hoạt chương trình con (subprogram activation) được tạo ra. Khi sự thực hiện chương trình con kết thúc thì kích hoạt bị phá huỷ. Nếu có một lần gọi khác thì một kích hoạt mới sẽ được tạo ra. Như vậy từ một định nghĩa chương trình con, có nhiều kích hoạt có thể được tạo trong quá trình thực hiện chương trình. Sự định nghĩa dùng làm khuôn mẫu (template) cho việc tạo kích hoạt trong quá trình thực hiện.

Chú ý rằng sự định nghĩa là một sự diễn tả trong chương trình như nó đã được viết ra và do đó nó được biết đến trong quá trình dịch. Kích hoạt chương trình con chỉ có thể có trong quá trình thực hiện. Trong quá trình thực hiện, sự định nghĩa chỉ tồn tại trong dạng khuôn mẫu mà từ đó các kích hoạt có thể được tạo ra.

6.3.2 Cài đặt định nghĩa và kích hoạt chương trình con Xét lại định nghĩa chương trình con trong Pascal: FUNCTION FN(x : REAL; y : INTEGER) : REAL;

CONST

max = 20; Ngôn ngữ lập trình Chương VI: Chương trình con 66 VAR m : ARRAY[1..max] OF REAL; n : INTEGER; BEGIN n := MAX; x := 2 * x + m[5]; ... END;

Sự định nghĩa này xác định các thành phần cần thiết cho một kích hoạt chương trình con:

1/ Bộ nhớ đối với các tham số, đối tượng dữ liệu x và y. 2/ Bộ nhớ cho kết quả hàm, đối tượng dữ liệu của kiểu REAL; 3/ Bộ nhớ cho biến cục bộ, mảng m và biến n.

4/ Bộ nhớ cho các hằng trực kiện và các hằng, 20, 2 và 5.

5/ Bộ nhớ cho mã có thể thực hiện phát sinh từ các lệnh trong thân chương trình con. Ðịnh nghĩa chương trình con cho phép các vùng nhớ này được tổ chức và các mã có thể thực hiện được xác định thông qua việc dịch. Kết quả của việc dịch là khuôn mẫu dùng để xây dựng mỗi một kích hoạt riêng tại thời gian chương trình con được gọi trong quá trình thực hiện.

Ðể xây dựng một kích hoạt chương trình con từ khuôn mẫu của nó, cái khuôn mẫu ban đầu có thể phải được sao chép vào trong vùng mới của bộ nhớ. Tuy nhiên thay vì sao

chép hoàn toàn, nó được tách ra thành hai phần:

1/ Phần tĩnh, gọi là đoạn mã (code segment) bao gồm các mục 4 (các hằng) và 5 (các mã có thể thực hiện được) đã nói ở trên. Phần tĩnh không thay đổi trong quá trình thực hiện chương trình con và do thế một bản sao có thể được dùng cho tất cả các kích hoạt. 2/ Phần động, gọi là mẩu tin kích hoạt (Activation record) bao gồm các mục 1 (Các tham số), 2 (Kết quả hàm) và 3 (dữ liệu cục bộ) và cộng thêm nhiều mục khác của dữ liệu ẩn như vùng nhớ tạm, điểm trở về, và sự tham khảo các biến không cục bộ. Phần động có cấu trúc giống nhau cho tất cả các kích hoạt nhưng nó chứa các giá trị dữ liệu khác nhau cho mỗi một kích họat. Do đó mỗi một kích hoạt cần thiết phải có một bản sao mẩu tin kích hoạt riêng của nó. Hình vẽ sau trình bày cấu trúc của một kích hoạt chương trình con của hàm FN nói trên Ngôn ngữ lập trình Chương VI: Chương trình con 67 Mở đầu Mã lệnh có thể thực hiện Khối mã có thể thực hiện Kết thúc Đoạn mã của FN 20 2 Các hằng 5 1

Ðiểm trở về

FN Kết quả của hàm x Các tham số

Mẩu tin kích họat của FN y m : : : Các biến cục bộ n

Ðối với mỗi chương trình con, một đoạn mã tồn tại thông qua sự thực hiện chương trình. Các mẩu tin kích hoạt được tạo ra và huỷ bỏ một cách động thông qua thực hiện mỗi lần chương trình con được gọi và mỗi lần nó kết thúc bởi RETURN.

Kích thước và cấu trúc của mẩu tin kích hoạt của chương trình con thông thường được xác định trong quá trình dịch, đó là trình biên dịch (compile) có thể xác định mẩu tin kích hoạt lớn như thế nào và vị trí của mỗi một phần tử trong đó. Ðể truy xuất đến các phần tử có thể sử dụng công thức tính địa chỉ cơ sở cộng độ dời như đã trình bày đối với mẩu tin bình thường.

Kích họat đầu tiên Kích họat thứ hai Kích họat cuối cùng Ðọan mã của FN Mẩu tin kích họat của FN Mẩu tin kích họat của FN Mẩu tin kích họat của FN

... Ngôn ngữ lập trình Chương VI: Chương trình con

68

Một phần của tài liệu Giáo trình: Ngôn ngữ lập trình doc (Trang 113 - 117)