2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

最强总结——分布式事务处理方式

小闫

面试 分布式 分布式锁 分布式存储 分布式缓存

【week05作业】

chengjing

Uniapp使用GoEasy实现websocket实时通讯

GoEasy消息推送

uni-app websocket 即时通讯

公司制的黄昏:区块链重构商业世界

CECBC

区块链思维 裂变 契约 激励

码农必备SQL高性能优化指南!35+条优化建议立马get

码哥小胖

MySQL SQL语法 sql查询 sql

阿里P7岗位面试,面试官问我:为什么HashMap底层树化的标准元素个数是8

鄙人薛某

Java 面试 hashmap 哈希

一篇文章深入理解分布式锁

itlemon

redis 分布式锁

正确的做事比做正确的事更重要

魔曦

架构师 极客大学架构师训练营

程序员是这样解读《隐秘的角落》

陈东泽 EuryChen

学习 程序员 隐秘的角落

打造Redis分布式环境下的银弹?我觉得Redisson比Redlock更胜一筹

码农月半

Java redis redis高可用 Redis项目

产业区块链发展迎来爆发期

CECBC

产业区块链 系统稳定性 应用安全性 信任的机器

架构师训练营 - 第 5 周学习总结

红了哟

最右JS2Flutter框架——开篇(一)

刘剑

flutter 大前端 探索与实践

阿里内推面试,挂在了一道简单的问题上…

小新

Java 阿里巴巴 程序员 架构 面试

week5

Geek_2e7dd7

week5 学习总结

Geek_2e7dd7

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

红了哟

【week05】总结

chengjing

Spring Boot 多数据源 Redis 配置

南南

redis 面试 Spring Boot Redis作者

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

牛牛

极客大学架构师训练营 命题作业 一致性Hash算法

第五周总结

武鹏

搞懂Spring事务失效的8大原因,轻轻松松面试过关

码哥小胖

Java spring Spring Boot

老龄化时代的人机共生:京东数科以AI机器人推动产业增长

脑极体

架构师训练营 - 第五周 - 学习总结

韩挺

啃碎并发(一):Java线程总述与概念

猿灯塔

深入理解队列:LinkedBlockingQueue源码深度解析

itlemon

阻塞队列 LinkedBlockingQueue Queue

20道Redis面试题(含答案)面试官会问的我都找到了

你是人间四月天

redis 面试 Spring Cloud redis6.0.0 Redis项目

这份架构PDF如何得到百度、洋码头、饿了么CTO等大咖联袂推荐?

小新

Java 架构 面试 队列

Week5 学习总结

wyzwlj

极客大学架构师训练营

让你大显身手——掌握RocketMQ与Kafka中如何实现事务

小谈

kafka 面试 RocketMQ JVM原理

记录一次拼多多Web前端面试【一面+二面+hr面】

阿文

面试 Spring Cloud Spring Boot Web

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