可擴充運算集

可擴充運算集

假定程式設計師對於他正在使用的語言中設定的初等運算不滿足,而希望擴充該語言以包括他自己設計的新運算。支持這種擴充的語言,可以稱之為具有“可擴充運算集"的語言。事實上,以子程式形式構成新的運算在各種程式語言中都是最基本的(將術語“可擴充運算集”套用於子程式方法是不準確的。通常該術語僅限於更專門的方法——通過改變語法來增加運算符)。

基本介紹

  • 中文名:可擴充運算集
  • 外文名:extensible operation set
  • 定義:擴充語言
  • 方法:改變語法增加運算符
  • 系統:計算機
  • 套用學科:計算機原理
子程式體,子程式的運算項和結果,說明和子程式,

子程式體

按照子程式是否與主程式採用相同的語言來編寫,而將子程式分為兩種基本類型。最通用的子程式都是以同樣語言編寫的。這種子程式體通常具有與主程式相同的形式,不同的只是具有一個專門的初始語句。能夠用這個語言編製程序的任何算法均可以置入子程式體中。其中所要求的算法可用語言所提供的初等運算、數據結構和控制結構來表達,這就提供了很靈活的擴充能力。在子程式和調用程式之問信息交換的限制通常是有的。
在算法不能按語吉定義的初等運算編碼的地方,有效的是第二種類型的子程式,以另一種語言來編碼的子程式。這種類型的子程式是不常見的,由於在不同的語言編寫程式間存在相互通訊的困難,以及由於在存貯管理要求方面的差別,這類子程式的使用只限子相當特殊的情況。通常僅僅是預編譯的FORTRAN或具有靜態存貯要求的彙編語言子程式可以使用。

子程式的運算項和結果

如果子程式給出的是明顯的結果,則該子程式屬於函式子程式類(或稱函式),如果完全是通過副作用工作而不給出明顯結果,則稱之為子例程(Subroutines)。函式子程式用於表達式計算。其計算結果作為其它運算的直接輸入。子例程必須用專門的CALL語句單獨調用。
子程式的運算項稱之為實在參數或變元。子程式的運算項往往是比較自由的。一般地說,運算項可以是任何數據項,或是數,或是其它的初等數據項,或是像數組,表這樣的數據結構。此外,其它子程式的名字常常也可作為運算項,有的也可以是語句標號。
子程式的結果似乎受到更多的限制,通過參數或非局部量的修改子程式的結果可以作為明顯的函式值出現,也可通過副作用出現。在許多語言中,對子程式結果的限制是為了不影晌存貯管理。倒如,在FORTRANALGOL語言中,普通的限制是子程式結果所需要的存貯必須在子程式開始執行之前進行分配,ALGOL中子程式可以以單個的數作為結果,也可以用任意的方法修改現存數據結構(並不改變結構的大小)的內容,但不可以自身產生和給出數據結構作為子程式的值。因此ALGOL子程式不能設定表和給出表作為它的值。代替的辦法是在進入子程式之前先建立表。然後子程式可以填充該表(利用副作用)和返回控制。此外,子程式通常也不允許釋放其運算項的存貯單元,這些限制的作用是為了只允許將子程式當作初等運算,生成、廢棄或涉及到存貯管理的一些其它運算都是不可程式設計的。
LIsP、SNOBOL4和APL語言中,使用了更為一般的存貯管理方法,子程式可以允許產生並給出數據結構的值。在這些語言中,當程式用於不同目的執行時,存貯分配大概是經常地進行的,而子程式的入口和出口的界限對於存貯管理程式並不是特別的關鍵。

說明和子程式

正如初等運算一樣,在具有說明數據類型的語言中,有函式子程式結果類型說明是很重要的,類型說明構成了子程式定義的一部分。如在ALGOL中,子程式的標題:
integer procedure SUB(…);
按此說明,即可以確定在表達式:
X×SUB(…)+Y;
中SUB的調用將有整型結果,這就許可作靜態的類型檢查並將表達式翻譯為特定類型的乘法和加法運算。

相關詞條

熱門詞條

聯絡我們