哪些元素结合在一起使编程语言操作的定义变得模糊?

为数据类型定义的一组操作决定了如何操作该类型的数据对象。操作可以是原始操作,将它们定义为语言定义的元素,或者它们可以是程序员定义的操作,作为类定义的元素。

运算是一个数学函数,对于给定的输入参数,它有一个清晰而简单的持久结果。每个操作都有一个域(它可以创建的一组可能的结果)。操作的动作表示为任何给定参数集创建的结果。

结合起来混淆编程语言操作定义的元素如下 -

  • 对于特定输入未定义的操作 - 在某个域上定义的操作可以为域中的特定输入未定义。例如,负整数域上的平方根函数。未定义运算的显式域的定义可能非常复杂,因为在算术运算中,数字集会产生下溢或上溢。

  • 隐式参数- 使用一组显式参数定期调用程序中的操作。该操作可以通过使用全局变量或其他非局部标识符引用来创建不同的隐式参数。可以影响操作结果的所有数据的整个确定被这种隐式参数所掩盖。

例如,在 C 语言中

int sum ();
int a = 10, b = 20;
main () {
   int s;
   s = sum ();
   printf("%d", s);
}
int sum (){
   return (a+b);
}

  • 副作用(隐式结果) - 操作可以返回显式结果,如作为加法结果返回的总和,但它也可以更改保存在程序员和系统定义的多个数据对象中的值。这种隐含的结果被定义为副作用。

  • 自修改(历史敏感性) - 操作可以更改其内部架构,无论是在实现之间维护的本地数据还是其代码。由特定参数集的操作创建的结果不仅取决于这些参数,还取决于评估期间先前调用的完整历史记录以及每次调用时给出的参数。该操作在其操作中是历史敏感的。

一个例子是在某些语言中作为操作发现的随机数生成器。通过在调用之间接收到的本地数据进行转换的自修改是普通的,通过更改操作代码的自修改不太常见,但在包括 LISP 在内的语言中是可能的。