为什么Donald Knuth使用汇编语言编写TAOCP?


20

我不讨厌使用汇编语言,因为我已经在操作系统课程中编写了一些语言。但是显然,汇编语言缺乏抽象性,您必须更加注意细节。

汇编语言对编写TAOCP真的很重要吗?


6
细节就是魔鬼的所在。
Blrfl 2013年

5
@Blrfl我不相信魔鬼。(尽管我相信细节…… 颤抖
Jimmy Hoffa 2013年

3
TAOCP的第一卷于1968年出版。尽管确实存在高级语言,但那时的手写汇编器更为重要,那时的大型机上的计算资源可能与1980年代的8位微控制器相同。克努斯(Knuth)曾经非常认真地主张保留goto,因为某些算法不能在没有效率低下的情况下使用嵌套的控制流结构编写。实际上,即使在IIRC之前,他实际上也不提倡过早的优化,他只是想在需要优化时使用该选项。
Steve314

3
@JimmyHoffa:哦,嗯,就您而言,详细信息是de Ville所在的位置。
Blrfl 2013年

1
杰里·科芬(Jerry Coffin)成功完成了我想做的事情,他从源头上查找了它;-)。我查看了介绍MIX和MIXAL的章节,但没有找到这些声明……也许有一天我应该得到一份电子副本。无论如何,我认为在这种情况下,答案标签将更适合杰里的答复。
托马斯

Answers:


22

他不仅使用MIXAL(他的MIX汇编语言),还使用MIX(一种简单计算机的模型)(例如60年代使用的模型)。这是他在某种程度上不受该领域发展影响的教学模式。

如果他使用另一种编程语言(顺便说一句,您认为哪一种适合吗?),例如NPL(漂亮的编程语言),那么他要么不得不放弃使用MIX的想法,要么引入一种选择的某种计算机语言的编译器(这比他在第一卷中要讲的要复杂得多)。这样,它就不会成为TAOCP而是TAONPLP。第一个与这种选择无关,并且由于这个原因,它是永恒的,因此很少有关于编程的书籍。第二个可能现在会被遗忘...

另外,只要计算机在原理上按照他的MIX的方式工作,如果您真的有兴趣学习如何使用它们,这是一件好事。


请注意,“编译器技术”正式是计划发行量7的主题。它仍然可能会发生,但是我认为,每个人都很高兴Knuth一直等到拥有编译器才能开始发布。
Kilian Foth,

@KilianFoth是的,我知道。但是我希望在这样的书中使用人工编程语言。可能针对基于MMIX(第二个M不是拼写错误的:-)的计算机。和ETA的卷。5是2020年……。–
Thomas

56

你们这些年轻的小鲷鱼有时会让我赞叹不已。你们常常不知道在开始上学之前发生了什么事。(我有同样的问题。从成人的角度来看,我花了很长时间才意识到15年实际上是很短的时间。这大约是从广岛到古巴导弹危机的时间。对我来说,第二次世界大战只是历史,但我父亲曾参与其中,而母亲则处于初中阶段。)

TAOCP,第一卷。1,《基础算法》第一版,于1968年首次出版。距今已有45年。在此之前,Knuth开始着手计划该系列。

供参考:英特尔8086于1978年首次出现,十年后。PASCAL语言于1971年首次出现。Jensen&Wirth的书有关该语言的第二种版本于1974年出版。C的最初开发是1969-1973年:K&R于1978年出版。

Knuth打算将该系列报道在内。他将样式THEN设置为对THEN练习者有用。他从没想过这个系列真的会成为他一生的作品,也不会指望他的作品能够跨越他最终完成的半个多世纪。

如今,汇编语言可以说没有现在那么严格,但是它仍然比大家希望的Java / C ++ / Javascript / Python / Perl专家重要得多。

现在下车我的草坪!


克努斯(Knuth)在1960年实现了ALGOL编译器,而ALGOL旨在适合发布算法,因此我认为这并不能真正解决问题。
彼得·泰勒

10
我真的不相信原因是时间的可用性。如果LISP希望像数学一样具有较高的抽象水平,则可以使用LISP。我认为他是因为标题的第一个词而去集会的。基本的。对算法而言,没有什么比对简单笨拙机器的逐步说明更基本的了。它迫使你打破算法下完全而不是原因它在一个较高的水平,这是不是他在这本书的目的。
吉米·霍法2013年

1
这就是为什么我的学校开设一门历史计算课程,让您可以编写Altair和一些PDP的程序。
钻机

@钻机-认真吗?现在我觉得老了。虽然还不如向新员工解释HPGL并发现他们从未见过或听说过笔式绘图仪!
马丁·贝克特

6
+1是因为有趣的咆哮以及相关信息。
luser droog

43

克努斯在序言中讨论了他的推理。我只列举一些点点滴滴:

...我需要决定是使用代数语言(例如ALGOL还是FORTRAN),还是为此目的使用面向机器的语言。也许今天的许多计算机专家会不同意我使用面向机器的语言的决定,但是由于以下原因,我已经确信这绝对是正确的选择:

  1. 代数语言比这里考虑的非数字问题更适合于数字问题。[...]
  2. 通过使用面向机器的语言进行编写,程序员将倾向于使用效率更高的方法;它离现实更近了。
  3. 我们需要的程序,除少数例外,都相当短...
  4. 对计算机非常感兴趣的人应该接受机器语言的良好教育。
  5. 无论如何,还是需要某种机器语言的。

尽管他没有直接指出,但我认为他提到的ALGOL和FORTRAN指出了他避免的另一个问题,这个问题可能更为重要。假设他选择了Algol(显然比Altran更适合于非数字程序)。我认为对于今天的大多数程序员来说,Algol可能比他选择的汇编语言陌生。

在第三版中,他重新设计了MIX以使其更适合现代处理器,并且不得不为其编写代码。但是,我认为,如果他使用高级语言,重写的范围将大大增加-而且他给出的所有理由也会保留下来。


而且,在那些日子里,编译器通常很昂贵。TAOCP第一卷问世几年后,我在一个不想花钱的地方进行了采访(老实说,IBM 370汇编程序还不错),我的妻子在汇编语言商店工作在那之后的很多年。
David Thornley

2
我该如何投票赞成第4点?
哈维尔

5
@Javier获得一份副本,并在空白处写入+1。
luser droog

29

克努思(Knuth)也更新了他的基本原理

为什么要使用机器语言?

毫无疑问,许多读者在想:``为什么Knuth用另一台机器代替MIX而不是仅仅坚持使用高级编程语言?这些天几乎没有人使用汇编程序。''

这样的人有权发表自己的意见,而不必费心阅读我书中的机器语言部分。但是,我在1960年代初编写的第一卷序言中提到的机器语言的原因在今天仍然有效:

  • 我的书的主要目标之一是展示高层结构在机器中的实际实现方式,而不仅仅是展示它们的应用方式。我从头开始解释协程链接,树结构,随机数生成,高精度算术,基数转换,数据打包,组合搜索,递归等。
  • 我的书中所需的程序通常太短,以至于它们的要点很容易掌握。
  • 对计算机非常感兴趣的人应该至少对底层硬件的状态有所了解。否则他们编写的程序会很奇怪。
  • 在任何情况下,机器语言都是必需的,这是我描述的许多软件程序的输出。
  • 表达基本的方法(例如用于机器语言的排序和搜索算法)可以对缓存和RAM大小以及其他硬件特性(内存速度,流水线,多个问题,后备缓冲区,缓存块的大小,等)比较不同的方案时。

此外,如果我确实使用高级语言,应该使用哪种语言?在1960年代,我可能会选择AlgolW。在1970年代,我不得不使用Pascal重写我的书。在1980年代,我肯定会将所有内容都更改为C。在1990年代,我不得不改用C ++,然后可能改用Java。在2000年代,毫无疑问将使用另一种语言。随着语言的流行和流行,我没有时间重写我的书。语言不是我书中的重点,而是您可以使用自己喜欢的语言进行操作。我的书关注永恒的真理。

因此,我将继续使用英语作为TAOCP中的高级语言,并且我将继续使用低级语言来指示计算机的实际计算方式。如果读者只想查看使用流行语言以插件方式打包的算法,则应该购买他人的书籍。

好消息是,当RISC机器具有良好的简洁设计时,RISC机器的编程既轻松又简单。因此,我不必讨论奥秘的,琐碎的小细节而分散了要点。在这方面,MMIX将大大优于MIX。

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.