哪些因素導致程式語言操作的定義變得模糊不清?


為資料型別定義的操作集決定了該型別的資料物件如何被操作。操作可以是基本操作,這意味著它們作為語言定義的一部分被宣告;也可以是程式設計師定義的操作,作為類定義的一部分。

操作是一個數學函式,對於給定的輸入引數,它具有明確且始終如一的輸出結果。每個操作都有一個定義域(它可以生成的所有可能結果的集合)。操作的作用表示針對任何給定引數集所生成的結果。

導致程式語言操作定義變得模糊不清的因素如下:

  • 針對特定輸入未定義的操作 - 在某個定義域上定義的操作可能對於定義域中的特定輸入未定義。例如,對負整數定義域上的平方根函式。操作未定義的顯式定義域可能極其複雜,例如,在算術運算中生成下溢或上溢的數字集。

  • 隱式引數 - 程式中的操作通常會呼叫一組顯式引數。操作可以透過使用全域性變數或其他非區域性識別符號引用來建立不同的隱式引數。所有可能影響操作結果的資料的完整確定會被此類隱式引數所掩蓋。

例如,在C語言中

int sum ();
int a = 10, b = 20;
main () {
   int s;
   s = sum ();
   printf("%d", s);
}
int sum (){
   return (a+b);
}
  • 副作用(隱式結果) - 操作可以返回一個顯式結果,例如加法運算返回的總和,但它也可以更改儲存在多個數據物件中的值,包括程式設計師和系統定義的資料物件。此類隱式結果定義為副作用。

  • 自我修改(歷史敏感性) - 操作可以更改其內部結構,無論是實現之間維護的本地資料還是其程式碼。然後,操作針對特定引數集生成的結果不僅取決於這些引數,還取決於評估期間之前所有呼叫的完整歷史記錄以及每次呼叫時給定的引數。操作在其操作中對歷史敏感。

一個例子是在某些語言中作為操作找到的隨機數生成器。透過呼叫之間接收的本地資料中的轉換進行自我修改是很常見的,透過更改操作程式碼進行自我修改不太常見,但在包括 LISP 在內的語言中是可能的。

更新時間: 2021年10月23日

142 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告