Niklaus Wirth,或简洁之重要
Niklaus Wirth “简洁优先”的理念拥护者回顾了 Pascal、Modula、Oberon 及其后代,并将它们与 C、C++、Rust 等更复杂的主流语言进行对照。评论者权衡语言设计约束、编译速度与易用性如何影响现实中的生产力、教学和系统编程,常以 Go、D 和 Modula-3 作为 Wirth 思想的现代继承者。讨论还触及 Wirth 工作的历史影响——从 Apple 和 Borland 到 Logitech——并质疑当今的工具链与行业压力是否仍然奖励那些最小化、设计严谨的语言。
Pascal 与 C 以及语言设计取舍
- 一些评论者表示,“标准” Pascal 过于受限;他们花了很多时间做变通,而切换到 C 之后这些工作就消失了。
- 另一些人认为,Pascal 的简洁和结构让他们更高效,也澄清了编程的核心概念。
- 关于 C 的成功究竟是因为它更简单/更通用、更好的易用性(更短、更不啰嗦的语法)、Unix 生态协同,还是以上皆是,存在争论。
- 扩展(Turbo Pascal、Object Pascal、Clascal、Modula-2 等)被视为让 Pascal 适用于系统和应用开发的必要条件。
教学语言 vs 生产系统
- 许多人指出,最初的 Pascal 明确是为教学和在受限硬件上的单遍编译而设计的,而不是作为系统语言。
- 有人抱怨它在工业界被错误使用(“被叫去用驾校车挖沟”),并将责任归咎于管理决策而非语言本身。
- 在教育和分时环境中,较短的编译时间被强调为关键。
嵌套函数与闭包
- 讨论了具有外部作用域访问能力的嵌套函数(Pascal 风格),以及它们如何借助指向外层栈帧的“静态链”实现。
- 将其与 C++ lambda 和 trampoline 相比较;一些自制 VM 曾尝试更简单的方案,但在递归问题上碰了壁。
模块、接口与实现
- 对“模块化语言”存在混淆:有些人指的是 Modula/Oberon/Ada 风格的模块,另一些人则指 Java 式接口。
- 在 Modula-2/Oberon/C/C++ 之类的模块系统中,同一个接口头文件可以在全局范围内对应多个实现,但每次编译只会选择其中一个。
- Java 风格的接口(以及一些类似 ML 的模块系统)在类型层面上允许更灵活地存在多个实现。
简洁、复杂性与编译速度
- 一种观点认为:编译速度是衡量语言是否简单的试金石;编译快的语言(Go、经典 Pascal)反映了简单的设计。
- 反对意见则认为:编译速度不仅取决于语言复杂度,也受实现和工具链影响(例如 LLVM、头文件、模板);像 OCaml 这样的例子表明,非平凡语言也可以有很快的编译器。
- 关于现代 C++ 模块、缓存和工具链是部分修补还是根本复杂性的争论仍在继续。
对后续语言的影响
- Go 经常被提及:有些人认为它是受 Wirth 启发、继承了简单性的 Modula/Oberon 后代;另一些人则说它的主要谱系来自 Newsqueak 和 CSP,Pascal 家族的影响只是表层的(语法、包)。
- D 被指出借鉴了某些具体想法(例如嵌套函数),但并未整体采纳 Wirth 风格的极简主义。
- Modula-3 被称赞为一门“完整”但又精简的语言,预见了 C++ 的复杂性问题。
并发与简洁
- 关于为 Oberon(Oberon+)加入并发的延伸分支讨论:channel、monitor、actor、CSP,以及一门“简单”语言应当暴露多少原语。
- 这一点并无共识:有人认为一种构造(例如 channel)就足够了;也有人引用 Go 和其他生态的证据,指出多种原语仍被广泛使用。
对 Wirth 及其历史背景的反思
- 许多人表达了对“简洁优先”、小型编译器以及软硬件紧密协同设计的钦佩。
- 有人认为,Wirth 之所以能专注于简洁,是因为他所处时代的限制与较慢节奏;也有人强烈反对这一点,认为他的工作至今仍然相关,却被低估和少用。