2.5 一些观点
一个观点值得80分的智商——Alan Kay[^Q38]\ 好吧,如果您有两种方式,那么其中一种是真实的:机器执行什么。而另一个则不是。只有当第一种方法比另一种方法简单太多时,第一种方法才有价值。———Ken Thompson[^Q80]
好的方式去考虑系统问题的可以使事情变得容易,就像质心坐标系可以使动力学问题更容易一样。不是说一个观点比另一个观点更正确,而是出于某种目的更方便。许多反对者反映了这一想法。以下是一些替代观点的示例,稍后将详细讨论:
- 正在与正在成为:系统状态是变量值(映射),或者是导致其变化的操作序列(日志)。
- 用于兼容性的接口适配器是组件的一部分,可使其适应许多环境,或者是环境的一部分,从而使其对许多组件都是好客的。
- 迭代vs.递归,列表vs.树:您可以一遍又一遍地做同样的事情,也可以将一个案例划分为多个子案例,然后继续划分,直到非常简单为止。
- 声明式与命令式,解决方案与机器式,内涵式与扩展式:通过结果的属性或满足的方程式或实现步骤,或通过列出每个输入结果的表格来定义结果。
- 解释器与编译器:同一程序,但不同的原始操作(x86机器指令,C语句,Java虚拟机指令,Lisp函数或关系查询)可为您提供不同的速度,大小或更改的便利性。
2.5.1 符号
通过减轻大脑的所有不必要工作,好的记号可以将精力集中在更高级的问题上,实际上可以提高种族的智力。——A.N. Whitehead[^Q91]\ 我的语言的极限就是我的世界的极限。—Ludwig Wittgenstein [^Q94]\ 用被认为很糟糕的语言开发的有用系统要比用美丽的语言开发的有用系统多得多—Bjarne Stroustrup[^Q75]
符号与观点密切相关,因此重要的事情容易思考。每个系统至少都有一些自己的符号:它定义的数据类型和操作,这是一种没有特定语法的领域特定语言(DSL)。符号也可以通用:诸如C或Python之类的编程语言,或诸如C++标准模板库之类的库。或者它可以用于域:像Unix shell(用于顺序字符串处理)或Julia(用于数值计算)之类的DSL,或TensorFlow(用于机器学习)之类的库。
符号包含:
- 词汇表:用于命名相关对象和动作(shell的grep,awk,cat等)的词汇表。 通用术语使人们更容易:“ sort”用于不同的排序方法,“ tree”用于部分有序或递归结构。 在规范中,基础应该是数学,最常见的是关系。
- 语法:将它们串在一起的语法(在shell中,“|”表示管道,“>”表示重定向,等等)。 在DSL中,语法是一种使域中的普通事物易于编写和读取的方法。 相比之下,通用语言的库必须使用该语言的语法,通常是方法选择和函数调用,如本例中来自Python中的Spark:
df.select(multiply(col("x"), col("y")))
。
有一些工具可以使构建DSL变得容易,但是成功的DSL往往会演变为通用的工具,从而失去许多简单性和优雅性。
除了与域很好地匹配外,DSL可能还不错,因为它易于优化(例如在SQL查询中),或者因为它提供了有用的属性,例如类型安全性或可预测的执行时间,即使将其编译为较低级别的语言也是如此。 诸如C或机器代码之类的语言,其中本机程序缺少这些属性。 有时,它可以将DSL嵌入到通用语言中,例如C#中的Linq(语言集成查询)。
语言比库需要更多的部分,但是依旧有很多优点:
- 它提供了语法糖,使程序更短且更易于阅读。
- 它可以执行更多的静态检查; 库仅限于宿主语言对参数和结果的类型检查。
- 从整个程序和对原语的了解来看,它可以更好地进行优化。