当前位置: 首页 > 编程日记 > 正文

设计一款编程语言有多难?

作者 | DAVID CASSEL

译者 | 弯月,责编 | 郑丽媛

题图 | 自视觉中国

来源 | CSDN(ID:CSDNnews)

最近,Ruby编程语言的创始人兼主设计师、云平台即服务公司Heroku的Ruby首席架构师松本行弘在一次演讲中表示,由松本行弘领导的Ruby社区对该编程语言的发展进行了深入思考。此次30分钟的演讲中还提到了该编程语言即将迎来激动人心的新发展。

松本表示:“在过去的四五年间,我一直在谈论Ruby 3的未来。也许很多人已经厌倦了这种老生常谈。但是今年Ruby 3真的要来了,今年12月25日圣诞节Ruby 3将正式发布。”在圣诞节当天发布Ruby语言升级是该语言的一项传统。

“如果一切顺利的话,我们将于12月正式发布Ruby 3,除非出现非常糟糕的意外。”

设计师的困境

来自世界各地(从印度到印度尼西亚,从巴西到柏林)的数百名观众观看了松本的直播,很多人发表了热情洋溢的评论。他们聚集在一起观看为Ruby的发展付出了25年心血的松本的演讲。据说,Ruby 3本来计划于东京奥运会的前夕推出,但由于奥运会被推迟到2021年,因此核心开发人员怀疑Ruby 3是否也应该推迟一年。

“但是经过一番讨论,我们决定于今年发布Ruby 3,因为作为开源社区,我们必须向前迈进。我们必须不断前进,开源社区通常不能停止发展,否则,就会面临死亡……”。

松本深刻地描述了所有语言设计师所面临的困境。“每个人都喜欢新事物,因此,作为程序员和工程师,我也喜欢新事物。此外,我非常喜欢语言,所以我喜欢研究新的编程语言,比如Elixir、Rust、Go等。我为这些语言感到非常兴奋。”然而,这也为Ruby语言的变革带来了压力。松本说:“Ruby有点年头了,它于1995年发布。我们只是凡人。我们犯了一些错误。因此作为语言设计师,我们希望纠正过去的错误。”

但与此同时,“没有人希望经历痛苦。”在所有Web应用程序都在使用Ruby现有版本的情况下,强迫开发人员升级有点危险,“没有人喜欢痛苦。从这个意义上讲,Ruby应该是稳定的。这似乎有点矛盾吧?”

“因此,Ruby语言的设计以及语言的计划很难克服这种矛盾。这种矛盾是我们发自内心的。”

他讲述了其他面临类似困境的编程语言,包括Python、PHP和ECMAScript,并指出这些社区花费了多年的心血才让大家接受了这些变化。例如Python 3,社区花费了十多年的时间,而PHP 6甚至被取消了。他们在发布之前放弃了重大更改,然后从PHP 5直接跳到了PHP 7。EMCAScript4也被取消了。

松本解释说,如果不进行更改,人们可能会离开社区。“他们会因为无聊而停止使用Ruby。”但同时他也担心,如果升级到更高版本带来的痛苦太多,那么他们可能也会离开社区,因为他们会决定“也许我们的下一个项目应该采用Rust、Go或其他编程语言。”

“因此,设计一种语言很困难,但是无论如何我们都必须向前迈进,以创造未来。”

让Ruby重振光辉

在演讲中,松本还概述了保持兼容性的计划,同时“加快Rust的速度,提高Ruby程序员的效率。”他确定了三个明确而具体的目标,这些目标代表了即将发布的Ruby 3的特征:快速、并发与正确。

为了加快Ruby的速度,开发团队将着手改进其JIT编译器(用于生成原生代码)。为了实现并发,他们没有选择其他语言的解决方案,而是打算尝试自己的一种方法。Node.js添加了Promise来通知异步操作的完成,而ECSMAScript 7添加了带有关键字async和await的控制机制,但Ruby 3将实现人们期待已久的异步i/o功能“fiber”,作为更好的控制异步线程的方法。”由于在fiber之间切换上下文很快,因此可以提高性能。“

他们认为这种方法能够提升性能的另一个原因是:它是由Ruby的falcon应用服务器的创建者开发的,松本认为这个项目非常快。但这并不是他们提高性能的唯一方法。他们还实现了“Ractor”(即Ruby Actor),类似于JavaScript提供背后“Web worker”脚本的方式。每个Ractor都可以并行运行,松本解释说,这利用了现代多核系统中的并行处理。

Ruby的第三个目标是正确性,这个目标指的是提早检查错误,主要由类型分析器负责实现,它将生成Ruby签名(松本将之类比为TypeScript中描述类型的d.ts文件)。Ruby 3将为其核心库提供类型签名,可用于类型检查,还可以用于增强将来的IDE。

但是它也有其局限性。松本解释道:“我们不追求类型系统的完整性和合理性,因为Ruby就是Ruby。Ruby基本上是动态类型的,这意味着,即使我们现在有了渐进式类型系统,也无法进行任何完全正确的类型检查,所以只能放弃。我们不会在语法中添加类型声明。”

三种新功能

Ruby 3的语法发生了一些变化。松本对三个新特性非常满意,他表示:“Ruby会越来越好。首先是复杂的模式匹配语法,你不必解构数组和哈希,因为可以编写模式,非常简便。”

第二个新功能可以给等号右侧的变量赋值。他说,虽然从外观来看,我们会觉得有点“不自然”,IDE也会有点不适应,因为一般表达式都以变量开头,即使将值分配给很长的一个代码块也是如此。“如果可以反过来,将赋值变成右值运算,那么看起来会很自然,但我们并不建议在所有地方使用。你不必用右值赋值来替换每个赋值操作,但是在某些情况下,这非常方便。”

Ruby 3中的第三个新功能是编号的块参数,“你不必再给临时的本地块参数起名字。”

松本表示:“稳定性很重要”,所以他并没有表示Ruby 3之后会有任何重大的语法变化。相反,他们将专注于改进Ruby现有的支持工具,例如用于语言服务器协议的Solargraph,用于静态类型检查的Sorbet,以及帮助开发人员编写出符合Ruby规范的代码的Rubocop 。“这些工具证明,工具越好带来的用户体验就越好。因此,我们必须继续努力。我认为我们需要更多的工具,然后我们还需要改进这些工具。”松本还希望看到更好的类型检查工具和格式化工具,或者更好的性能调整和调试工具。此外,对于如何加快Ruby的速度,松本还有一些其他想法,例如在位于虚拟机上方设置另一个轻量级JIT编译器,比如MIR或DynASM。

更加轻量级的Ruby

最后,在有关Ruby 3的讨论中,松本还提到了另一个想法:“虽然这只是一个疯狂的主意,但我正在考虑建立一个更加轻量级的Ruby子集,这个子集不仅更简单更严格,而且更快或更容易优化。”

这个Ruby子集可以向下兼容,即可以在所有现有已有的Ruby版本中运行(尽管并非所有版本的Ruby都可以在这个轻量级的Ruby中运行)。在解释其基本原理时,松本展示了一张幻灯片,上面写着:“这款轻量级的Ruby运行得更快。”他表示:“这只是一个初步的想法。还不是十分明确。我们必须保持兼容性,但是如果我们止步于这个Ruby子集,那么可能会缺乏灵活性,但是应该更容易优化。”

松本还表示:“我有很多疯狂的想法,我们会逐个尝试,让Ruby变得越来越好。”

原文链接:

https://thenewstack.io/ruby-creator-yukihiro-matsumoto-on-the-challenges-of-updating-a-programming-language

更多精彩推荐
  • 阿里动物园再添新丁,小蛮驴搞定物流最后三公里

  • 仅用 4 小时,吃透“百度太行”背后硬科技!

  • OpenCV 实现视频稳流,附Python与C++代码!| 防抖技术

  • “飞天、无影、小蛮驴…”带你走进2020云栖大会

  • 微软全球 AKS 女掌门人,这样击破云原生“怪圈”!

相关文章:

在 DW 中插入 Flash 的参数详解

作者:macromedia 文章来源: 蓝色理想 在Dreamweaver中插入FLASH后还可以有很多的控制参数,点属性面板右下的参数钮,就会有参数和值的加入。大家可以自由的控制, 以下内容摘自 Flash MX 2004 帮助文档 参数和属性下…

C语言中文件的读写(fputc和fgetc)(putchar和getchar)

文件打开之后就可以对文件进行读写了。 1、fputc(ch,fp); 将字符ch输出到(即写到)fp所指向的文件中。如果输出成功,返回字符ch的值,否则返回EOF(-1) putchar(c) 是从fputc中派生出来的,在stdio.…

转 微博 linux中ctime,mtime,atime的区别

http://blog.sina.com.cn/s/blog_67178440010101gr.html 当你同熟练的UNIX用户进行交谈时,你经常会听到他们傲慢地讲出术语“改变时间(change time)”和“修改时间(modification time)”。对于许多人(和许多字典而言),改变和修改是相同的。这里会有什么不同那&#…

WEB 打印的相关技术分析

文/谢康 做Web开发的人员一定都会面临一个共同的难题,那就是打印。的确,相对于Windows桌面应用程序来讲,Web应用程序的打印有种种限制,技术人员在项目开发过程中经常会遇到用户这样或那样的需求. 做过桌面应用开发的人都会非常熟悉…

jquery validate使用

一、用前必备 官方网站&#xff1a;http://bassistance.de/jquery-plugins/jquery-plugin-validation/ API: http://jquery.bassistance.de/api-browser/plugins.html 当前版本&#xff1a;1.5.5 需要JQuery版本&#xff1a;1.2.6, 兼容 1.3.2 <script src"../js/jquer…

Python程序员的“避坑”指南

结合我最近这些年的Python学习、开发经验&#xff0c;发现90%的人在学Python时都会遇到下面这些问题&#xff1a;1. 没什么经验根本不知道从何学起&#xff0c;而且应用方向太多了根本不知道该选择什么方向...2. 基础入门看似简单&#xff0c;但是进阶实战就举步维艰&#xff0…

java web项目流程小结

java web项目从发出请求到返回结果流程整理&#xff1a;客户发出请求&#xff0c;通过web.xml 中配置的DispatchServlet接收请求并调用 handlerMapping 将请求分发到对应的Controller,Controller调service&#xff0c;service调dao,dao层根据方法名对应到sql.xml&#xff0c;通…

snmp在企业网中的应用

一.snmp简介 snmp概念 SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP)&#xff0c;用来对通信线路进行管理。随后&#xff0c;人们对SGMP进行了很大的修改&#xff0c;特别是加入了符合Internet定义的SMI和MIB&#xff1a;体系结构…

浅谈在ASP.NET中数据有效性校验的方法

作者&#xff1a;未知作为一名程序员&#xff0c;一定要对自己编写的程序的健壮性负责&#xff0c;因此数据的校验无论在商业逻辑还是系统实现都是必不可少的部分。我这里总结了一种自认为比较不错的asp.net&#xff08;C#&#xff09;的数据校验方法&#xff0c;如大家探讨。主…

关于Python 3.9,那些你不知道的事

作者 | Ayushi Rawat编译 | 高卫华题图 | 视觉中国Python一直在满足社区需求&#xff0c;并且将成为未来使用最多的语言。Python的下一个版本带来了更快速的进程释放&#xff0c;性能的提升&#xff0c;简便的新字符串函数&#xff0c;字典并集运算符以及更兼容稳定的内部API。…

memcache缓存失效

缓存过期 memcached在处理过期的缓存项时&#xff0c;采用懒惰模式处理方法。 缓存项过期&#xff0c;不会立即删除&#xff0c;直到对该缓存项执行了get操作&#xff0c;才会删除过期缓存。> set key 0 10 > test > stats //查看curr_items的值 > get key //超过过…

ASP.NET HTTP 运行时

ASP.NET HTTP 运行时一个请求从 URL 字符串到 HTML 代码的“漫长曲折”之路 Dino EspositoWintellect 2003年7月10日 摘要&#xff1a;本文详细介绍了 HTTP 运行时的组成部分&#xff0c;以及在处理对 ASP.NET 应用程序的各种请求时采用的逻辑。文章还以 Web Garden 模型和最新…

C++中的const关键字(zz)

【补充】mutable关键字有时我们希望类的数据成员即使在const成员函数中&#xff0c;依然是可以修改的&#xff0c;这时就可以把它们声明为mutable来实现。这样的应用&#xff0c;比如记录各种操作的调用次数&#xff0c;这时&#xff0c;即使在const中&#xff0c;依然要修改计…

Python让你成为AI 绘画大师,简直太惊艳了!(附代码))

作者 | 李秋键责编 | 李雪敬头图 | CSDN下载自视觉中国引言&#xff1a;基于前段时间我在CSDN上创作的文章“CylcleGAN人脸转卡通图”的不足&#xff0c;今天给大家分享一个更加完美的绘制卡通的项目“Learning to Cartoonize Using White-box Cartoon Representations”。首先…

Vue 2 | Part 4 v-bind绑定元素属性和样式

这期跟大家分享的&#xff0c;是v-bind指令。它可以往元素的属性中绑定数据&#xff0c;也可以动态地根据数据为元素绑定不同的样式。 绑定属性 最简单的例子&#xff0c;我们有一张图片&#xff0c;需要定义图片的src。我们可以直接在元素的属性里面定义&#xff1a; <div …

在 ASP.NET 中执行 URL 重写

在 ASP.NET 中执行 URL 重写 发布日期&#xff1a; 8/23/2004| 更新日期&#xff1a; 8/23/2004Scott Mitchell 4GuysFromRolla.com 适用范围&#xff1a; Microsoft ASP.NET 摘要&#xff1a;介绍如何使用 Microsoft ASP.NET 执行动态 URL 重写。URL 重写是截取传入 Web 请求并…

win8中使用BitLocker加密

一、加密驱动器二、管理三、TPM转载于:https://blog.51cto.com/jimshu/989359

​清华硕士爆料:这些才是机器学习必备的数学基础

现如今&#xff0c;计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章&#xff0c;还是要参与相关任务&#xff0c;你马上就会遇到一些拦路虎&#xff1a;想过滤垃圾邮件&#xff0c;不具备概率论中的贝叶斯思维恐怕不行&#xff1b;想试…

Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站

Oracle Golden Gate体系架构详解(原创) - CzmMiao的博客生活 - ITeye技术网站

用C#对ADO.NET数据库完成简单操作

作者&#xff1a;李阳 http://oraasp.vicp.net/article/article.aspx?ID21 数据库访问是程序中应用最普遍的部分。随着C#和ADO.NET的引入&#xff0c;这种操作变得更简单。这篇文章将示范四种最基础的数据库操作。 ● 读取数据。其中包括多种数据类型&#xff1a;整型&#…

用createrepo配置Yum本地源

yum配置本地源, 在网速差的情况下&#xff0c;yum用在线源是一件头痛的事&#xff0c;所以以下为yum的本地源配置可以有好解决这个事。 1,安装createrepo包&#xff0c; 可以用yum安装(yum install createrepo -y); 也可以安装rpm或tar包 &#xff08;网址&#xff1a;createre…

首次在手机端不牺牲准确率实现BERT实时推理,比TensorFlow-Lite快近8倍,每帧只需45ms...

作者 | 王言治 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 基于Transformer的预训练模型在许多自然语言处理&#xff08;NLP&#xff09;任务中取得了很高的准确度。但是这些预训练模型往往需要很大的计算量和内存。由于移动平台的存储空间以及计算能力的限制&a…

[svc]caffe安装笔记-显卡购买

caffe,这是是数据组需要做一些大数据模型的训练(深度学习), 要求 服务器显卡(运算卡), 刚开始老板让买的牌子是泰坦的(这是2年前的事情了). 后来买不到这个牌子的,(jd,tb)看过丽台的,看过gtx系列的哪个型号来着, 也不合适,后来买的特斯拉显卡 [查了下一些知名的显卡牌子](https…

AABO:自适应最优化Anchor设置,性能榨取的最后一步 | ECCV 2020

编译 | VincentLee来源 | 晓飞的算法工程笔记Introduction目前&#xff0c;主流的目标检测算法使用多种形状的anchor box作为初始预测&#xff0c;然后对anchor box进行回归调整&#xff0c;anchor box的配置是检测算法中十分重要的超参数。一般而言&#xff0c;anchor box的配…

Android列表控件选项中添加进度框ProgressBar实现

今天有时间就学习了下在ListView、GridView列表项中清加ProgressBar,小马用最简单的代码实现可以通用的功能&#xff0c;人人都能看懂&#xff0c;哈哈&#xff0c;直接说下&#xff0c;如果你的适配器getView方法返回的View是一个自定义控件的话&#xff0c;有点不好实现哦&am…

写一个通用数据访问组件

出处&#xff1a;http://www.csharp-corner.com willsound&#xff08;翻译&#xff09; 我收到过好多Email来问我如何用一个通用的数据提供者(data provider)在不失自然数据提供者(native data provider)稳定而强大功能的前提下来访问不同的数据源(data sources).一个小伙子…

InstallShield 2015 LimitedEdition VS2012 运行bat文件

转载:http://www.cnblogs.com/fengwenit/p/4271150.html 运行bat文件 网上很多介绍如何运行bat的方法&#xff0c;但我这个是limted 版本&#xff0c;不适用。 1. 打开 Define Setup Requirements and Actions –> Custom Actions 2. 右健 After Register Product –> Ne…

理解C#中的string类型

作者&#xff1a;未知目的 本文的目的在于揭示和DOTNET及C#相关的一些常见的和不常见的问题。在这些问题中我的第一篇文章和string数据类型有关,string数据类型是一种引用类型,但是当和其他引用类型比较的时候,很多开发人员可能并不能完全理解它的行为。 问题 对于常见的引用类…

最全总结!聊聊 Python 操作PDF的几种方法

作者 | 陈熹来源 | 早起Python前言本文主要涉及&#xff1a;os 模块综合应用glob 模块综合应用PyPDF2 模块操作基本操作PyPDF2 导入模块的代码常常是&#xff1a;from PyPDF2 import PdfFileReader, PdfFileWriter这里导入了两个方法&#xff1a;PdfFileReader 可以理解为读取器…

three.js(六) 地形法向量生成

2019独角兽企业重金招聘Python工程师标准>>> 上一节采用 分形算法生成地形的高度值&#xff0c; 接着我们需要生成每个顶点的法向量。 three.js 的PlaneGeometry 自带有法向量&#xff0c; 法向量分为两种 即 平面法向量 和 平面每个定点法向量。 因此一个n*n 块组成…