在谈论编程语言时,“正交性”是什么意思?
正交性的一些例子是什么?
在谈论编程语言时,“正交性”是什么意思?
正交性的一些例子是什么?
Answers:
正交性是表示“更改A不会更改B”的属性。正交系统的一个示例是无线电,其中更改电台不会更改音量,反之亦然。
非正交系统就像是直升机,改变速度可以改变方向。
在编程语言中,这意味着当您执行一条指令时,仅发生该指令(对调试非常重要)。
引用指令集时还有一个特定的含义。
摘自Eric S. Raymond的“ UNIX编程艺术”
正交性是最重要的属性之一,可以帮助使复杂的设计变得紧凑。在纯正交设计中,操作没有副作用。每个操作(无论是API调用,宏调用还是语言操作)都只会改变一件事而不会影响其他事情。只有一种方法可以更改您所控制的任何系统的每个属性。
如果您有一组构造。如果语言允许程序员自由混合使用这些结构,则称该语言为正交的。例如,在C中,您不能返回一个数组(静态数组),在这种情况下,C被认为是非正交的:
int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the langauge allows passing arrays.
// So, it is unorthognal in case.
大部分答案都是冗长的,甚至晦涩难懂。关键是:如果工具是正交的,则可以添加,替换或删除它,以便使用更好的工具,而无需拧紧其他所有工具。
这是木匠用锤子和锯子(可用于锤击或锯切),或用某种新型的锤子/锯子组合(其目的是先锯木然后将其锤击)区别开来。两种方法都可以进行锯切,然后将其锤打在一起,但是,如果您完成了一些需要锯切而不是锤打的任务,那么只有正交工具可以使用。同样,如果您需要拧螺丝而不是锤子,那么如果它与锤子正交(不与锤子混合),则无需扔掉锯子。
经典示例是unix命令行工具:您拥有一个用于获取磁盘内容(dd)的工具,另一个用于从文件(grep)过滤行的工具,另一个用于将这些行写入文件(cat)的工具,等等。可以随意混合和匹配。
在谈论有关编程语言的项目决策时,正交性可能被视为您可以轻松地预测出过去所见到的关于该语言的其他信息。
例如,使用一种语言,您可以拥有:
分裂
用于分割字符串和
len(str)
获得长度。
在更正交的语言上,您将始终使用str.x或x(str)。
当您克隆对象或执行其他任何操作时,您将知道是否要使用
克隆(obj)
要么
obj.clone
这是正交编程语言的要点之一。这样可以避免您查阅手册或询问他人。
维基百科文章更多地讨论了复杂设计或底层语言的正交性。正如上面有人在评论中所建议的那样,Sebesta书干净地谈论了正交性。
如果我只用一个句子,我会说一种编程语言是正交的,如果它的未知部分根据您所看到的来按预期运行。或者...没什么奇怪的。
;)
来自维基百科:
计算机科学
正交性是一种系统设计属性,可促进复杂设计的可行性和紧凑性。正交性保证修改由系统组件产生的技术效果既不会产生副作用,也不会将副作用传播到系统的其他组件。由组件组成的系统的紧急行为应严格通过其逻辑的形式定义来控制,而不应由不良集成(即模块和接口的非正交设计)引起的副作用所控制。正交性减少了测试和开发时间,因为更容易验证既不会引起副作用也不会依赖副作用的设计。
例如,一辆汽车具有正交的组件和控件(例如,对汽车进行加速不会影响任何东西,除了与加速功能有关的组件之外)。另一方面,非正交设计可能会使其转向(例如电子稳定性控制)受到影响,或者使其速度调整其悬架。1因此,可以认为这种用法是从数学中正交的使用中得出的:可以将向量投影到子空间上,方法是将向量分别投影到一组基本向量的每个成员上,并且在且仅当基本向量相加时才添加投影相互正交。
如果任何指令可以在任何寻址模式下使用任何寄存器,则该指令集被称为正交指令。该术语是通过将指令视为向量而产生的,其向量是指令字段。一个字段标识要操作的寄存器,另一个字段指定寻址模式。正交指令集唯一地编码寄存器和寻址模式的所有组合。
从维基百科:
正交性是一种系统设计属性,可促进复杂设计的可行性和紧凑性。正交性保证修改由系统组件产生的技术效果既不会产生副作用,也不会将副作用传播到系统的其他组件。由组件组成的系统的紧急行为应严格通过其逻辑的形式定义来控制,而不应由不良集成(即模块和接口的非正交设计)引起的副作用所控制。正交性减少了测试和开发时间,因为更容易验证既不会引起副作用也不会依赖副作用的设计。
例如,一辆汽车具有正交的组件和控件(例如,对汽车进行加速不会影响任何东西,除了与加速功能有关的组件之外)。另一方面,非正交设计可能会影响其转向(例如电子稳定性控制)的转向,或者会影响其悬架的速度。[1] 因此,可以认为这种用法是从数学中正交的使用中得出的:可以将向量投影到子空间上,方法是将其分别投影到一组基本向量的每个成员上,并且在且仅当基本向量为相互正交。
如果任何指令可以在任何寻址模式下使用任何寄存器,则该指令集被称为正交指令。该术语是通过将指令视为向量而产生的,其向量是指令字段。一个字段标识要操作的寄存器,另一个字段指定寻址模式。正交指令集唯一地编码寄存器和寻址模式的所有组合。
简而言之,如果改变一项对另一项没有影响,则两件事是正交的。
编程语言中的正交性意味着可以以相对较少的几种方式组合相对少量的原始构造,以构建该语言的控制和数据结构。此外,原语的所有可能组合都是合法且有意义的。例如,考虑数据类型。假设一种语言具有四种原始数据类型(整数,浮点,双精度和字符)和两种类型运算符(数组和指针)。如果可以将两种类型的运算符应用于自身以及四种原始数据类型,则可以定义大量的数据结构。正交语言功能的含义与其在程序中出现的上下文无关。(正交一词来自正交矢量的数学概念,正交矢量彼此独立。正交性源自本构关系之间的对称关系。缺乏正交性会导致语言规则的例外。例如,在支持指针的编程语言中,应该可以定义一个指针,以指向该语言中定义的任何特定类型。但是,如果不允许指针指向数组,则无法定义许多潜在有用的用户定义数据结构。通过比较IBM大型机和VAX系列小型计算机的汇编语言的一个方面,我们可以说明正交性作为一种设计概念的使用。我们考虑一种简单的情况:将两个32位整数值(驻留在存储器或寄存器中)相加,然后用和替换两个值之一。IBM大型机为此有两个说明,
A Reg1, memory_cell
AR Reg1, Reg2
其中Reg1和Reg2代表寄存器。这些的语义是
Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)
用于32位整数值的VAX加法指令为
ADDL operand_1, operand_2
其语义是
operand_2 ← contents(operand_1) + contents(operand_2)
在这种情况下,操作数都可以是寄存器或存储单元。VAX指令设计是正交的,因为一条指令可以使用寄存器或存储单元作为操作数。有两种指定操作数的方式,可以以所有可能的方式进行组合。IBM设计不是正交的。在四种操作数组合可能性中,只有两种是合法的,并且两种需要不同的指令A和AR。IBM设计受到更多限制,因此可写性更差。例如,您不能将两个值相加并将总和存储在存储位置中。此外,由于这些限制和附加说明,IBM设计更加难以学习。正交性与简单性密切相关:语言的设计越正交,语言规则要求的例外就越少。更少的例外意味着设计中的规则性更高,这使得语言更易于学习,阅读和理解。任何学习过英语重要内容的人都可以证明难以学习其许多规则异常(例如,i在e之前的e,在c之后的除外)。
检查矩阵的正交性:
正交性也可以与矩阵有关,
Matrix *(transpose of matrix)= identity matrix.
点击下面的链接,观看有关正交性的YouTube视频。
https://youtu.be/tNekLaxnfW8