153

谈到编程语言时,“正交性”是什么意思?

正交性的一些例子是什么?

4

17 回答 17

284

正交性是意味着“改变A不会改变B”的属性。正交系统的一个例子是收音机,改变电台不会改变音量,反之亦然。

非正交系统就像直升机,改变速度可以改变方向。

在编程语言中,这意味着当您执行一条指令时,只会发生该指令(对于调试非常重要)。

提到指令集时也有特定的含义。

于 2009-10-06T19:01:54.067 回答
41

来自 Eric S. Raymond 的“UNIX 编程艺术”

正交性是最重要的属性之一,它可以帮助使复杂的设计变得紧凑。在纯正交设计中,操作没有副作用;每个操作(无论是 API 调用、宏调用还是语言操作)只改变一件事,而不会影响其他操作。改变你控制的任何系统的每个属性只有一种方法。

于 2009-10-06T19:01:46.233 回答
20

想想它能够改变一件事而不会对另一部分产生看不见的影响。

于 2009-10-06T19:02:23.127 回答
13

从广义上讲,正交性是两个事物之间的关系,它们对彼此的影响最小。

该术语来自数学,如果两个向量以直角相交,则它们是正交的。

考虑一个典型的二维笛卡尔空间(典型的带有 X/Y 轴的网格)。绘制两条线:x=1 和 y=1。两条线是正交的。你可以通过改变x来改变x=1,这对另一行没有影响,反之亦然。

在软件中,该术语可以适当地用于您谈论系统的两个彼此独立运行的部分的情况。

于 2009-10-06T19:05:40.660 回答
12

如果你有一组构造。如果一种语言允许程序员自由地混合这些结构,则称该语言是正交的。例如,在 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.
于 2009-10-06T19:03:49.457 回答
5

大多数答案都非常冗长,甚至晦涩难懂。关键是:如果一个工具是正交的,它可以被添加、替换或删除,以支持更好的工具,而不会把其他所有东西都搞砸。

这是木匠有锤子和锯子的区别,它可以用于锤击或锯切,或者有一些新的锤子/锯子组合,旨在锯木头,然后将它们锤在一起。任何一种都可以用于锯切然后一起锤击,但如果你得到一些需要锯切而不是锤击的任务,那么只有正交工具才能工作。同样,如果您需要拧而不是锤击,则无需扔掉锯子,如果它与您的锤子正交(未混合)。

经典的例子是 unix 命令行工具:你有一个用于获取磁盘内容的工具(dd),另一个用于从文件中过滤行(grep),另一个用于将这些行写入文件(cat)等等。这些都可以随意混搭。

于 2009-10-06T22:18:30.913 回答
3

在谈论有关编程语言的项目决策时,正交性可能被视为您可以很容易地预测您过去看到的有关该语言的其他事情。

例如,在一种语言中,您可以:

str.split

用于分割字符串和

长度(str)

为了获得长度。

在更正交的语言上,您总是会使用 str.x 或 x(str)。

当你克隆一个对象或做其他事情时,你会知道是否使用

克隆(对象)

或者

对象克隆

这是编程语言正交的要点之一。这样可以避免您查阅手册或询问某人。

维基百科文章更多地讨论了复杂设计或低级语言的正交性。正如上面有人在评论中建议的那样,Sebesta 的书清楚地谈到了正交性。

如果我只用一句话,我会说一种编程语言是正交的,当它的未知部分根据你所看到的情况按预期运行时。或者......没有惊喜。

;)

于 2009-10-06T19:22:52.573 回答
2

来自 Robert W. Sebesta 的“编程语言概念”:

作为高级语言中缺乏正交性的示例,请考虑 C 中的以下规则和例外。尽管 C 具有数组和记录(结构)两种结构化数据类型,但记录可以从函数返回,但数组不能。结构的成员可以是任何数据类型,除了 void 或相同类型的结构。数组元素可以是除 void 或函数之外的任何数据类型。参数按值传递,除非它们是数组,在这种情况下,它们实际上是按引用传递的(因为在 C 程序中出现不带下标的数组名称被解释为数组第一个元素的地址)

于 2015-08-15T22:09:36.157 回答
1

来自维基百科

计算机科学

正交性是一种系统设计属性,有助于实现复杂设计的可行性和紧凑性。正交性保证修改系统组件产生的技术效果既不会产生副作用,也不会传播到系统的其他组件。一个由组件组成的系统的紧急行为应该由其逻辑的正式定义来严格控制,而不是由集成不良导致的副作用,即模块和接口的非正交设计。正交性减少了测试和开发时间,因为更容易验证既不会产生副作用也不依赖于它们的设计。

例如,一辆汽车有正交的组件和控制(例如,加速车辆不会影响其他任何东西,但只涉及加速功能的组件)。另一方面,非正交设计可能会使其转向影响其制动(例如电子稳定控制),或者其速度会调整其悬架。1因此,这种用法被视为源自数学中正交的使用:可以通过将向量分别投影到一组基向量的每个成员上并添加投影当且仅当基向量是相互正交的。

如果任何指令可以在任何寻址模式下使用任何寄存器,则称指令集是正交的。这个术语源于将指令视为一个向量,其分量是指令字段。一个字段标识要操作的寄存器,另一个指定寻址模式。正交指令集对寄存器和寻址模式的所有组合进行唯一编码。

于 2009-10-06T19:01:11.853 回答
1

来自维基百科

正交性是一种系统设计属性,有助于实现复杂设计的可行性和紧凑性。正交性保证修改系统组件产生的技术效果既不会产生副作用,也不会传播到系统的其他组件。一个由组件组成的系统的紧急行为应该由其逻辑的正式定义来严格控制,而不是由集成不良导致的副作用,即模块和接口的非正交设计。正交性减少了测试和开发时间,因为更容易验证既不会产生副作用也不依赖于它们的设计。

例如,一辆汽车有正交的组件和控制(例如,加速车辆不会影响其他任何东西,但只涉及加速功能的组件)。另一方面,非正交设计可能会使其转向影响其制动(例如电子稳定控制),或者其速度会调整其悬架。 [1] 因此,这种用法被视为源自数学中正交的使用:人们可以通过将向量分别投影到一组基向量的每个成员上并添加投影当且仅当基向量为相互正交。

如果任何指令可以在任何寻址模式下使用任何寄存器,则称指令集是正交的。这个术语源于将指令视为一个向量,其分量是指令字段。一个字段标识要操作的寄存器,另一个指定寻址模式。正交指令集对寄存器和寻址模式的所有组合进行唯一编码。

用最简单的术语来说,如果改变一个对另一个没有影响,那么两件事是正交的。

于 2009-10-06T19:03:02.850 回答
1

正交性是指语言由一组独立的原始构造组成的程度,这些构造可以根据需要组合以表达程序。如果对如何组合没有限制,则特征是正交的

Example : non-orthogonality

PASCAL:函数不能返回结构化类型。函数式语言是高度正交的。

于 2015-12-09T14:13:33.783 回答
1

编程语言中正交性的真实例子

在指定一些虚构的示例时,已经有很多答案可以解释正交性通常是什么。例如,这个答案很好地解释了它。我想提供(并收集)一些编程语言中正交或非正交特征的真实例子:

正交:C++20 模块和命名空间

在 c++20 中关于新模块系统的cppreference-page 上写着:

模块与命名空间正交

在这种情况下,他们写道模块与命名空间正交,因为类似的语句import foo不会导入与以下相关的模块命名空间foo

import foo;            // foo exports foo::bar()
bar ();                // Error
foo::bar ();           // Ok
using namespace foo;
bar ();                // Ok

(改编自modules-cppcon2017 slide 9)

于 2020-11-05T15:23:19.380 回答
0

在编程语言中,如果编程语言特征不受限制(或例外)的限制,则称其为正交的。例如,在 Pascal 中,函数不能返回结构化类型。这是对从函数返回值的限制。因此,我们将其视为非正交特征。;)

于 2013-11-12T12:29:02.697 回答
0

编程中的正交性:

正交性是一个重要的概念,它解决了如何以相对较少的方式组合相对较少的组件以获得所需的结果。它与简单相关;设计越正交,异常就越少。这使得使用编程语言学习、阅读和编写程序变得更加容易。正交特征的含义与上下文无关;关键参数是对称性和一致性(例如,指针是正交概念)。

来自维基百科

于 2014-01-18T12:28:21.967 回答
0

编程语言中的正交性意味着可以以相对较少的方式组合一组相对较小的原始构造,以构建该语言的控制和数据结构。此外,每个可能的原语组合都是合法且有意义的。例如,考虑数据类型。假设一种语言有四种原始数据类型(整数、浮点数、双精度和字符)和两种类型运算符(数组和指针)。如果这两种类型运算符可以应用于自身和四种原始数据类型,则可以定义大量的数据结构。正交语言特征的含义与其在程序中出现的上下文无关。(正交这个词来自正交向量的数学概念,它们相互独立。) 正交性来自基元之间关系的对称性。缺乏正交性会导致语言规则的例外。例如,在支持指针的编程语言中,应该可以定义一个指针来指向该语言中定义的任何特定类型。但是,如果不允许指针指向数组,许多潜在有用的用户定义数据结构就无法定义。我们可以通过比较 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 之前,除了 c 之后)是很困难的。

于 2015-08-15T22:17:52.530 回答
0

正交性的基本思想是概念上不相关的事物在系统中不应该相关。真正与其他无关的架构部分,例如数据库和 UI,不应该一起更改。对一个的更改不应导致对另一个的更改。

于 2018-05-03T17:17:41.440 回答
0

正交性是指概念上不相关的事物在系统中不应相关,因此架构中彼此无关的部分,如数据库和 UI,不应一起更改。对系统某一部分的更改不应导致对另一部分的更改。

例如,如果您更改屏幕上的几行并导致数据库模式发生变化,这称为耦合。您通常希望最大限度地减少大部分不相关的事物之间的耦合,因为它可以增长并且系统可能成为长期维护的噩梦。

于 2020-12-11T17:02:14.997 回答