文档结构  
翻译进度:已翻译     翻译赏金:6 元 (?)    ¥ 我要打赏

编程语言的效率和类型安全常常被评估,但友好呢?我在探索人类的价值观是怎样被应用于编程语言环境,特别是童子军法律中的12点:值得信赖、忠诚、乐于助人,友好,有礼貌,善良,孝顺,开朗,节俭,勇敢,干净,和虔诚的。

警告:此帖子对编程语言有很强的主观意见。观众自由定夺。

简介

在讨论编程语言时,我们倾向于关注数学/逻辑对象。这种语言精准并模块化,那种缺乏正式语义,这种严格遵循范式,那种很好匹配公式。但是,语言及其相关的编译器最终不是抽象的概念,而是人们实实在在使用的工具,带有更多的价值而不仅是纯粹的数学。作一个有趣的思想实验,如果我们把期望从别人身上得到相同的价值观这一现象归因于编程语言会怎么样?

关于良好的价值观,我们可以看到经典的组织致力于向年轻人灌输老式的美国价值观: 美国童子军[1]。具体来说,所有的童子军被要求遵守童子法,奉行以下12点价值观: “童军是值得信赖、忠诚、乐于助人,友好,有礼貌,善良,孝顺,开朗,节俭,勇敢,干净,和虔诚的。” 在本文中,我将探讨如何将这些价值观应用于编程语言的上下文中。

第 1 段(可获 2.89 积分)

应用这些法则

一个简短的前言:为了简洁,我把编程语言和编译器放在一块,互换地指代它们。我的关于人类广泛的价值观比如‘友谊’的解释显然不是权威,不过我只是想引燃关于该主题更多的讨论。

  1. 值得信赖。一个值得信赖的语言是你相信它能够保护你的秘密而不是在背后搞乱你程序的语义。这样的语言应该具有 ASLR(Address space layout randomization,地址空间布局随机化)能力,并且具有专家设计的加密库,那样用户就不用自己造轮子。例如,一种语言不应该以不合理地方式强制你的类型当你并不需要时——我们理应为动态类型(运行时检查的类型)和弱类型(类型错误时强转而不是失败)感到迷惑。可信任是生产力中基本的元素。当一个程序员不信任他的编程语言是,他不得不防守式地编程,面对自己和编译器的bug而战斗。一个值得信赖的语言使它的使用者感到轻松而关注于手头的任务。
  2. 忠诚。当一个语言能随着它的使用者,而不是拥有者或公司的统治者的喜好而演化时它就是忠诚的。当语言不会变得完全不同,使用它的基本特性而不被公司起诉时,我们会感到舒服。
  3. 乐于助人的。一个编程语言能以无数的方式成为“乐于助人的”,但是一些新的语言往往错过的一方面是帮助编程者理解自己的错误。它应该有一个久经考验的调试器。你不应该需要额外的软件来破解你编译器的稠密和神秘的构建输出。为了赢得嘉奖,你的编译器应该能解释为什么这个程序员遇到了错误,为了成为最佳,它还应该能建议一个解决方案。
  4. 友好。对于一个语言,如果它被认为对新手是开放的是最有意义的。例如Python就是易于上手的,而当第一次学函数型语言时,标准ML却是一个巨大的敌人。友好语言很重要的部分是具有REPL(Read-Eval-Print Loop,交互式编程环境)——它允许新手能接触语法并对新语言得到快速体验而不必吃力地通过上百次编译错误或巨大的IDE。作为推论,动态语言往往更友好,因为它们是以小片段运行的。它们允许编程者不到必要时无需关心一些小错误。
  5. 有礼貌。任何编程语言都得遵守普通的礼节:它应该懂得自我清理(编译器管理内存),并且能恭敬地和长辈交谈(有C语言的外部函数接口,原文FFI,(Foreign Function Interface)。
  6. 善良。在我看来,善良和其他像友好,礼貌等价值观区别的因素是它的意图。对于一个善良的语言,它的设计者相应地也需要是善良的。我从未听说过一个语言的设计者意图创建一个对用户和社区有害的语言(尽管必须看像Ken Thompson 一样的人),但是人们应该永远小心(尤其是对闭源的语言)。语言设计者应该和他们的社区有明确,开放的对话,以避免意图被误解或对自身不利。
  7. 顺从。和值得信任一样,一个顺从的语言应该总是只做被告知的任务。语言的库应该清楚地命名并且文档化。如果一个函数不得不失败,它不应该静静地,应该能供给编程者处理错误(错误代码被认为是有害的)。语言应该被正式地规范化,编译器应该严格遵守规范,大声地告知编程者哪里不符合规范。
  8. 令人愉快的,这可能编程语言中最难应用,因为在鼓励和傲慢之间只有一条细线。毕竟,没有人会希望编译器会这样说:(我看见你在64行少了个分号)
    然而,当一个人能更加乐观时也可以说它是令人愉快的。悲观失望以及刻薄话并不是编译器(或任何软件)的重要部分。
  9. 节俭。一个语言应该能用小的或相对小数目的强大抽象而不是那些大数目更弱的抽象。更具体地说,如非必需不要在语言中有第一类型的概念,而是在库中实现它们。例如,Rust 在traits 中实现了iterators, Clojure 在库中实现了 gradual type 。同样,一个节俭的语言应该只关注所需要的并且尽可能偏好零成本的抽象。如果你的快速脚本只需要运行0.5秒但启动垃圾收集器得需要3秒,那这个语言就不是节俭的。如果你的构建过程要花费一个小时编译一个你从中只需要一两个函数的库(cough OpenCV),那这个语言不是节俭的。
  10. 勇敢。作为语言设计者,当创造一门新语言时不要怕自己太勇敢。尽管我收到了大量的对我最近推送的关于语言设计的文章的积极反馈,也有许多反对者坚持他们的机制和编辑器,他们会被时间和进展的潮流冲刷。让那成为一个新的类型系统,改变语法。在不违反其他的好语言设计的准则的同时尽管去做吧!
  11. 干净。就像人应该看起来闻起来干净一样,编程语言的语法也应该这样。尽管程序员经常喜欢在抽象的层次思考问题,一个语言的具体语法确实也是重要的。在大多软件开发过程中,代码是用来读而不是来写的,所以代码越易读,就越容易维护。请牢记:语言的设计者应经常指示社区所用的编码风格。避免任何从数学中带来的命名传统(例如单字母变量名),除非没人看你的代码或者它确实增强易读性。命名是重要的!
  12. 虔诚。无论你属于名词联合王国 还是Lambda 教堂,对所有的信念保持尊敬。更好的是,在设计语言时充分利用整个世界(见:前一篇文章)。不要强制用户从一个机制转向另一个,而是可以足够灵活地适应芸芸众生。
第 2 段(可获 13.13 积分)

结论

这篇文章不可避免的对立面是这样的:“但是,威尔,我不在乎我的语言是否友好,我只需要让它工作,我们应该关心效率,而不是这些抽象的人类观念。 这话说的不错! 我不会使用一种值得信赖的,但实际上并没有做任何事情的编程语言。 但是,我们不应该让讨论中的其他目标像效率一样消除。 如果我们推广具有上述价值观的编程语言,那么我们可以为现有的程序员以及寻求进入该技术的人创造一个更美好的世界。 语言设计师应该记住,他们的最终用户是人,而不是机器人[2],并因此进行设计。

请将您的意见发送到我的电子邮箱wcrichto@stanford.edu 或在Hacker News上讨论

参考

[1]是的,我知道童子军并不总是好的价值观的典范,是的,我知道童子军来自英国

[2]当然,除非你的语言是 LLVM

第 3 段(可获 2.15 积分)

文章评论

CY2
第二段太长啦 。。。。
Hornsey
13.13积分,这一段是不是可以再分解下呢!
CY2
拆不了了
班纳睿
:scream:
广州访客
你需要的是一根棒棒糖