【輸入】
根過程,及每個過程(含根過程)的指令序列
【輸出】
調(diào)用圖,由過程點集和調(diào)用邊(形如<p,i,q>,p在位置i調(diào)用q)集構成
【全局結構】
PVVs:過程值變量集合
PVVals:過程值變量到過程常數(shù)集合的映射
PVBinds:過程值變量到過程值變量集合的映射
PVCalls:調(diào)用邊的集合
【流程核心】
1. 分析過程p內(nèi)指令,要處理調(diào)用指令和賦值指令兩種類型。對于調(diào)用指令,若被調(diào)過程q是過程常數(shù),則將q和<p,i,q>加入調(diào)用圖,先解析q的過程值形參與傳入實參的關系,有4種情況
a)過程常數(shù)cp傳入過程值形參fp,將偶對<fp,cp>加入PVVals,fp加入PVVs
b)過程值變量vp傳入過程值形參fp,將<fp,vp>加入PVBinds,fp和vp加入PVVs
c)過程值形參fp傳出過程值變量vp,將<vp,fp>加入PVBinds,vp和fp加入PVVs
d)過程值形參fp傳出過程常數(shù)cp,將<fp,cp>加入PVVals,fp加入PVVs
若q不是常數(shù)而是過程值變量,則將q加入PVVs,<p,i,q>加入PVCalls。再解析q的返回與p的關系,有2種情況
e)返回一個過程值變量vp1賦給另一過程值變量vp2,將<vp2,vp1>加入PVBinds,vp2和vp1加入PVVs
f)返回一個過程常數(shù)cp賦給一個過程值變量vp,將<vp,cp>加入PVVals,vp加入PVVs
對于賦值指令,其實情況和上述返回賦值一樣
----------------------------------------------------------------
2. 遍歷PVVs,傳播各過程值變量的PVBinds,直至不再改變(迭代求不動解),本質(zhì)是計算過程值變量的傳遞閉包
3. 遍歷PVCalls,對每個<p,i,q>,先遍歷它的每個PVVals u,將u和<p,i,u>加入調(diào)用圖;再遍歷它的每個PVBinds u及u的每個PVVals v,將v和<p,i,v>加入調(diào)用圖
----------------------------------------------------------------
以上三環(huán)節(jié)可使用工作表w來驅(qū)動,w初始只有根過程,不斷從w移出一個過程p、分析p,每當在環(huán)節(jié)1或環(huán)節(jié)3發(fā)現(xiàn)一個新過程(過程常數(shù))就加入w,直至w為空,這時所有過程都已分析,調(diào)用圖構建完成