阿里云飞天发布时刻,领先大模型限免,超7000万 tokens免费体验 了解详情
写点什么

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

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

关注

评论

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

【稳定性】秘密武器--功能开关技术 | 京东物流技术团队

京东科技开发者

稳定性 企业号9月PK榜 功能开关

MAC手动修复『已损坏』问题 终端运行命令报错处理

展初云

Mac Mac软件

CPU性能指标简览

DevOps和数字孪生

仿真建模 CPU性能

1分钟完成1000万key数据对比

NineData

redis Redis 核心技术与实战 redis 精讲 数据对比 NineData

基于Java开发的工作流系统(springboot+activiti源码)

金陵老街

springboot Activit

Petal 出行新人超值百元大礼包,中秋国庆优惠等你领!

最新动态

软件测试/测试开发丨结对编程助手 GitHubCopilot

测试人

人工智能 程序员 软件测试 ChatGPT Copilot

质量高的http代理ip需要具备什么特点?

巨量HTTP

代理IP http代理

HarmonyOS非线性容器特性及使用场景

HarmonyOS开发者

HarmonyOS

实战指南,SpringBoot + Mybatis 如何对接多数据源

华为云开发者联盟

大数据 华为云 华为云开发者联盟 企业号9月PK榜

分分钟搞定来源list添加到目标list,据说只要5%的人知道

飞算JavaAI开发助手

软件测试/测试开发丨岗位内推-58同城岗位开放

测试人

软件测试 招聘 校招 岗位内推

实用指南:掌握 Node.js 文件复制的最佳实践

Apifox

JavaScript node.js 程序员 后端 教程

Dubbo源码浅析(一)—RPC框架与Dubbo | 京东云技术团队

京东科技开发者

spring dubbo RPC RPC框架 企业号9月PK榜

AI编程助手工具,走过路过别错过

飞算JavaAI开发助手

英伟达张玮东:NVIDIA核心GPU技术与软件生态助力大模型开发和部署

TRaaS

英伟达 大模型训练

软件开发全套资料获取

金陵老街

MySQL到TiDB:Hive Metastore横向扩展之路

vivo互联网技术

大数据 hive 元数据 TiDB 横向扩展

Mac如何内录系统声音

展初云

录屏 Mac软件

【AIGC】只要10秒,AI生成IP海报,解放双手!!! | 京东云技术团队

京东科技开发者

人工智能 IP AIGC 企业号9月PK榜

徐刚:AIGC时代,人力资源数智化的关键趋势与应对

用友BIP

人力资源 AIGC

中秋国庆花式玩法,用低代码DIY假日大屏“Vlog”

华为云开发者联盟

低代码 开发 华为云 华为云开发者联盟 企业号9月PK榜

百度交易中台之内容分润结算系统架构浅析

百度Geek说

大数据 架构 交易 调度任务 企业号9月PK榜

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