IEFBR14

IEFBR14是IBM大型計算機的應用程式。運行於的所有後繼作業系統中，包括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：

```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
```

創建一個分區數據集：

```jcl
//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.