哪些因素导致编程语言操作的定义变得模糊不清?
为数据类型定义的操作集决定了该类型的数据对象如何被操作。操作可以是基本操作,这意味着它们作为语言定义的一部分被声明;也可以是程序员定义的操作,作为类定义的一部分。
操作是一个数学函数,对于给定的输入参数,它具有明确且始终如一的输出结果。每个操作都有一个定义域(它可以生成的所有可能结果的集合)。操作的作用表示针对任何给定参数集所生成的结果。
导致编程语言操作定义变得模糊不清的因素如下:
针对特定输入未定义的操作 - 在某个定义域上定义的操作可能对于定义域中的特定输入未定义。例如,对负整数定义域上的平方根函数。操作未定义的显式定义域可能极其复杂,例如,在算术运算中生成下溢或上溢的数字集。
隐式参数 - 程序中的操作通常会调用一组显式参数。操作可以通过使用全局变量或其他非局部标识符引用来创建不同的隐式参数。所有可能影响操作结果的数据的完整确定会被此类隐式参数所掩盖。
例如,在C语言中
int sum (); int a = 10, b = 20; main () { int s; s = sum (); printf("%d", s); } int sum (){ return (a+b); }
副作用(隐式结果) - 操作可以返回一个显式结果,例如加法运算返回的总和,但它也可以更改存储在多个数据对象中的值,包括程序员和系统定义的数据对象。此类隐式结果定义为副作用。
自我修改(历史敏感性) - 操作可以更改其内部结构,无论是实现之间维护的本地数据还是其代码。然后,操作针对特定参数集生成的结果不仅取决于这些参数,还取决于评估期间之前所有调用的完整历史记录以及每次调用时给定的参数。操作在其操作中对历史敏感。
一个例子是在某些语言中作为操作找到的随机数生成器。通过调用之间接收的本地数据中的转换进行自我修改是很常见的,通过更改操作代码进行自我修改不太常见,但在包括 LISP 在内的语言中是可能的。
广告