欢迎您访问无忧自考网!

编程猫学院一用编程对话未来(内蒙古编程网改变未来)

更新时间:2023-01-05 07:48:00作者:51data

软件的功能越来越多,代码越来越多,如何才能不堆积,甚至减少软件的体积?作者提出一种可能:“小语种”。链接:https://chreke.com/little-languages.html声明:本文由CSDN翻译,未经允许禁止转载。

作者|克里斯托弗埃克罗斯

译者|新月编辑|郑丽媛

| csdn (ID: csdnnews)

我认为旨在解决非常具体问题的“小语种”3354小语种3354是编程的未来,尤其是看了Gabriella Gonzalez的文章《编程历史的终结》(编程的历史终结)和看了Alan Kay的演讲《编程与扩展》,我更加肯定了这个观点。

什么是「小语种」?

“小语种”一词源于乔恩本特利的一篇文章《Little Languages》(小语种),他给出了如下定义:

.小语种是指专门针对某个特定问题领域,不包含传统语言很多功能的编程语言。

比如SQL是描述数据库操作的小语言,正则表达式是文本匹配的小语言,Dhall是配置管理的小语言等等。

这些语言有其他的名称,比如特定领域语言(DSL)、面向问题的语言等等。不过,我最喜欢“小语种”这个词,部分原因是“DSL”这个词包含了太多的含义,从有流接口的库到成熟的查询语言(比如SQL)。另外,“小语种”这个词也强调了这类语言的本质:小。

为什么我们需要小语种?

从工程发展的历史来看,今天的软件也属于某种工程,但是从事这种工程的人不知道什么是“拱”。现在,大多数软件都非常类似于埃及金字塔,由数百万块砖块相互堆叠而成。没有结构上的完整性,只是靠蛮力和成千上万的奴隶建成的。

艾伦凯3354号,电话《与艾伦凯的对话》

软件工程社区遇到的真正问题是,随着应用程序复杂性的增加,其源代码的大小也会增加。然而,我们知道大型代码库的功能在很大程度上仍然是固定的。根据Sourcegraph在2020年发起的调查“大代码的出现”,大多数人表示他们的代码库存在以下一个或多个问题:

很难增加新员工;

对依赖关系缺乏了解导致代码问题;

管理代码变更变得越来越困难。

更糟糕的是,应用程序正以惊人的速度增长。根据Sourcegraph的调查,大多数人认为他们的代码库在过去十年中增长了100 ~ 500倍。举个具体的例子,1992年Linux内核刚出来的时候,大概只有1万行代码,而20年后的今天,已经达到了3000万行。

这段代码从何而来?我认为“更多的特性”不足以解释这些代码量的增加。相反,我认为这与我们构建软件的方式有关。向程序中添加新函数的一种常见方式是在现有函数的顶部堆栈3354。金字塔不就是这样建造的吗?不同的是每一层都需要越来越多的砖。

逆势而行

问题是,我们真的需要数百万行代码来构建一个现代操作系统吗?2006年,艾伦凯和STEPS项目的合作者开始挑战这一假设:

科学的进步需要将实证研究与理论模型相结合,所以作为科学家,我们的第一个问题是,如果我们建立一个基于个人计算现象的模型,我们能否将其提炼为某种极其简化的东西,比如适用于所有电磁频谱的麦克斯韦方程,或者可以浓缩到衬衫口袋大小的美国宪法?还是这种模式非常混乱(或者极其复杂),像美国的法律体系(或者现在的软件实务),有高达“3立方英里堆砌”的判例法?答案几乎是肯定的:介于两者之间。如果是这样的话,证明这个模型更接近于简化而不是极端复杂将会非常有趣。

所以,我们的问题是:个人计算体验(包括操作系统、应用程序和其他支持软件的体验)本质上是指多少行代码?20亿行,2亿行,2000万行,200万行,20万行,2万行还是2000行?

3354 《STEPS 2007 年进度报告》,第4-5页

这里凯提到的麦克斯韦方程组是一组描述电磁学、光学和电路基础的方程组。这些方程被广泛使用,但方程本身非常简洁,甚至可以印在t恤上:

这些方程如此简洁的原因之一是用Del符号()来描述向量微积分运算。需要注意的是,Del并不是一个真正的算符,它更像是一种速记形式,可以方便我们使用向量微积分中的一些方程。

那么,我们能在编程界创造Del符号吗?就像Del可以让向量微积分更容易管理一样,我们是否可以找到某种符号来帮助我们以同样的方式理解程序?这个问题是STEPS项目背后的核心思想之一:

此外,我们认为创建面向问题的语言可以降低解题难度,使解更容易理解、更小,也符合我们“主动数学”方法的精神。这些“面向问题的语言”将被创建并用于大大小小的问题,以及不同层次的抽象和细节。

3354 《STEPS 2007 年进度报告》,第6页

这里的基本思想是,当在应用程序中寻找模式时,您可以用一种小型语言对它们进行编码,这种语言将允许您以比其他抽象方法更紧凑的方式来表达这些模式。这不仅可以扭转应用程序不断增长的趋势,还可以让代码库在开发过程中不断萎缩!

我发现Nile(https://github.com/damelang/nile)是STEPS项目的一大成果,STEPS是一种用来描述图形渲染和构图的小语种。目标是使用Nile实现与Cairo相同级别的功能。Cairo是各种自由软件项目使用的开源渲染器,总代码量约为44000行和——行,而Nile只有300行左右。

为什么不是高级语言?

然而,事实证明,Ada并不是杀死软件生产率怪兽的灵丹妙药。毕竟只是高级语言,这种语言带来的最大好处来自于第一次转化,从机器事故的复杂到更抽象的分步解决方案。消灭了这些事故,剩下的事故就少了,消灭了的奖励自然也就减少了。

佛瑞德P布鲁克斯——号,《No Silver Bullet》

说到这里,你可能想问“为什么我们不能发明一种更高级的通用语言呢?”在我看来,共同语言的表现力带来的好处一直在下降。那么,更高级的语言会是什么样子呢?以Python为例。这种语言如此先进,看起来已经像伪代码了。

通用语言的问题是,你还是要把问题变成算法,然后用语言表达算法。现在的高级语言非常擅长描述算法,但是除非你的目标是实现算法,否则会出奇的复杂。

在写这篇文章时,我想起了一个关于Donald Knuth的故事:有人要求Knuth在Jon Bentley的编程珍珠专栏中展示他的编程风格,道格麦克洛伊被邀请对Knuth的程序进行评论。

Knuth的任务是计算某一段文本中的词频,它的解是用WEB语言精心编写的,WEB语言是Pascal的变种,也是他自己写的。Knuth添加了一个专门用于跟踪字数的数据结构。所有代码都少于10页。尽管麦克洛伊很快称赞了Knuth的解决方案,但他对程序本身并不十分满意。作为评论的一部分,他用shell脚本、Unix命令和小型语言编写了自己的解决方案:

tr-cs A-Za-Z ' \ n ' | tr A-Z A-Z | sort | uniq-c | sort-rn | sed $ { 1 } q

对于不熟悉Unix的人来说,这段代码不容易理解。——McIlroy自己也承认了这一点,他甚至还加了注释版。但显然,这段代码比十页的程序更容易理解。

Unix命令是为处理文本而设计的,这就是为什么麦克洛伊能写出如此紧凑的字数统计程序。或许,我们可以把shell脚本想象成文本操作的“Del符号”?

少即是多。

上面的Unix命令示例说明了小型语言的另一个特点:语言本身并不是特别强大,但在运行时却非常强大。Gonzalez在文章《编程历史的终结》中提到了以下趋势:

在研究上述趋势时,我们发现了一个共同的规律:把一个用户关心的问题变成一个运行时问题,可以……让程序更像一个纯粹的数学表达式,而且……运行时复杂度明显增加。

正则表达式和SQL只能用来表示文本搜索和数据库操作。相反,C没有运行时语言,你可以表达任何可能出现在冯诺依曼架构上的东西。而Python、Haskell等高级语言则介于两者之间:不需要关心内存管理,但仍然可以使用图灵完整语言的所有功能,也就是说可以表达任何计算。

小语种和C语言是两个极端。对于小语种来说,不仅计算机的架构被抽象了,一些语言所能表达的程序类型也是有限的。——他们在设计上还不完善。虽然这些语言听起来非常有限,但它们实际上为优化和静态分析开辟了新的可能性。而且,就像抽象内存管理可以消除一大类错误一样,尽可能抽象算法也可以帮助消除更多的错误。

静态分析

不是很强大的语言更容易推理,它们可以提供比普通语言更强的保障。例如,Dhall是一种用于生成配置文件的全功能编程语言。如果您不想冒使部署脚本崩溃或陷入无限循环的风险,您可以考虑Dhall,因为它可以保证:

1.不崩溃;

2.限时结束时间。

第一点是通过不抛出异常实现的。任何可能失败的操作(比如获取空列表中的第一个元素)都将返回一个可选结果,该结果可能包含也可能不包含值。第二,为了保证结尾,Dhall不允许程序使用递归定义。在其他函数式编程语言中,递归是表达循环的主要方式,但在Dhall中,你必须依赖内置的fold函数。缺少通用循环结构意味着Dhall不是图灵的完整语言,但也没有必要,因为它不是通用编程语言。

语言小的话会更容易理解。比如你很难确认Python程序是否有副作用,但对于SQL来说很简单。你只需要检查查询是否以SELECT开头。

对于Nile,STEPS团队看到了对图形化调试器的需求。Brevictor想出了一个工具,它可以告诉你在屏幕上绘制特定像素的代码。可以通过YouTube观看艾伦凯的演示,也可以自己尝试。这样的工具是完全可行的,因为Nile是一种很容易推理的小语种。想象一下,如果同样的工具是用C写的会是什么样子?

速度的要求

功能强大的编程语言不仅会增加出现bug的可能性,还会对性能产生不利影响。比如程序不是用算法表达的,运行时可以自由选择;我们可以用更快的表达式代替它们,前提是我们能证明它们能产生同样的结果。

例如,SQL查询没有指定应该如何执行查询。数据库引擎可以自由地使用它认为最合适的任何计划,例如它应该使用一个索引、多个索引的组合还是直接扫描整个数据库表。现代数据库引擎还收集关于列的值分布的统计信息,以便他们可以立即选择最佳方案。如果查询用算法描述,那是不可能的。

Nile语言如此紧凑的“秘密武器”之一是Jitblt,它是一个图形渲染的即时编译器。从STEPS和Cairo团队的讨论中可以明显看出,Cairo的很多代码都是手动优化的像素构图操作,理论上可以交给编译器。所以Cairo团队的Dan Amelang实现了这样一个编译器,就是Jitblt。这意味着图形管道的优化可以脱离渲染内容的纯数学描述,这也是Nile运行速度和Cairo一样快的原因,Cairo已经进行了手动优化。

小语种,潜力大

那么,STEPS项目怎么样了?他们最终得到了“3立方英里的判例法”,还是设法创造了一个“可以印在t恤上的操作系统”?他们最终的成果是KSWorld,这是一个完整的操作系统,包括文档编辑器和电子表格编辑器,大约有17000行代码。虽然不能印在t恤上,但我还是觉得这个项目是成功的。

KSWorld的创立说明小语种潜力巨大。然而,我们仍然有许多未解决的问题,例如这些小语种应该如何相互交流?它们应该被编译成一个通用的中间表示吗?还是使用不同的运行时,然后通过通用协议(比如UNIX管道或者TCP/IP)相互通信?或者,也许每种语言都足够小,可以在各种不同的宿主语言中重新实现(比如正则表达式)?或者可以把这些方法结合起来?

无论如何,我认为我们需要一种不同的方式来构建软件。小语种能不能成为这条发展道路的一部分,可能没有答案,但重要的是,我们必须停止砌砖,想一个更好的办法。

感恩节福利日

感谢您的陪伴和对CSDN微信官方账号的支持。点击参与抽奖或在CSDN微信官方账号发送“抽奖”即可参与。奖品是JD.COM的3个狗头娃娃和5个带盖子的杯子。

为您推荐

「河北」各主考院校学士学位申请条件汇总!(建议收藏)

【河北自考】各主考院校学士学位申请条件汇总(仅汇总热门院校)河北大学·学位申请1.本次申报的考生只限于毕业一年以内。2.所学专业主干课程平均成绩不低于65分。3.毕业论文成绩不低于75分。4.自学考试英语(二)或日语(二)、俄语(二)【以下

2023-01-05 07:27

ERP项目实施阶段包括有哪些内容?-蓝灵通erp

在如今这个快节奏的时代里,为了满足企业的后期的持续性发展,不同行业的企业经常需要使用专门设计的软件系统来完成任务和管理运营,ERP就是其中的一种。ERP是对企业资源进行全面集成,实现跨组织、跨区域、跨部门信息整合的现代化管理系统,包含营销、

2023-01-05 07:24

yarn和npm的区别(深入实施什么战略区域重大战略主体功能区战略主体功能区战略)

1.YARN的架构与设计YARN的总体架构模式是Master/Slave主从模式。一个全局的ResourceManager ( RM,主 ,可以多个HA),多个NodeManager共同构成计算框架。 NodeManager (NM)是每台

2023-01-05 07:21

2020年社区卫生服务中心上半年工作总结(2020年上半年中学教育知识与能力真题及答案)

河北新闻网5月15日讯(河北日报记者桑珊)今天,河北省教育考试院发布上半年自考免考业务公告,5月27日至6月1日,已注册考生直接登录河北省教育考试院高等教育自学考试网上信息系统(以下简称“自考信息系统”,http://zk.hebeea.e

2023-01-05 07:18

下半年河北省自考考生申请毕业现场注册11月20日开始

石家庄日报融媒体记者 赵艺记者从河北省教育考试院获悉,我省2021年下半年考生申请毕业工作即将开始,为确保此项工作在疫情防控常态化情况下平稳顺利进行,现将有关事宜公告如下:一、申请毕业流程及业务办理时间节点1、已注册考生直接登录河北省教育考

2023-01-05 07:15

月亮竟是这么多(只要你愿意)

首先来说一下2017年下半年各省安排省考时间2017年西藏公务员考试:预计2017年10月上旬报名,10月底笔试。2017年河南公务员考试:预计2017年8月15-19日报名,9月23日笔试。2017下半年天津公务员考试:预计2017年8月

2023-01-05 07:12

加载中...