写点什么

Brain Kernighan 揭秘语言设计成功之奥妙

  • 2015 年 12 月 02 日
  • 本文字数:2193 字

    阅读完需:约 7 分钟

语言设计成功的奥秘何在? Unix 的开发贡献者之一、Awk 创始人 Brian Kernighan,试图在诺丁汉大学的一次采访中揭开语言设计的神秘面纱。

在此次采访中,Kernighan 将重点放在特定领域的语言上,也就是在特定的应用领域中解决特定问题的语言。这些语言应用范围狭窄,也没有必要图灵完备。Kernighan 对这些语言感兴趣,是因为相比那些复杂的语言,如 C++ 等,这些特定领域应用的语言能为语言设计工作和设计者提供一个更加可行的途径。特定领域中获得成功应用的语言包括正则表达式, shell, Awk, XML, HTML, SQL, R 等。

一种语言的标记符号是其设计的基本组成部分,直接决定了开发者能否毫不费力、不花费多余时间和精力解决特定问题(但可能在其他类型的问题中表现更好)。此外,Kernighan 认为,标记符号将会直接影响我们思考问题的方式。

Kernighan 分析的第一个例子是 Awk,并借用一个模式行为范例来向使用者展示如何操作。Awk 的设计目标是简单的一行式代码,尽管 Awk 可以被“滥用”于书写很长的代码,但是短代码仍然更有效。Awk 语言标记符号的另一个特点是与 C 语言相似,这为使用者节约了更多的时间去学习新语法和语言结构。这也被 Kernighan 肯定为 Awk 语言的优势之一。

一行式的程序语言引导 Kernighan 将更多精力放在制定语言的特定功能上,如无类型声明,自动初始化,内置变量,字符串和数字的转换,支持关联数组和正则表达式,控制流语句和内置函数。

同样重要的是 Awk 的设计使得学习成为可能。首先,人们将采取意料之外的方式运用语言工具,不可避免地犯错误,并且这种现状很难改变。特别地,对于 Kernighan 而言,避免在新的语言中增加新功能,或试图修正或提高特定的功能是很重要的,因为这些行为都会破坏语言的稳定性。另外,事后增加一些新的符号通常会使得语法缺乏一致性。

Kernighan 举的第二个例子是 AMPL,一种数学建模语言,基于一系列值变量和约束条件求解最优化的问题。Kernighan 是这个语言的设计者之一,同时也是语言的最初使用者。AMPL 提供了声明语法,用来描述问题变量和约束条件。AMPL 还提供了数据规范语言来描述数据和命令语言控制 AMPL 的操作。

Kernighan 介绍说,AMPL 的一些特点能使它获得适度的成功。特别地,它只局限于解决特定的问题,大学教学中使用它,使得它很快就在教育行业得到广泛应用。它的符号标记最初是纯声明,后来加入更多机制,如条件语句,循环,函数,即这些实现了语言的图灵完备。这也同时带来了一些奇怪的和不规则的语法。另外,AMPL 是正封闭源代码,这无疑促成了它的成功,但是,正如 Kernighan 所说,这也引起了很多人的探讨。

Kernighan 介绍的第三种语言是 EQN——一种数学排版语言,这是他和 Lorunda Cherry 在 1974 年设计的。EQN 的设计理念是实现按照人们日常读公式的方式来书写数学公式,并且为 TeX 的实现启发了灵感:

复制代码
x sup 2 + y sup 2 = z sup 2
f(t) = 2 pi int sin(omega t) dt

此语法使用简单,连那些在数学方面并没有很深造诣的贝尔实验室打字员都可以使用 EQN。EQN 的一个重要的基础就是将其输出通过管道馈送到 Troff 中,主要是考虑到在该语言程序被创造时的计算机内存约束。Kernighan 说,依靠现有的工具是实现 DSL 和降低复杂度低的一个很好的方法。

Kernighan 创造的另一种格式编辑语言是 Pic,它试图将文本描述转换成线性绘图。Pic 的优点是:很容易实现系统性的改变,保证正确的尺寸,并使用循环语句和条件创建重复的结构。此外,这种语言正在使用 Troff 作为输出端,并将其插入到 Pic 的预处理器中。Pic 是通过使用 YACC 和 LEX 实施,这更容易依靠语法实现,不需要太多的协调规范就实现了自由的英文式的语法形式。以下是一个简单的用 PIC 实现的流程图:

复制代码
arrow;
box "input";
arrow;
box "process";
arrow;
box "output";
arrow

基于以上的例子,Kernighan 提出了几个原则,阐释了语言设计取得成功的要点:

  • 新的语言能解决实际问题,并且比其它方法做的更好。
  • 这些语言是在“文化”上兼容,并且语法结构是相似的。很多语言看上去都类似 C 语言的语法结构,学习起来更容易上手。
  • 它们与现有工具生态系统相兼容,不需要重新购买一个完整的新环境,或放弃使用标准工具。
  • 它们是开源的——特别是在当下时代至关重要,Kernighan 说道。
  • 它们少有竞争对手,这是幸运的。

另外,还有一些因素会导致语言失败,虽然语言从未完全消失:

  • 语言存在于一个基于消失的小众应用领域的环境中,正如发生在 Kernighan 所创造的基于 Troff 的语言上面那样。
  • 语言或过于庞大、或过于复杂、 或过于迟缓、或出现过晚。这里特别提到两个语言:Perl 6 明显是太晚。C++ 明显太大、太复杂,尽管 C++ 仍然被很多新开发程序使用。
  • 它们是基于对贫困哲学的选择,当它们牺牲实用性或太“数学”或太“不同”,这两点都会减少用户的数量。

Kernighan 的最后一句话是引用 Alan Perlis 的话,可以作为创建新语言的一种激励和指导,尝试结合过去的方法来把这些语言做得更好:

“在程序里我们始终有话要说,但是所有已知的语言都无法表达得很好。”

查看英文原文: Brian Kernighan on Successful Language Design


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015 年 12 月 02 日 18:001044

评论

发布
暂无评论
发现更多内容

架构师训练营第四周作业 - 学习总结

阿德儿

【JS】Array.from() 将伪数组转换成数组

德育处主任

JavaScript js ES6 array 28天写作

云游戏的那些事儿!读《大厂们的下一件大事儿》有感

李忠良

28天写作

微信直播也有跳舞小姐姐了 | 视频号28天(17)

赵新龙

28天写作

产品 0 期 - 第一章作业

让时间说真话

产品经理

Java-可重入锁

hepingfly

Java 可重入锁

请用思维导图画出架构师训练营所有技术知识点

DL

第二章作业

DF

产品经理训练营第二周作业-利益相关者

隋泽

产品经理训练营

时间复杂度与常见排列算法

Changing Lin

算法

如何基于海思芯片快速搭建Agora RTC应用

Hanson

WebRTC

第九周作业

Binary

吐血整理:推荐几款顶级好用的IDEA插件

Silently9527

Java intellij-idea idea插件

架构师训练营第四周作业 - 命题作业

阿德儿

28天瞎写的第二百二十七天:离开后要留下什么?

树上

28天写作

【函数计算实践】一个应用案例

程序员架构进阶

阿里云 架构 项目实战 函数计算 28天写作

JavaScript08 - 数组

Mr.Cactus

JavaScript

【CSS】页面顶部阴影

德育处主任

CSS 大前端 html/css CSS小技巧 28天写作

架构师训练营第4周作业



线程的三种等待唤醒机制(面试必问)

hepingfly

Java 线程 等待唤醒

开发质量提升系列:checklist投产检查列表(上)

罗小龙

代码质量 28天写作 checklist

大数据知识专栏 - 数据仓库

小马哥

大数据 hive 数据仓库 七日更

机器学习·学习笔记之:无监督学习

Nydia

GNUCash 2: 缺点

lidaobing

GNUCash 28天写作

从明天起做一个早起的人

IT蜗壳-Tango

七日更

【JS】Array.of() 创建数组

德育处主任

JavaScript 大前端 js ES6 28天写作

LeetCode题解:105. 从前序与中序遍历序列构造二叉树,Simple O(n) without map,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

JVM 垃圾收集算法

看山

JVM 垃圾回收算法

批判性思维自修课(一)

石君

28天写作 批判性思维

学习“利益相关者”后对自己工作的一点思考

隋泽

第九周学习总结

Binary

Brain Kernighan揭秘语言设计成功之奥妙-InfoQ