跳轉到內容

計算機程式設計/程式和函式

來自華夏公益教科書

不同的程式語言使用不同的術語來表示不同的含義。在不同語言中,相同的事物可能具有不同的名稱。程式、過程、函式、子程式、子程式、子查詢……這些詞都具有非常相似的含義。問題或差異在於它們是否可以獨立存在;

我們可以呼叫一個物件,它執行並執行一個複雜的流程。該物件是否被稱為上述列表中的任何一個,取決於它用哪種程式語言編寫,是否有人可以呼叫它,或者它是否必須由另一個程式或列表中的其他名稱呼叫。

子程式和函式

[編輯 | 編輯原始碼]

在一般的程式設計理論中,當使用程式的機構可以擁有包含數百萬個程式的庫,這些程式總共包含數十億行原始碼時,我們希望避免在多個地方重複相同的程式碼。假設需要更改某些內容。需要向集合新增一條新錯誤訊息。客戶編號剛剛從 6 位數字變為 8 位數字。有一個新的貨幣,例如歐元,需要處理。如果這些內容在每個處理它的程式中都被引用,我們可能需要更新數萬個程式來處理更改。但是,如果存在子程式來處理不同的場景,那麼當該場景發生變化時,唯一需要更新的是相關的子程式。同樣,當我們編寫一個新程式時,它需要的許多元素已經存在,例如訪問特定檔案以獲取特定型別的資料,計算庫存量。我們可以呼叫執行該功能的標準子程式,而不是編寫多行原始碼來執行該功能,並使該程式碼在數百萬個程式中複製。

在某些語言中,需要從呼叫程式傳遞引數到被呼叫程式。輔助程式會導致這些值被更改,然後將控制權返回到主程式。這種架構,即一個程式呼叫一個輔助程式為其完成專門的工作,實際上可以深入多個級別。互相呼叫的不同程式可以用多種不同的語言編寫。這樣做有兩個主要原因:將整體功能組織成邏輯上可管理的片段;不同的語言更適合不同型別的功能。

RPG 中的子程式和“子內容”

[編輯 | 編輯原始碼]

RPG 具有程式碼部分來處理活動,如檔案定義、定義表和陣列、輸入、輸出、與其他系統和程式的通訊、定義各種資料結構以及計算。計算部分具有一個主例程和任何數量的子程式,這些子程式可以從主例程和彼此之間呼叫。

在 RPG 中,如果一段原始碼具有定義的起點和終點,並且嵌入在主程式中,則稱為子程式。主程式中的某個點呼叫子程式。控制權轉到子程式的開頭,然後子程式一直控制,直到它到達終點或過早地遇到子程式主體中的退出語句為止。這是一個例子

Main calculations routine
RPG statement
RPG statement
RPG statement
EXSR $TOP
RPG statement
RPG statement
End of main routine

EXSR 命令表示執行子程式。子程式名稱可以包含字母、符號和數字,但不能以數字開頭。由於編譯包含所有在程式中使用的元素的交叉索引,因此習慣在某些型別函式的開頭使用特殊字元,以便它們都以交叉索引中的一致位置顯示,例如貨幣符號用於子程式,以及其他一些符號用於輸出到印表機。

在任何子程式的開頭,最好在註釋中放置一個摘要語句或解釋 $TOP 子程式的功能,例如處理要列印在報告頂部的內容。

Comments
BEGSR
RPG statement
RPG statement
RPG statement 
EXCPT @PAGE
EXCPT @TITLE
RPG statement
RPG statement
EXCPT @HEAD
RPG statement
RPG statement
ENDSR

BEGSR 是子程式開始語句,而 ENDSR 是子程式結束語句。EXCPT 是標識某種型別輸出到印表機或類似印表機檔案的語句。可以將資料寫入日誌或其他類似於列印輸出的物件,例如一系列行。

當控制權從該程式轉移到另一個程式時,該程式由該程式呼叫,然後該程式呼叫另一個程式為子程式。子程式包含其他型別的 RPG 內容,例如檔案定義、輸入輸出等。子程式不需要訪問任何檔案。它可以從呼叫程式填充的資料結構中獲取所有資料。

這些子程式和子程式僅僅是將程式組織成要執行的邏輯塊的一種方式。我們可以將它們視為黑盒,它們被輸入各種不同的標準資訊片段,只是將可預測的結果返回給主程式。因此,當程式需要維護時,我們可以有效地忽略與維護工作無關的程式部分。當我們維護的程式的總原始碼、主例程、子程式和子程式內容可能達到數十萬行程式碼時,這一點至關重要。

如果您比較 RPG 程式的實際原始碼列表及其在編譯時的內容,您可能會發現編譯中有很多內容在原始碼中沒有明確出現。這通常透過兩種方式之一實現。

如果使用標準外部描述的物件,例如檔案或資料結構,原始碼只需要用幾行程式碼指定該物件,即哪個物件以及在該程式中處理該物件所需的更改。在編譯時,檔案的整個佈局,例如表的所有列,都會被呼叫到要編譯的內容中。

另一種方法是,在使用標準子程式或呼叫標準子程式的程式碼時,這些程式碼要複製到數百萬個其他程式中,而不是將這些程式碼包含在數百萬個程式的原始碼中,而是有一行程式碼標識要包含在這裡的標準程式碼,以及如果在本程式中,是否要透過其他名稱引用其中的任何部分。

很少有其他語言可以嵌入到 RPG 原始碼中,例如 SQL/400。RPG 程式可以將控制權轉移到其他程式,RPG 將其稱為子程式。這些其他程式可以用任何語言編寫。根據語言的不同,這些程式需要編寫成期望被呼叫,並且與該握手相關的程式碼,以及呼叫程式可以使程式以某種方式執行變得不切實際,而不是以這種方式執行。

不同型別的錯誤訊息及其關聯的幫助連結可以根據問題的性質儲存在不同的庫中。使用該程式的人員可能呼叫了不存在的記錄,嘗試獲取超出範圍的值。一天中的最大小時數是 25 小時,這隻有在由於夏令時而更改日期的那一天才會出現。如果有人嘗試輸入某一天工廠發生的活動,而某位工廠工人的總時間超過 25 小時,這就是輸入超出範圍的一個例子。程式需要向用戶傳達問題是什麼。部分訊息處理可以使用一個子程式,該子程式只知道透過一些引用程式碼的錯誤訊息。實際上,當前錯誤訊息不會在處理錯誤訊息的子程式中明確引用,因此它可以處理任何不同的錯誤訊息。它唯一需要的引數是定義如何訪問特定錯誤訊息及其關聯的引用,例如使用者與之互動的方式。

華夏公益教科書