HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

WWW 是否应该属于 URL?

devpoint

Cookie url SEO www

从零手写react-router

helloworld1024fd

JavaScript

从零开始实现一个Promise

helloworld1024fd

JavaScript

那些炫酷的CSS文字效果之诗词《兔》

南城FE

CSS css3 前端 动画

排障定位时间缩短一半, 博睿数据如何赋能青岛住房公积金管理中心

博睿数据

APM AIOPS 智能运维 博睿数据 精选案例

程序员该如何用“高科技”智能地教狗狗上厕所

风铃架构日知录

人工智能 深度学习 程序人生 后端 系统架构

22道js输出顺序问题,你能做出几道

loveX001

JavaScript

面试官:说说Event Loop事件循环、微任务、宏任务

loveX001

JavaScript

大厂前端面试考什么?

loveX001

JavaScript

前端二面经典vue面试题指南

bb_xiaxia1998

Vue

百度前端经典vue面试题整理

bb_xiaxia1998

Vue

高级前端常考手写面试题合集

helloworld1024fd

JavaScript

醉三皇成为第12届北京国际网络电影展官方指定用酒品牌

联营汇聚

vivo 故障定位平台的探索与实践

vivo互联网技术

根因分析 聚类 K-Means 二阶指数

React面试:谈谈虚拟DOM,Diff算法与Key机制

beifeng1996

React

京音平台-一起玩转SCRM之电销系统

京东科技开发者

架构设计 系统 scrm 企业号 1 月 PK 榜 电销

每日一题之Vue的异步更新实现原理是怎样的?

bb_xiaxia1998

Vue

Java Netty框架自建DNS代理服务器教程

小小怪下士

Java 程序员 Netty DNS

表格集算表高性能原理——怎样实现纯前端百万行数据秒级响应

葡萄城技术团队

年终盘点丨最受开发者欢迎的文章 TOP20

阿里巴巴云原生

阿里云 云原生

2023前端二面常考面试题合集

loveX001

JavaScript

前端高频react面试题整理

beifeng1996

React

分布式是大数据处理的万能药?

jiangxl

SOA 和微服务有何区别?

江南一点雨

Java 微服务 springboot SOA

简单谈谈Redis中的几种java客户端以及优缺点!

风铃架构日知录

Java redis 程序员 程序人生 客户端

每日一题之Vue数据劫持原理是什么?

bb_xiaxia1998

Vue

带你用20张图了解什么是 JVM 运行时数据区

风铃架构日知录

Java 程序员 JVM 码农 内存

前端必会手写面试题合集

helloworld1024fd

JavaScript

社招前端react面试题整理

beifeng1996

React

安畅携手阿里云共建Landing Zone方案,助力企业上云无忧

云布道师

阿里云

react的jsx和React.createElement是什么关系?面试常问

beifeng1996

React

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