【輸入】
根過程,及每個過程(含根過程)的指令序列
【輸出】
調用圖,由過程點集和調用邊(形如<p,i,q>,p在位置i調用q)集構成
【全局結構】
PVVs:過程值變量集合
PVVals:過程值變量到過程常數集合的映射
PVBinds:過程值變量到過程值變量集合的映射
PVCalls:調用邊的集合
【流程核心】
1. 分析過程p內指令,要處理調用指令和賦值指令兩種類型。對于調用指令,若被調過程q是過程常數,則將q和<p,i,q>加入調用圖,先解析q的過程值形參與傳入實參的關系,有4種情況
a)過程常數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傳出過程常數cp,將<fp,cp>加入PVVals,fp加入PVVs
若q不是常數而是過程值變量,則將q加入PVVs,<p,i,q>加入PVCalls。再解析q的返回與p的關系,有2種情況
e)返回一個過程值變量vp1賦給另一過程值變量vp2,將<vp2,vp1>加入PVBinds,vp2和vp1加入PVVs
f)返回一個過程常數cp賦給一個過程值變量vp,將<vp,cp>加入PVVals,vp加入PVVs
對于賦值指令,其實情況和上述返回賦值一樣
----------------------------------------------------------------
2. 遍歷PVVs,傳播各過程值變量的PVBinds,直至不再改變(迭代求不動解),本質是計算過程值變量的傳遞閉包
3. 遍歷PVCalls,對每個<p,i,q>,先遍歷它的每個PVVals u,將u和<p,i,u>加入調用圖;再遍歷它的每個PVBinds u及u的每個PVVals v,將v和<p,i,v>加入調用圖
----------------------------------------------------------------
以上三環節可使用工作表w來驅動,w初始只有根過程,不斷從w移出一個過程p、分析p,每當在環節1或環節3發現一個新過程(過程常數)就加入w,直至w為空,這時所有過程都已分析,調用圖構建完成
posted on 2023-09-06 23:04
春秋十二月 閱讀(76)
評論(0) 編輯 收藏 引用 所屬分類:
Compiler