Replies: 2 comments
-
https://github.com/asukaminato0721/Software-Design-for-Flexibility-Translation epub ,双语对照,gpt 翻译的 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
基本信息
Sussman教授最近发布了一本新书 Design Software for Flexibility,如果您仔细阅读了本项目的README,您会发现,这本书实际上是 MIT 6.945/6.905 的教科书,只是说最近正式出版了。
从封面来看,基本上可以认为是 SICP v2。(当然,Sussman之前还有一本讲经典力学的,SICM)。而从其目录内容来看,也基本上是SICP的深化(很多内容都可以再SICP中找到对应章节),目录粗译如下:
想调查一下诸位对此书的态度。
粗略地翻译了一下Preface,注意本书是CC BY-SA 4.0的License,我把声明放在文末
序言
我们大都花费了太多的时间尝试改造旧的代码片段,以便将它们适配于在初次编写它们时没有料想到的用途上。这是时间和精力来说是一种极大的浪费。不幸的是,我们所面临的大量压力使得所编写的代码在特定用途上运行良好,却难以重用。我们认为这是没有必要的。
很难构建出这样的系统——在超出其设计者所预期的更大范围的情况下,它都能够做出可接受的行为。最好的系统是可演进的(evolvable):只需稍作修改,便可以适应新的情况。我们怎样才能设计出具有这种灵活性的系统呢?
为了向程序中添加新的功能,如果我们仅仅需要添加新的代码,而无需修改已有的代码库,那样就太好了。我们通常可以通过使用某种组织原则来构造代码库,同时预留适当的钩子(hook)来达到目的。
从对生态系统的观察中,我们学到了很多关于如何构造灵活、可演进的系统的知识。最初为支持符号人工智能而开发的技术,可以看作是增强程序和其他工程系统的灵活性和适应性的方法。【相比之下,计算机科学目前普遍实践积极地阻碍了构建易于修改以用于新颖设置的系统的建设。】
我们经常在编程时将自己推到角落,并且不得不花费大量的精力来重构代码以逃脱这些困境。现在,我们已经积累了足够的经验,可以识别、分离和演示我们发现对构建大型系统有效的策略和技术,这些大型系统可以适应原始设计中未曾预期的意图。在本书中,我们分享了我们100多年编程经验的一些成果。
关于本书
本书是麻省理工学院计算机程序设计教学的成果。我们在多年前开始了这堂课,旨在让高级本科生和研究生接触对构建人工智能应用至关重要的程序(例如数学符号操纵和基于规则的系统)有用的技术。我们希望学生能够灵活地构建这些系统,以便将这些系统组合起来以构成更强大的系统变得更加容易。我们还想教给学生有关依赖性的信息-如何对其进行跟踪,以及如何将其用于解释和控制回溯。
尽管该课程取得了成功并取得了成功,但事实证明,一开始我们对材料的了解不如我们最初所相信的那样。因此,我们付出了很大的努力来完善我们的工具并使我们的想法更加精确。现在,我们意识到这些技术不仅适用于人工智能应用。我们认为,任何构建复杂系统(例如计算机语言编译器和集成开发环境)的人都将从我们的经验中受益。这本书建立在我们班上现在使用的讲座和习题集的基础上。
关于内容
这本书涵盖的内容远超一学期课程所能覆盖。因此每次授课时,我们会从中遴选部分。第1章介绍了我们的程序设计哲学。在这一章,我们展示了自然界和工程学的大背景下的灵活性。我们试图指出,灵活性与效率和正确性一样重要。在随后的每一章中,我们将介绍技术并通过一系列练习来说明它们。这是本书的重要组织原则。
在第2章中,我们探讨了一些通用的构建方法,可用于便构建留有增长空间的系统。组织灵活系统的一种强效方法是将其构建为领域专用语言的组合,其中每种语言都适于轻易地表达子系统的结构。本章中,我们开发了用于构造领域专用语言的基本工具:我们展示了如何围绕混合与匹配(mix-and-match)的组件组织子系统,如何将它们与组合子(combinators)灵活地结合,如何使用包装器(wrapper)来泛化组件以及如何可以通过抽象出域模型来简化程序。
在第3章中,我们介绍了一种极其强大但有潜在危险的灵活性技术——基于谓词分派实现的通用过程。为了处理符号代数表达式,我们开始泛化算术系统。然后,我们展示了如何通过使用类型标签使这种泛化更高效,并通过设计一个简单但易于阐述的冒险游戏来展示该技术的威力。
在第4章中,我们介绍了符号的模式匹配,首先启用项重写系统(term-rewriting systems),然后是合一(unification),用于展示如何轻松地进行类型推断(type inference)。在这里,由于分段变量(segment variables),我们需要回溯(backtracking)。我们会从合一那里首先看到,表示和组合部分信息结构的威力。我们在本章末尾会将该思想扩展到匹配通用图。
在第5章中,我们探讨了解释和编译的力量。我们认为,程序员应该知道如何摆脱他们必须使用的程序设计语言的束缚,通过在其中编写一门语言的解释器,来实现一门更适合的语言用于解决挡墙的问题。我们还将展示如何通过在解释器/编译器系统中实现非确定性的amb来自然地合并回溯搜索,以及如何使用继续(continuations)。
在第6章中,我们展示了如何创建数据分层和过程分层的系统,其中每个数据项都可以使用各种元数据进行注释。底层数据的处理不受元数据的影响,并且用于处理底层数据的代码不会引用甚至不知道元数据。然而,元数据由其自己的过程进行处理,与数据有效地并行进行。我们通过将单位附加到数值数量上并通过显示如何携带相关性信息(给出原始数据派生的数据来源)来说明这一点。
所有这些都在第7章中进行了汇总,在第7章中,我们介绍了传播系统以摆脱计算机语言的面向表达式的范式。本章中,我们可以看到将模块连接在一起的接线图(wiring-diagram)。这允许灵活地合并部分信息的多个来源。使用层次化数据来支持对依赖项的跟踪可以实现依赖制导的回溯(dependcy-directed backtracking),从而大大减少了大型复杂系统中的搜索空间。
这本书可以用来做各种高级课程。在随后的所有章节中,我们将使用第2章介绍的组合子思想和第3章介绍的通用过程。但是第四章中的模式和模式匹配以及第五章中的求值器在以后的章节中没有使用。以后需要的第5章中唯一的材料是5.4和5.4.1节中对amb的介绍。第6章中的分层思想与通用过程的思想紧密相关,但是有一个新的变化。在第6章中作为示例介绍了使用分层实现依赖项跟踪的方法,成为传播中的重要组成部分(第7章),在传播中,我们使用依赖项来优化回溯搜索。
Beta Was this translation helpful? Give feedback.
All reactions