为什么编程语言开始使用=进行赋值?


13

在大多数早期算法书籍中,都<-提到分配和=比较。但是现在唯一不=用于分配的:=语言是Pascal()和玩具语言(如COOL)。是什么导致现代编程语言转变=为含义分配,而不是数学上的相等性含义?


8
不要让我开始===...
鹿猎人

1
在算法工作中仍然很常见;它是编写算法时分配的三种常见符号之一(其他是:==)。仅仅因为程序员全部使用=并不意味着数学家都放弃了
cpast

@DeerHunter ===很好。
Darth Egregious 2015年

1
我有一个中学女生how叫:“ x等于x加1怎样?” 在我教过的介绍中 这是计算机的基本怪异:自然界中不存在变量,它们不同于宇宙中的任何其他事物。

1
User251748:我的钱包是真实世界的变量,其中包含多组硬币,钞票和偶尔的纸屑。
gnasher729

Answers:


14

根据Wikipedia的说法,使用均值分配可以追溯到亨氏·鲁迪斯豪瑟(Heinz Rutishauser)于1949年至1951年设计的语言Superplan,该语言在Fortran中特别流行:

一个坏主意的臭名昭著的例子是选择等号表示分配。它可以追溯到1957年的Fortran,并被众多语言设计师盲目地复制。为什么这是个坏主意?因为它颠覆了一个世纪的传统,让“ =”表示对平等的比较,所以谓词是对还是错。但是,Fortran的意思是分配,即平等的执行。在这种情况下,操作数不相等:左操作数(变量)应等于右操作数(表达式)。x = y并不等同于y = x。

—尼克劳斯·沃思(Niklaus Wirth),好主意,透过窥镜

Konrad Zuse还使用了Plankalkul的等号,这启发了Rutishauser的Superplan,尽管从来没有为此设计过编译器。他为什么选择等号?我猜你不得不问他。


4
好吧,当然有更糟糕的想法。毕竟,数学课本=既用作谓词又用于定义变量,例如在“让x = 4”中。如果y = 4,则√(x-y)为零。之所以可行,是因为应该以声明方式而不是命令方式理解数学符号。函数式编程语言(例如ML系列)默认为非可变变量,因此可以继续=以其双重角色使用而不会出现任何问题。或更准确地说,=既是运算符又是let语法的一部分。
阿蒙(Amon)

2
@amon:我不同意数学中的双重含义。“ Let 4 = x”与“ Let x = 4”一样有效。

4
@COMEFROM“ Let 4 = x”与您从中获取用户名的INTERCAL语句一样不自然。如果以前从未提及过“ x”,那么“ Let x = {something}”或“ Let x be {widget}”除了指定其值外,还会引入变量,并且按惯例将变量置于第一位。正是因为至少在直觉上,这与仅声明“值等于...”是不同的。

3
@delnan“ Let x = 4”只是“ Let x∈ℤ和x = 4”的简写。上下文引入了新变量,=因此只是一个谓词,与在其他任何地方使用的相同。请注意,根据上下文,“ Let x = 4”也可能意味着“ Let x∈ℝand x = 4”。
2015年

2
@RobertHarvey我们正在谈论数学写作,而不是C编程。来自:我承认这并不像我以前说的那么明确,但是由于数学散文是基于约定的,并且没有可以被律师允许的“ let 4 = x”的规范,因此,陈述是不仅与“ let x = 4”一样有效。至少,它使读者感到困惑,从而使散文的主要目的无法实现

7

但是当我在学校数学时,“让x = 123”

是常见的措辞。Basic的早期版本在等号之前坚持使用“ let”关键字。因此,基本上可以理解为“让”完成了。

关键驱动程序通常不被考虑,但是在您实际输入时非常重要。

有两种可行的输入设备,

  • “电传打字机”,您可以使用标准的电传打字机在碳带上打一些小孔,然后计算机即可读取。这还不错,因为它支持大写和小写的标准字母缩写,以及键盘顶行的大多数字符。
  • 打孔卡-由于大公司普遍使用分拣机,制表机和打印机,因此有很多打卡机在附近闲逛。它们支持非常有限的字符集,仅大写字母和有限数量的“特殊”字符。

电传打字机通常用于学术和军事商店,在更多的商业商店中使用打卡机。因此,像Pascal这样的学术语言支持小写字母标识符和“:=”这样的“明智”符号来分配。针对更多商业读者的语言假定打孔卡将是输入的主要形式,因此,仅大写的语言(如FORTRAN和COBOL)对“:;> <”字符的支持有限,而这些字符在标准按键上不可用。

顺便说一句,在早期的FORTRAN中,对于使用“ =”进行赋值并没有歧义,因为使用“ .LT。”,“。LE。”,“。EQ。”,“。GE”进行了比较。和“ .GT”。句法。


不过,我发现比任何类型的任务都let x = 123更相似assert(x == 123)
AKHolland,2015年

1
PS:如果您要上学,那么COBOL“ MOVE”语法是计算机实际运行状况的最准确描述。尽管“复制”会更加准确。
詹姆斯·安德森

@AKHolland为123.大值

由于C ++发明了move构造函数,因此COBOL“ MOVE”听起来很奇怪。
gnasher729

我一直认为LET应该在BASIC中仍然是强制性的,因为它会使分配与相等性测试分开。有点像COBOL的简写。问题是,这将占用源代码中的另一个令牌,即当时的小型PC中的另一个宝贵字节。因此他们放弃了它。
Chuck Adams
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.