把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

Common Lisp 的悲剧:为什么大型编程语言会大到爆

  • 2019-06-28
  • 本文字数:1867 字

    阅读完需:约 6 分钟

Common Lisp的悲剧:为什么大型编程语言会大到爆

本文分析了编程语言变得过于庞大复杂的原因,并讨论了如何进行控制。


改编自2015年的es-discuss主题帖子。“Common Lisp”不是主题。它只是众多说明性反例的其中之一。


自 2007 年以来,我一直是 JavaScript 标准委员会的成员。关于TC39,我们欣赏语言简单性的价值。但是,随着时间的流逝,我们对日益增长的复杂性失去了警惕。我们必须更好地理解这是如何自然发生的,如果不加以控制,那么代价是什么,以及该怎么办。本文不仅仅针对 TC39,还针对所有那些希望影响 JavaScript 标准或任何面临类似压力的人。请从我们的错误中汲取教训!



Algol、Smalltalk、Pascal 和早期的 Scheme 语言都因为小巧美观而备受称赞。早期的 C 语言和 JavaScript 语言因为很多事情受到合理的批评,但是很少被误认为是美观的。但是,它们很小,这方面受到了恰当和广泛的赞赏。当一种编程语言很小的时候,我们欣赏它通常是因为“我可以学整个内容,然后就可以掌握它了”,然后“我知道一切。我很高兴没有我不知道的”。对于 C 语言和 JavaScript 语言,很少有人认为他们实际上知道全部内容了——事实上,细节相当复杂。尽管如此,这种感觉还是让人们对日常使用的满意度大大增加了。


JavaScript 的小巧美学贯穿 EcmaScrip-5。对于 EcmaScript-5 和 EcmaScript-2015,我都参与了很多工作,并且我为自己在这两项工作中做出的贡献感到自豪。EcmaScript-2015 的规模更大一些,尽管如此,它仍然是一种更好的编程语言。考虑到我们工作的起点,如果在规模上没有增加,那么我们不可能在 JavaScript 的实用性方面获得这些成果。对 EcmaScript-5 发展到 EcmaScript-2015 所添加的大多数新增功能,我不后悔。对其中的很多功能,如果我们把 EcmaScript-2015 标准流程重做一遍,我可能会做类似的添加工作。


把 EcmaScript-5 发展到 EcmaScript-2015,添加的每个功能都必须通过一个非常高的标准。从心理上讲,这对我们所有人都有意义,因为我们从 EcmaScript-5 这个语言开始,我们仍然可以欣赏它的小巧。当一种语言很小巧时,添加的每个功能都能直观地感觉到语言的规模大小有显著比例的增加。一个功能的特定好处对它的拥护者来说总是可以看到的。对于小巧的语言来说,人人都可以看到新功能增加复杂性的总体成本。



JavaScript 的未来?


一旦一种编程语言超过了一定的复杂度,比如 LaTex、Common Lisp、C++、PL/1 和现代 Java,那么编程体验就更像是从一个看似无尽的功能海洋中划出一部分功能供个人使用,而功能海洋中的大部分我们从不会去学习。而一旦感到一种编程语言变成无限时,新功能的特定好处仍然显而易见。但是,新功能增加复杂性的总体成本不再可见。那些讨论新功能的人不再感觉到这些。无穷加上 1 还是等于无穷。甚至,一个很大的数字加上 1 后还是一个很大的数字。这不是一刀毙命的死亡,导致了这些怪物无限制地成长。


因此,我请每个对编程语言有影响的人在考虑新功能时,设置一个更高的标准,而不只是这个标准:“如果我们也用这种方式来编写,是不是会更好?”我认为,EcmaScript-2015 处于中间地带,无限制的增长还不可避免。作为社区,我们需要对 EcmaScript-2015 已经发展到的规模有共同的恐慌感。理想情况下,随着我们的规模接近不可逆转的临界点,我们的恐慌感应该进一步增加而不是减少。

一些区别


保持小的非均匀压力


随着我们从核心语言转向标准化库,极简主义的紧迫性变得越来越弱。整个标准语言可以看作是由以下主要部分组成:


  • 基本语法——不能通过对其他语法的局部扩展忠实地解释的特殊形式

  • 语义状态——计算操作的状态

  • 内核内置——内置库中提供功能的部分,如果不存在,那么无法通过用户代码提供。

  • 非内核 intrinsics——内置在可以用 JavaScript 实现的库中,但是,语义状态或内核内置依赖这些库。比如,借助代理,能够采用用户代码实现数组(Array)。但是,其他内核内置已经特别依赖于数组,使其比任何置换都有特权。

  • 语法糖——可以通过对基本语法的局部扩展来解释的语法

  • 全局便利库——可以通过非特权用户代码实现,但是,在原始全局命名空间中给出标准的全局命名路径

  • 标准便利模块——祝福社区开发的模块成为标准


根据我对增长成本和极简主义的紧迫感,我把这些按顺序列出。对所有这些,我们仍然需要训练纪律。只是对最后一项,我们应该考虑绝对大小的增长是无限的;当我们等待候选者通过事实上的社区接受过程首先证明自身时,只限制增长率。理想情况下,TC39 无论如何都应该不再是最后一项的瓶颈,因为外部事实和法律上的过程完全能够独立地讨论和发展标准便利模块。


原文链接:


The Tragedy of the Common Lisp:Why Large Languages Explode


2019-06-28 13:3517193
用户头像

发布了 199 篇内容, 共 94.0 次阅读, 收获喜欢 295 次。

关注

评论

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

故障定位系列-容器CPU问题引起的故障如何快速排查

乘云数字DataBuff

故障定位 SRE 智能运维 故障排查/诊断

YashanDB|跑批性能调优必看:这几个参数设置请注意

数据库砖家

数据库

区块链内容创作全攻略:海报、白皮书与视频的视觉化革命

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

DeFi开发系统软件开发:技术架构与生态重构

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

公链钱包开发:技术逻辑与产品设计实践

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 代币开发 交易所开发公链开发

YashanDB EMPTY_BLOB函数

YashanDB

YashanDB FIRST_VALUE函数

YashanDB

YashanDB ST_AREA函数

YashanDB

YashanDB|大整数插入报错 YAS-00013?可能是数据类型没对上

数据库砖家

数据库

英特尔持续推进核心制程和先进封装技术创新,分享最新进展

E科讯

YashanDB EXP函数

YashanDB

YashanDB FIND_IN_SET函数

YashanDB

YashanDB GET_TYPE_NAME函数

YashanDB

YashanDB ST_ASBINARY函数

YashanDB

YashanDB|UNDO 表空间持续增长怎么处理?一文教你排查+优化

数据库砖家

数据库

YashanDB 知识库|MySQL 迁移后 CHAR 字段多出空格?问题可能出在这里

数据库砖家

数据库

YashanDB EMPTY_CLOB函数

YashanDB

YashanDB EXTRACT函数

YashanDB

YashanDB 知识库|MySQL 的 GROUP BY 语句迁移到崖山时报错?原来是这个规范不同!

数据库砖家

数据库

YashanDB|使用 Kettle 同步 PostgreSQL 数据时报错:pg_hba.conf 无法识别连接?

数据库砖家

数据库

YashanDB FLOOR函数

YashanDB

YashanDB GEOMETRYTYPE函数

YashanDB

Mint Blockchain 与 Chainlink 达成战略合作:赋能跨链创新

NFT Research

blockchain web3

DApp开发:开启去中心化应用新时代

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

YashanDB|Kettle 同步大表报错 “无法创建 Java 虚拟机”?别忘了调整内存

数据库砖家

数据库

观测云:安全、可信赖的监控观测云服务

观测云

安全

Arthas jad(字节码文件反编译成源代码 )

刘大猫

监控 Arthas 监控工具 jad 字节码文件

YashanDB ENCRYPT_AES128函数

YashanDB

通义视觉负责人薄列峰离职;ElevenLabs 开源 Next.js 音频入门套件,几分钟搭建对话式 AI丨日报

RTE开发者社区

YashanDB|崖山共享集群(YAC):从怀疑到认可,技术细节决定产品成色

数据库砖家

数据库

英特尔以系统级代工模式促进生态协同,助力客户创新

E科讯

Common Lisp的悲剧:为什么大型编程语言会大到爆_语言 & 开发_Mark S. Miller_InfoQ精选文章