IEFBR14

IEFBR14是IBM大型計算機的應用程序。運行於OS/360的所有後繼操作系統中，包括z/OS等。該程序是一個僅會返回返回碼0的佔位程序，類似於類Unix系統中的true命令。

**作用**

**分配文件空間（也稱為初始化）**
在OS/360及其派生的大型機操作系統中，大多數程序並不會直接指定文件（通常稱為數據集），而是在調用程序的作業控制語言（JCL）語句中間接地引用它們。這些數據定義（或“DD”）語句中可以包括一個“DISPOSITION”（DISP =…）參數，以表明該文件應該被怎樣管理——是要創建一個新文件或重用一箇舊的文件；以及文件在使用完畢後是應該刪除還是保留等等。
儘管DD語句可以很方便地用來創建或者刪除文件，但此操作的前提是必須要運行一個程序。因為作業管理系統的特性，它要求作業的發起人必須執行一個程序，哪怕這個程序只是執行一條空指令。這個條件促生了IEFBR14的產生。在JCL中所運行的程序並不一定要通過使用這個文件，來達到創建或刪除文件的目的，因為DD DISP=...聲明完成了這一系列工作。因此，就需要一個簡單的，什麼都不做的程序，來填補被執行程序的這個角色。因此IEFBR14可以用於通過JCL來創建或刪除一個數據集。

**回收（也稱為終止）**
另一個需要IEFBR14的原因是，由於作業的JCL出現錯誤，或者作業以錯誤的狀態結束，導致某些設備（例如磁帶或磁盤設備）在上一個作業結束後，仍然保留了被掛載的狀態。在這種情況下，系統操作員經常需要卸載這些設備。有一個名為DEALLOC的started task往往是為此目的而提供的。
只需要在系統控制檯中輸入命令：
S DEALLOC
就可以運行這個任務。然而，由於作業管理的設計，DEALLOC必須實際存在於系統的程序庫SYS1.PROCLIB中，以免啟動命令失敗。
同時，所有這類started task必須是單個作業步。作業管理系統的“started task 控制器”（STC）模塊僅接受只有一個作業步的作業，而當它遇到一個多步的作業時，它就會執行失敗，並且不會拋出任何異常。
// STEP01 EXEC PGM=IEFBR14

**解析和驗證**
至少在z/OS上，分支執行另一個程序會導致調用程序被評估為語法錯誤。

**命名**
“IEF”的名稱來源於如下命名規則，即由IBM提供的程序，都會按照其功能或者創作者而分類，每組程序共享一個三個字符組成的前綴。在OS/360中，第一個字母是幾乎總是“I”。同時，由作業管理模塊（包括IEFBR14）所產生的程序，都使用“IEF”這個前綴。其他常見的前綴包括數據集實用程序的“IEB”，系統實用程序的“IEH”，和程序鏈接和加載的“IEW”。其他主要組件則使用“IEA”作為操作系統主管程序的前綴，以及“IEC”作為輸入/輸出主管程序的前綴。
如下解釋，“BR 14”是程序的基本功能，就是簡單地返回到操作系統。這部分程序的名字往往是能輔助記憶的——例如，IEBUPDTE數據集實用程序的程序名中，IEB的含義為數據集實用程序，用來更新(UPDTE)源代碼文件，以及IEHINITT系統實用程序的名稱中，IEH代表這是一個系統工具，用來初始化(INIT)磁帶的標籤(T)。
就如下面“使用”部分所解釋的，名字中的“BR14”來自於IBM彙編語言的分支指令，含義為“分支到寄存器14（所存儲的地址）”，按照慣例，該操作的含義為“從子程序中返回”。很多OS/360的早期用戶都很熟悉IBM彙編語言，所以他們可以馬上意識到這個含義。

**使用**
示例JCL：
//IEFBR14  JOB  ACCT,'DELETE DATASET',MSGCLASS=J,CLASS=A
//STEP0001 EXEC PGM=IEFBR14                       
//DELDD    DD DSN=xxxxx.yyyyy.zzzzz,
//            DISP=(MOD,DELETE,DELETE),UNIT=DASD
創建一個分區數據集：
//TZZZ84R  JOB NOTIFY=&SYSUID,MSGCLASS=X                    
//STEP01    EXEC PGM=IEFBR14                                 
//DD1       DD DSN=TKOL084.DEMO,DISP=(NEW,CATLG,DELETE),           
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=80,DSORG=PO),  
//             SPACE=(TRK,(1,1,1),RLSE),                       
//             UNIT=SYSDA

**實現**
IEFBR14最初只是由一個“分支到寄存器14”指令組成。該指令在IBM彙編語言中使用的助記符是BR,因此得名：IEF BR 14。BR 14相當於BCR 15, 14。BR是指令BCR 15的偽指令。系統彙編程序接受很多這樣子的偽指令，其邏輯上等同於原來的System/360指令。BR 14的典型實例是BCR 15, 14。
OS/360及其後續系統的連接規範規定，當程序被調用的時候，寄存器14保存程序結束後控制權應交回到的地址，寄存器15保存被調用程序在內存中的地址；在結束時，程序從寄存器15中讀取返回值，然後分支到寄存器14所指向的地址。但是在編寫初期，IEFBR14的這些特性並未被留意，因為其最初只是用作一個無用的控制段，以返回到調用者，而不是作為一個可執行的模塊。
最初版本的IEFBR14並沒有修改寄存器15的值，因為其原型程序只是在Sysgen（系統生成）時期生成的一個程序中的一個佔位符，並不是一個可執行的程序。IEFBR14曾經只會被一個等同於BALR 14,15的功能調用，所以在寄存器15中的返回值總不為0。隨後加入了一個用來清除返回碼的指令，這樣就可以使其返回一個指定好的返回碼——0。早期的程序員並沒有使用所有的JCL參數，所以在當時，返回一個不確定的返回碼並非什麼問題。然而，隨著程序員們使用的參數越來越多，返回一個確定的返回碼這一問題就變得重要了起來。這一改版的IEFBR14也並沒有影響到其最初充當佔位符的作用。
修改過的程序的機器碼如下：
SR    R15,R15  put zero completion code into register 15
BR    R14      branch to the address in register 14 (which is actually an SVC 3 instruction in the Communications Vector Table)
簡明起見，將BR指令排除，機器碼如下：
SR    R15,R15  put zero completion code into register 15
SVC   3        issue EXIT SVC to terminate the jobstep
這麼做很有道理，因為OS/360的Initiator在執行初期會使用ATTACH宏指令（SVC 42）來將作業步“連接”起來，而“解除連接”的指令（一個Type 2 SVC指令）必須是一個輔助性指令，即EXIT宏（它必定是一個Type 1 SVC指令 SVC 3）。

**參閱**
 /bin/true——UNIX系統中同等的“什麼也不做”的程序

**參考文獻**

**腳註**

**其他**
Trombetta, Michael & Finkelstein Sue Carolyn (1985). "OS JCL and utilities". Addison Wesley. page 152.