16

我是识字编程概念的新手。我正在阅读Donald Knuth关于这个主题的论文 (PDF),在一开始,在引言中,他说:

与其想象我们的主要任务是指导计算机做什么,不如专注于向人类解释我们希望计算机做什么。

他或她 [识字编程的实践者] 力求一个易于理解的程序,因为它的概念是按照最适合人类理解的顺序引入的,使用了相互加强的正式和非正式方法的混合。

然后,进一步阅读:

一个程序的一个特点是它的结构关系。一个复杂的软件由简单的部分和这些部分之间的简单关系组成;程序员的任务是陈述这些部分和那些关系, 以最利于人类理解的顺序——而不是像自上而下或自下而上那样严格确定的顺序

(...)

自上而下的编程让你清楚地知道你要去哪里,但它迫使你在脑海中保留很多计划;悬念不断增加,因为直到最后都没有真正确定下来。编程的优势在于,随着越来越多的子程序被构建,你会不断地使用越来越强大的铅笔;但它迫使您将整个程序组织推迟到最后一分钟,因此您可能会漫无目的地挣扎。

因此,WEB 语言允许人们以“意识流”的顺序来表达程序。TANGLE 能够将所有内容打乱成 PASCAL 编译器要求的安排†</sup>。WEB 的这一特性也许是它最大的资产。

上面的摘录让我对这个主题很感兴趣,所以我调查了一下。从任何搜索引擎提供的结果中不难看出 Haskell 和 literate 编程之间的关系,但我没有看到“人类理解的最佳顺序”。相反,我看到了一个非常完善的文档,同时保持了计算机工作所需的顺序。

  • 你能用“文学编程”这个词来解决这个顺序问题吗?
  • 有没有其他不需要“意识流”顺序特征的文学编程定义?
  • Haskell 真的有识字编程能力(使用 Knuth 的定义)吗?

最后,作为个人观点,我不得不说,即使 Haskell 所做的(可能还有许多其他语言所做的)也不是 Knuth 的文学编程,当涉及到对方法和算法的详尽描述时,我仍然喜欢这个想法。当评论远远超过代码时,它会起到很好的作用。


†</sup> WEB 和 TANGLE 是最初 D. Knuth 在他第一次实现识字编程概念时使用的系统的一部分。

4

1 回答 1

16

在大多数情况下,Haskell 在订购方面非常灵活。在 Haskell 模块中,所有的声明和定义可以以任何顺序出现。由于引用透明性,提取子问题以便在其他地方实现它们也很容易。

顺序很重要的主要领域是模式匹配。函数的所有方程必须在一起,并且由于它们按顺序匹配,因此它们不能总是重新排序。但是,我不认为这是一个重大限制,因为 (a) 这通常是非常局部的,并且 (b) 具有大量方程的大函数可以(并且可能应该)重构为更小的部分,然后更容易重新排序.

也许最烦人的约束是导入声明必须在模块的顶部。这确实稍微打破了意识流,许多用 Haskell 编写的识字程序都以“不要介意这些导入,稍后你会看到我们需要它们的地方”之类的声明开始。如果能够在文本中更自然的点命名导入,从上下文中可以清楚地知道为什么需要它们,这将更符合 Knuth 对文学编程的定义。

除此之外,我认为 Haskell 非常适合文学编程。它可能不完全符合 Knuth 的定义,但我认为它已经足够接近了。

于 2013-06-01T05:21:22.913 回答