写点什么

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:3517220
用户头像

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

关注

评论

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

Mysql大法-Mysql索引失效VS Mysql存储引擎

知识浅谈

8月月更

英特尔推出数据中心GPU Flex系列,以开放式软件堆栈助力开发者

科技之家

RT-Thread记录(十八、I2C软件包 — 温湿度传感器 SHT21与EEPROM 24C02)

矜辰所致

软件包 RT-Thread 8月月更

认识微服务 SpringCloud (史上最全学习路线)

微服务 spring could 8月月更

蚂蚁金服开源的这份SpringBoot笔记,曾在24小时内GitHub星标48k

收到请回复

Java 架构 面试 语言 & 开发 秋招

“阿里爸爸”最新Java面试指南,基础+框架+数据库+系统设计+算法

收到请回复

Java 架构 计算机 语言 & 开发

南洋迪克“整装”起飞,数夫系统打通端到端高效服务流程

神奇视野

并发量很大?阿里上传在GitHub的亿级流量百万并发手册爆火

退休的汤姆

Java 程序员 阿里 并发 秋招

【实用】用 FP 思想将 JS 循环做简单封装~

掘金安东尼

前端 8月月更

全卫定制龙头企业-伽蓝集团数字化转型之路

神奇视野

史上秋招最全500道Java面试题:JVM+分布式+算法+锁+MQ+微服务+数据库

退休的汤姆

Java 程序员 社招 Java工程师 秋招

前端工资涨不上去?可能是你没掌握构建工具:关于 Webpack、Babel、esbuild、Vite、Rollup、Parcel、SWC......的那些事

代码与野兽

前端 前端架构 前端工程化 webpack babel

采访236位第一批秋招上岸的同学后,我整理了这份Java面试手册

收到请回复

Java 架构 面试 语言 & 开发 秋招

记一次血淋淋的MySQL崩溃修复案例

华为云开发者联盟

数据库 后端

网络知识平面简介

俞凡

网络 知识平面

JVM性能调优都做了什么?阿里内网JVM虚拟机性能调优指南给出了答案

退休的汤姆

程序员 JVM 面经 社招 秋招

【导航】RT-Thread 学习专栏目录 【快速跳转】

矜辰所致

目录 RT-Thread 8月月更

契约测试的三种模式

agnostic

契约测试

Python图像处理丨图像的灰度线性变换

华为云开发者联盟

Python 人工智能

九章云极DataCanvas公司携因果学习开源重器登录WAIC!

九章云极DataCanvas

人工智能

被裁后半月面试8家公司无果,凭借这份Java面试指南成功入职阿里

收到请回复

Java 架构 语言 & 开发

数夫携手图森,打造高整木定制数字化标杆

神奇视野

Solana流支付协议Zebec完成850万美元融资,CircleVentures等参投

小哈区块

面对数字化转型,金融ITer要补的第一堂课:运营

王和全

数字化转型 运营 数据运营 金融业cio指南 证券行业

想要达到阿里P6?最少啃完这本500页Java并发多线程源码笔记

收到请回复

Java 程序员 架构 技术管理 语言 & 开发

DTSE 技术讲座 |云原生架构下的数字身份治理实践

华为云开发者联盟

云计算 云原生 后端 SaaS

后端开发必备:mysql数据库建表的15个小技巧

Java永远的神

MySQL 数据库 程序员 面试 后端

后台服务架构高性能设计之道

C++后台开发

后台开发 后端开发 Linux服务器开发 高性能服务器 C++开发

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