Khác biệt giữa bản sửa đổi của “Chương trình con”

n
không có tóm lược sửa đổi
nKhông có tóm lược sửa đổi
nKhông có tóm lược sửa đổi
Trong [[khoa học máy tính]], một '''chương trình con''' (subprogram) hay '''subroutine''' là một đoạn [[chương trình máy tính|chương trình]] được đóng gói thành một đơn vị trình, nó thực hiện một số tác vụ cụ thể mà [[chương trình máy tính|chương trình]] cần thực hiện nhiều lần từ nhiều nơi trong thời gian chạy của nó. Khi [[chương trình máy tính|chương trình]] cần đến tác vụ cụ thể đó thì bố trí chỉ thị ''gọi'' (call) đến chương trình con này và nhận kết quả nếu có sau khi nó thực thi xong <ref>{{cite web |author= U.S. Election Assistance Commission |title= Definitions of Words with Special Meanings |work= [[Voluntary Voting System Guidelines]] |year= 2007 |url= http://www.eac.gov/vvsg/glossary.aspx |accessdate= 2013-01-14 |authorlink= Election Assistance Commission}}</ref>.
 
Ngay từ lúc [[máy tính]] ra đời thì kỹ thuật lập trình kiểu cấu trúc modul hóa với các chương trình con đã được thiết lập, và được củng cố trong các phần mềm lập trình [[hợp ngữ]]. Ngày nay trong ngôn ngữ bậc cao ''chương trình con'' được diễn đạt tùy theo ngôn ngữ là các '''hàm''' (''function''), '''thủ tục''' (''procedure'') và '''phương thức''' (''method''),... Một số [[ngôn ngữ lập trình]], chẳng hạn [[Pascal (ngôn ngữ lập trình)|Pascal]] và [[FORTRAN]], phân biệt giữa '''hàm''' (một chương trình con có trả về giá trị) và '''thủ tục''' (không trả về giá trị). Các ngôn ngữ khác, ví dụ [[C (ngôn ngữ lập trình)|C]] và [[LISP]], coi hai thuật ngữ này như nhau. Cái tên '''[[phương thức (khoa học máy tính)|phương thức]]''' thường được dùng trong [[lập trình hướng đối tượng]] để gọi các chương trình con là một phần của các [[đối tượng (khoa học máy tính)|đối tượng]].
 
Trong chương trình, một chương trình con được phép gọi chương trình con khác, hoặc có thể gọi chính nó. Tuy nhiên nếu bố trí gọi lẫn nhau, ví dụ ''subroutine A'' gọi ''subroutine B'' nhưng trong thân của ''subroutine B'' lại có gọi ''subroutine A'', sẽ dẫn đến lỗi bất định khi thực hiện. Một số ngôn ngữ có hỗ trợ phát hiện lỗi này trong môi trường soạn thảo trình và khi dịch. Dẫu vậy để tránh lỗi thì khi lập trình phải tuân thủ bố trí gọi theo "''mô hình cành và lá''", trong đó "cành" là subroutine có gọi subroutine khác, còn "lá" là subroutine không có lệnh gọi.
 
Do tầm quan trọng của việc tổ chức trình kiểu cấu trúc mà ngay từ khi công nghiệp máy tính ra đời, còn phải lập trình ở dạng [[mã máy]], giới chế tạo máy đã chăm chút nhiều đến lệnh ''call'' và tổ chức của chương trình con. Nếu giải mã ngược (unassemble) mã trình thì thấy dày đặc lệnh ''call''.
 
Bên cạnh các subroutine thực sự thì một số [[ngôn ngữ lập trình]], kể cả lập trình [[hợp ngữ]], hỗ trợ dạng chương trình con (trong văn bản trình) mà khi dịch thì thay thế bằng đoạn mã chương trình, không tạo ra subroutine dạng mã thật sự.
* '''[[Macro (máy tính)|Macro]]''': Dịch nội dung có trong macro có tên chỉ định và đặt vào vị trí tương ứng.
* '''Inline''': Chuyển nội dung mã được viết ở dạng hex trong procedure có tên chỉ định và đặt vào vị trí tương ứng.
== Nhược điểm ==
Nhược điểm chính của vận dụng chương trình con liên quan đến bố trí các mã chỉ thị "dọn nhà" (housekeeping code) ở chương trình con, làm cho thời gian thi hành tác vụ kéo dài hơn so với khi đoạn mã đó được đặt thẳng trong chương trình chính.
 
Khi chuyển điều khiển sang chương trình con, tại các điểm vào (entry) chương trình con phải bố trí sao lưu giá trị các con trỏ (pointer) của [[CPU|bộ xử lý]]. Khi kết thúc (exit) giá trị các con trỏ được khôi phục lại từ trị sao lưu rồi mới thoát. Những đoạn mã sao lưu và khôi phục này giống nhau ở các chương trình con, tức là nếu subroutine "không làm gì" thì khi dịch ra mã vẫn có đủ cặp đoạn mã này.
 
Tuy nhiên ngày nay các [[CPU|bộ xử lý]] có tốc độ rất cao nên tổn thất thời gian này không đáng kể.