关于不可知的语言:什么是”正交性”?

What is “Orthogonality”?

在谈论编程语言时,"正交性"是什么意思?

正交性有哪些例子?


正交性是表示"更改A不会更改B"的属性。正交系统的一个示例是无线电,其中更改电台不会更改音量,反之亦然。

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

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

引用指令集时也有特定含义。


摘自Eric S. Raymond的" UNIX编程艺术"

Orthogonality is one of the most important properties that can help make even complex designs compact. In a purely orthogonal design, operations do not have side effects; each action (whether it's an API call, a macro invocation, or a language operation) changes just one thing without affecting others. There is one and only one way to change each property of whatever system you are controlling.


认为它能够更改一件事情而不会对另一部分造成看不见的影响。


如果您具有一组构造。如果语言允许程序员自由混合使用这些结构,则称该语言为正交的。例如,在C中,您不能返回一个数组(静态数组),在这种情况下,C被认为是非正交的:

1
2
3
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.


广义上讲,正交性是两件事之间的关系,以使它们彼此之间的影响最小。

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

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

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


大多数答案都long之以鼻,甚至晦涩难懂。关键是:如果一个工具是正交的,则可以添加,替换或删除它,以便使用更好的工具,而无需拧紧其他所有工具。

这是指具有锤子和锯子的木匠之间的区别,该锯子可用于锤打或锯切,或者具有某种新型的锤子/锯子组合,其设计用于锯切木材,然后将其锤击在一起。两种方法都可以进行锯切,然后将其锤打在一起,但是,如果您完成了一些需要锯切而不是锤打的任务,那么只有正交工具可以使用。同样,如果您需要拧紧而不是锤打,则不需要扔掉锯子,只要它与锤子正交(不与锤子混合)即可。

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


在谈论有关编程语言的项目决策时,正交性可能被视为您可以轻松地根据过去的经验预测关于该语言的其他内容。

例如,用一种语言,您可以拥有:

str.split

用于拆分字符串,

len(str)

获取长度。

在更正交的语言上,您将始终使用str.x或x(str)。

当您克隆对象或执行其他任何操作时,您将知道是否使用

clone(obj)

obj.clone

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

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

如果我只用一个句子,我会说一种编程语言是正交的,如果它的未知部分根据您所见的表现发挥了预期的作用。
或者...没什么奇怪的。

;)


摘自Robert W. Sebesta的"编程语言概念":

As examples of the lack of orthogonality in a high-level language,
consider the following rules and exceptions in C. Although C has two
kinds of structured data types, arrays and records (structs), records
can be returned from functions but arrays cannot. A member of a
structure can be any data type except void or a structure of the same
type. An array element can be any data type except void or a function.
Parameters are passed by value, unless they are arrays, in which case
they are, in effect, passed by reference (because the appearance of an
array name without a subscript in a C program is interpreted to be
the address of the arraya€?s first element)


来自维基百科:

计算机科学

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

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

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


来自维基百科:

Orthogonality is a system design
property facilitating feasibility and
compactness of complex designs.
Orthogonality guarantees that
modifying the technical effect
produced by a component of a system
neither creates nor propagates side
effects to other components of the
system. The emergent behavior of a
system consisting of components should
be controlled strictly by formal
definitions of its logic and not by
side effects resulting from poor
integration, i.e. non-orthogonal
design of modules and interfaces.
Orthogonality reduces testing and
development time because it is easier
to verify designs that neither cause
side effects nor depend on them.

For example, a car has orthogonal
components and controls (e.g.
accelerating the vehicle does not
influence anything else but the
components involved exclusively with
the acceleration function). On the
other hand, a non-orthogonal design
might have its steering influence its
braking (e.g. electronic stability
control), or its speed tweak its
suspension.[1] Consequently, this
usage is seen to be derived from the
use of orthogonal in mathematics: One
may project a vector onto a subspace
by projecting it onto each member of a
set of basis vectors separately and
adding the projections if and only if
the basis vectors are mutually
orthogonal.

An instruction set is said to be
orthogonal if any instruction can use
any register in any addressing mode.
This terminology results from
considering an instruction as a vector
whose components are the instruction
fields. One field identifies the
registers to be operated upon, and
another specifies the addressing mode.
An orthogonal instruction set uniquely
encodes all combinations of registers
and addressing modes.

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


编程语言中正交性的现实示例

已经有很多答案,在说明一些示例时,它们通常解释正交性。例如。这个答案很好地解释了。我想提供(并收集)一些编程语言中正交或非正交特征的真实示例:

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

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

Modules are orthogonal to namespaces

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

相关的模块命名空间

1
2
3
4
5
import foo;            // foo exports foo::bar()
bar ();                // Error
foo::bar ();           // Ok
using namespace foo;
bar ();                // Ok

(摘自modules-cppcon2017幻灯片9)


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

例如,如果您在屏幕上更改了几行并导致数据库架构发生更改,则这称为耦合。通常,您希望最大程度地减少无关的事物之间的耦合,因为它会增长,并且从长远来看,它可能成为维护系统的噩梦。


编程中的正交性:

Orthogonality is an important concept, addressing how a relatively small number of components can be combined in a relatively small number of ways to get the desired results. It is associated with simplicity; the more orthogonal the design, the fewer exceptions. This makes it easier to learn, read and write programs in a programming language. The meaning of an orthogonal feature is independent of context; the key parameters are symmetry and consistency (for example, a pointer is an orthogonal concept).

来自维基百科


编程语言中的正交性意味着相对较少的一组
原始构造可以以相对较少的方式组合在一起
建立语言的控制和数据结构。此外,每个位置
原语的合理组合是合法且有意义的。例如,考虑数据类型。假设一种语言具有四种原始数据类型(整数,浮点型,
double和character)和两个类型运算符(数组和指针)。如果两个
类型运算符可以应用于自己和四种原始数据类型,
可以定义大量的数据结构。
正交语言功能的含义独立于
它在程序中出现的上下文。 (正交一词来自
正交向量的数学概念,它们彼此独立
其他。)正交性源于本构关系之间的对称关系
动机。缺乏正交性会导致语言规则的例外。
例如,在支持指针的编程语言中,它应该是
可以定义一个指针,以指向该语言中定义的任何特定类型。
但是,如果不允许指针指向数组,则无法定义许多潜在有用的用户定义数据结构。
我们可以通过比较来说明正交性作为设计概念的使用-
IBM大型机的汇编语言的一个方面
和VAX系列小型计算机。我们考虑一个简单的情况:
将驻留在内存或寄存器中的两个32位整数值相加,并且
用总和替换两个值之一。 IBM大型机有两个
为此目的的说明,格式为

1
2
A Reg1, memory_cell
AR Reg1, Reg2

其中Reg1和Reg2代表寄存器。这些的语义是

1
2
Reg1 a?? contents(Reg1) + contents(memory_cell)
Reg1 a?? contents(Reg1) + contents(Reg2)

用于32位整数值的VAX加法指令为

1
ADDL operand_1, operand_2

其语义为

1
operand_2 a?? contents(operand_1) + contents(operand_2)

在这种情况下,任何一个操作数都可以是寄存器或存储单元。
VAX指令设计是正交的,因为一条指令可以
使用寄存器或存储单元作为操作数。有两种方法
指定可以以所有可能的方式组合的操作数。 IBM设计
不正交。在四种操作数组合可能性中,只有两种是
合法,并且两者要求使用不同的指令A和AR。 IBM设计
受到更多的限制,因此不那么可写。例如,您不能添加
两个值,并将总和存储在存储位置中。此外,IBM
由于限制和附加说明,设计更难于学习。
正交性与简单性密切相关:正交性越强,则正交性越强。
设计语言时,语言规则所需的例外越少。更少
例外意味着设计中的规则性更高,这使得
语言更易于学习,阅读和理解。学过信号的任何人
英语的重要部分可以证明学习英语的困难
许多规则异常(例如,i在e之前,c除外)。


正交性是指语言由一组独立的原始构造组成的程度,这些构造可以根据需要组合以表示程序。
如果要素的组合方式不受限制,则它们是正交的

1
Example : non-orthogonality

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


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


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