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 之所以能专注于简洁,是因为他所处时代的限制与较慢节奏;也有人强烈反对这一点,认为他的工作至今仍然相关,却被低估和少用。