概述
許多現代語言,如PL/I和ALGOL,允許使用分程式和分程式結構。分程式結構是定義變數作用域的一種方法,它使用戶能把同樣的標識符用於不同目的。分程式是可以嵌套的,就象FORTRAN的DO語句或MAD的THROUGH語句一樣,分程式規定了標識符定義的作用域。
分程式提供兩種重要的邏輯功能:
(1)定義數據變數和別類名字的套用範圍。從而同名量在不同的分程式中可使用於不同的目的而不致混淆。
(2)僅當執行分程式時允許給數據變數分配存貯而在分程式結束時釋放存貯以作他用。
某些分程式叫作“過程”分程式,可以在程式中遠離它的不同地點引用它(即調來執行),它提供處理變元和代回值的方法。
對於分程式結構,編譯程式必須處理兩個問題:
(1)可以用同名標識符引用具有不同說明和表征的幾個完全不同的變數,只要它們是在不同的分程式中說明過的。編譯程式必須確定給定的標識符引用哪一個變數。
(2)與分程式結構有關的第二個問題是當進入某一分程式時,必須分配在此分程式中定義的自動存貯,而當退出此分程式時,則必須釋放之。分程式結構並未因靜態或受控存貯而帶來較多的額外存貯分配問題。
分程式結構的主要用途之一是同動態數組一起配合使用
分程式結構的存取信息
我們首先略述與變數定位有關的問題和可行的解決辦法,這種變數是由給定的一個標識符來引用的。當編譯程式的詞法分析階段發現一個標識符時,就必須將一個標準符號傳遞到編譯程式的各後繼階段。該標準符號指向標識符表中的一個表目,它究竟指向哪一個表目呢?標識符表中可能有兩個表目都與某一同名標識符有關。例如,如右圖所示,在分程式Bl,B2和B3中,均定義了標識符Y。在B1中標識符Y表示二進制整數;在B2中表示字元行,而在B3中是字位行。詞法階段不能把一個標準符號傳送給不同的Y,因為它對說明和分程式毫無所知。因此,整個詞法分析階段能做的工作是把變數登記到名表中。一個可行的實現方法應該是由編譯程式的解釋階段為每個分程式中已說明的變數在標識符表中創立新的表目。解釋階段還必須把定義標識符的分程式和標識符本身聯繫起來。因此,當引用變數時,解釋階段搜尋標識符表尋找在本分程式中或最靠近的外分程式中定義過的標識符,而後用適當的標準符號代替之。利用我們的模型,我們可簡單地描述一個實現這一特性的方法,最好把標識符表分威命名標識符和定義標識符兩部分。詞法階段在名表中創立表目.當解釋階段遇到某一分程式的說明語句時,它就在標識符表中創立一些表目。藉助每個表目在表中建立一個指向該標識符名的指針。它又置入一個指示符號,以指出此標識符是在哪個分程式中定義的,它還要對下述標識符表目置入一個索引;在另一分程式中重定義受個相同的變數。這樣,當引用某一分程式內的變數時,解釋簡單就要用一個標準符號取代它。解釋程式通過搜尋標識符表找出凡出現這變數的地方來發現標識符表中的正確表目,使用定義分程式的信息和對下一定義的索引來確定正確的標準符號。還有不同說明語句來說明某些語言成分的情況,例如,語句標點常數。L:/*is a declaration of a label (是標點符號)*/然而,此說明不一定在使用標號或引用標號之前出現。詞法階段把標號計入名表。若語法分析階段指出,在標號出現時,當前的分程式無表目,我們必須在標識符表中強行填入一個新表目。若有一個屬於當前這個分程式的表目,但沒有被定義,那么我們就把它定義為標號。若有一個定義過的當前這個分程式的表目,那么就是一個錯誤,因為我們有一個多重定義的標號。對於已在某一分程式內定義過的一個變數能引用是通過指向標識符表中那個元素的標準符號來描述的。如果允許有分程式結構,那么我們可以把說明該標識符的分程式編號與矩陣表目聯繫起來。對這裡所述的設計,為了處理某個引用,代碼生成階段應該轉向標識符表中的一個表目。該表目則指向定義該變數的第一個分程式(這個或那個),並指出這個矩陣表目出現在哪一個分程式中,而後代碼生成階段就可找到所要訪問的適當標識符。
分結構程式的存貯管理
對於分程式結構的語言,除了過程的嵌套性外還有分程式的嵌套性。處理分程式的一個簡單辦法是:把分程式看成是“無參過程”,它在哪裡定義就在哪裡被調用。因此,可以把處理過程的辦法擴大到包括處理分程式。但這種做法是極為低效的,這是因為:
(1)每逢進入一個分程式就照樣建立連線數據和DISPLAY是不必要的;
(2)當從內層分程式向外轉移時可能要同時結束若干個分程式,按照過程處理的方法則必須一層一層地通過“返回”而恢復所要到達的那個分程式的數據區,但是卻不能直接到達。
為了解決上述問題,可採用如下方法:
(1)代替原來的那個統一的棧頂指示器,現在讓每個過程或分程式都有自己的棧頂指示器TOP,它的值保存在各自的活動記錄中,這樣便解決了上述的第(2)個問題。
(2)不把分程式視作“無參過程”,每個分程式享用包圍它的那個最小過程的DISPLAY。每個分程式都隸屬於某個確定的過程,分程式的層次是相對於他所屬的那個過程進行編號的。