原文:
關於as400呼叫 ***
rpgiv提供三種呼叫:
call (call a program)呼叫乙個程式,此呼叫又叫動態呼叫。
callp(call a protoyped procedure or program)呼叫原型過程或者原型子過程。可以使用動態呼叫或者是靜態呼叫。
callb(call a bound module)呼叫乙個繫結模組,此呼叫又叫靜態呼叫。
callp和callb,call的主要區別在於callp提供更好的引數型別檢查。它同時也提供更豐富的功能如使用值傳遞或者常量傳遞引數。
callp是用來代替callb和call的。當使用callp時,必須在d規範表中定義乙個過程原型。在原型宣告中,可以定義靜態或者動態繫結的呼叫連線。關鍵字extproc被用來指定靜態呼叫連線,而extpgm被用來指定動態呼叫連線,(預設是靜態繫結)。
建議在進行rpg iv程式設計時,全部使用callp方式以取代call或者callb呼叫方式。最大的好處:一是在於對程式的引數檢驗是在編譯時進行的,這樣許多引數型別、數量問題在編譯時就被檢查出來,實際呼叫的時候會減少呼叫程式引數出問題。二是可以使用靜態呼叫,提高執行效率。
在使用較複雜的過程呼叫可以巢狀在內建函式中使用,可以省略callp直接在程式中使用過程名返回值。
通過定義乙個相應的原型,可以容易地用callp去呼叫當前使用call或者callb呼叫方式的程式。只需檢查*entry plist中定義的變數的型別並定義乙個具有跟它對應型別的引數的原型。但是如果想傳遞變長的字元型或者陣列型引數就需要指定options(*varsize)選項;如果某些引數是可選的,需要指定*ptions(*omit)或者options(*nopass)選項。
一、程式內部callp子過程
1、過程原型定義: d 過程名 pr like(xx)
過程引數定義
2、呼叫過程: rc = 過程名(引數1 :引數2 ... )
3、過程內容: p 過程名 b (過程開始,並可被外部呼叫)
d 過程名 pi like(xx)
過程引數定義 (與上面引數定義一樣)
過程體p 過程名 e (過程結束)
4、pdm option 14
二、過程外部呼叫
1、外部過程書寫(模組一):
過程原型定義: d 過程名 pr like(xx)
過程引數定義
過程內容: p 過程名 b export (過程開始,並可被外部呼叫)
d 過程名 pi like(xx)
過程引數定義 (與上面引數定義一樣)
過程體p 過程名 e (過程結束)
2、編譯過程: pdm option 15 或者 crtrpgmod
3、呼叫過程: d 過程名 pr like(xx) (過程原型定義)
(模組二) 過程引數定義
rc = 過程名(引數1 :引數2 ... )
4、pdm option 15 或者 crtrpgmod
crtpgm pgm( 模組二) module( 模組二 模組一) actgrp( *caller )
(其中模組二是主模組,模組二呼叫模組一,生成的程式名與主模組相同)
三、呼叫繫結模組callb
1、被呼叫模組書寫(模組一):
過程原型定義: d 過程1 pr
d 過程2 pr
過程內容: p 過程1 b export
d 過程1 pi like(xx) (可省略)
過程引數定義 (可省略)
過程體
p 過程1 e
p 過程2 b export
d 過程2 pi like(xx) (可省略)
過程引數定義 (可省略)
過程體
p 過程2 e
2、編譯模組:pdm option 15 或者 crtrpgmod
3、呼叫模組書寫: *entry plist
parm 變數名
callb 『過程1』
parm 變數名
或者:callb 『模組一』
parm 變數名
4、編譯模組:pdm option 15 或者 crtrpgmod
5、生成程式:crtpgm 程式名 module( 模組一 模組二) actgrp( *caller)6、執行:call 程式名 ( '過程1' ) ...
四、callp的使用:
1、被呼叫模組書寫(模組一):
*entry plist
parm 變數名
模組體2、編譯模組:pdm option 15 或者 crtrpgmod,生成模組一。
3、呼叫模組書寫(模組二):
變數定義
原型定義: d 模組名 pr extproc('模組一')
引數定義 (此引數定義與上面變數定義一致,可用like)
呼叫: callp 模組名(引數1 : 引數2 ...)
4、編譯模組:pdm option 15 或者 crtrpgmod,生成模組二。或者pdm option 14
5、生成程式:crtpgm 程式名 lib(模組二 模組一)(模組二為主模組,程式名可與模組二同名)
說一下三者的區別:
在cl中呼叫程式可以使用call,callb和callp三種方式。
call 呼叫opm的老式rpg程式,採用動態記憶體呼叫方式
callb 呼叫module中的pep(primary entry procedure),此procedure不需事先宣告
callp 呼叫module中的procedure,此procedure必須在本程式的d specification事先宣告,又稱原形呼叫方式,和callb有相似的記憶體呼叫方式,但在呼叫之前會對呼叫引數進行預先檢查。
目前ile rpg中推薦使用callp呼叫內部,外部的procedure.
對程式和過程的呼叫
ile程式中既可以呼叫程式也可以呼叫過程。ile語言通過呼叫語句call和callp或callb來標識呼叫的目標是程式還是過程。
1.動態程式呼叫
a.opm程式可以呼叫乙個opm程式或ile程式
b.ile程式可以呼叫乙個opm程式或另乙個ile程式
c.服務程式可以呼叫opm程式或ile程式
2.靜態過程呼叫
a.在同一模組內的物件
b.在同乙個ile程式或服務程式內的乙個單獨模組中的過程
c.在乙個單獨的ile服務程式中的過程
call, callb, callp的區別:
call只能呼叫*pgm, 是動態呼叫,程式執行效率低。callb和callp都只能呼叫procedure(懷疑一下!),大部分時候是靜態呼叫,只有呼叫指標變數中所指的procedure時才是動態呼叫;但是callb不參加介面合法性檢查,即:不需要原型說明,因此在執行時可能會導致一些錯誤。call 和callb都只能使用固定格式的實參傳遞,即:使用plist。
rpg iv中的全域性變數與區域性變數:
每乙個opm程式都只有乙個唯一的程式入口,但是在ile程式中每乙個procedure都可以有乙個入口。在opm程式中每乙個內部子程式的變數都是全域性變數,但是在ile程式的procedure中宣告的所有變數都是區域性變數,其餘所有用到的變數都是全域性變數。如果在procedure中宣告的變數和某一全域性變數同名的話,那麼這兩個變數將在記憶體中使用不同的兩個空間,也就是說這兩個變數將互不影響,同名的那個全域性變數將不被此procedure 使用。區域性變數也將在此procedure執行完成後被全部釋放。
spark調優 shuffle調優
基於spark1.6 引數可以通過 new sparkcontext set 來設定,也可以通過命令的引數設定 conf spark.shuffle.file.buffer 預設值 32k 引數說明 該引數用於設定shuffle write task的bufferedoutputstream的buf...
Spark Spark調優 資源調優
spark在乙個executor的記憶體分為三塊,1.一塊是execution記憶體 2.一塊是storge 記憶體 3.一塊是其他記憶體 執行記憶體是執行記憶體,加入,聚合都是在這部分記憶體中執行.shuffle的資料也會先快取在這個記憶體中,滿了再寫入磁碟,能減少io,其實地圖過程也是在這個記憶...
尾調遞迴 ,尾調優化
尾調優化 title head body p pre 尾調優化,值得是函式最後一步呼叫了另乙個函式,函式呼叫會在內部形成乙個 呼叫記錄 儲存呼叫位置,內部變數等,a函式呼叫b函式,形成乙個 a到b的呼叫幀,直到結果返回,幀消失,b呼叫c函式,這樣,就形成了 呼叫棧,pre p h4 pre 尾調,不...