Bosque语言问世,超越结构化编程,开启第二个开发黄金年代
【新智元导读】微软正式发布了一种名为Bosque的全新编程语言。微软方面介绍说:Bosque是一种超越了结构化编程且没有循环的编程语言将极大地提高开发人员的生产力,提高软件质量,并使编译器和开发人员工具的开发进入第二个黄金时代。
当地时间 4 月 18 日,微软正式发布了一种名为 Bosque 的全新编程语言。微软方面介绍说:Bosque 受 TypeScript 启发,是一种超越了结构化编程且没有循环的编程语言,他们认为,这种规范化的编程模型将极大地提高开发人员的生产力,提高软件质量,并使编译器和开发人员工具的开发进入第二个黄金时代。
超越结构化编程的“正则化”编程语言
20 世纪 70 年代,结构化编程和抽象数据类型的兴起代表了编程语言的重大转变。这些方法代表了从反映底层硬件体系结构附带特性的编程模型,开始转向更直接地强调程序员意图的模型。这种转变同时使开发人员更容易地将系统的模型转换为代码,且更不易出错,并开启了编译器和 IDE 工具开发的黄金时代。
21 世纪的今天,微软推出了一种新的开源编程语言,名为 Bosque,它希望通过包含代数运算和避免产生复杂性的技术来使得代码简化和易于理解。
Bosque 的灵感来自于 TypeScript 的语法和类型以及 ML 和 Node/JavaScript 的语义。它的提出者是微软计算机科学家 Mark Marron,他将这种语言描述为 超越结构化编程模型 的成果。
自 1968 年计算机科学家 Edsger Dijkstra 发表题为《Go To Statement Considered Harmful》的论文后,结构化编程范式开始流行起来。在结构化编程范式中,流控制由循环、条件和子例程管理。
Marron 认为:可以通过消除诸如循环、可变状态和引用相等等复杂性的来源让编程变得更好。于是 Bosque 诞生了,它代表了一种编程范式,Marron 在他的一篇论文中称之为“正则化编程”。
Marron 在他的技术论文中解释说:“这个模型建立在结构化编程和抽象数据类型成功的基础上,它将现有的编程模型简化为一种正则化的形式,这种形式消除了主要的错误来源,简化了代码理解和修改,并将许多代码上的自动化推理任务转换为琐碎的命题。”
Bosque 语言官方论文:
https://www.microsoft.com/en-us/research/uploads/prod/2019/04/beyond_structured_report_v2.pdf
Bosque 语言概览
那么,Bosque 语言是什么样子的?下面这个例子或许可以说明:
官方 GitHub 中包含更多参考示例:
https://github.com/Microsoft/BosqueLanguage
乍一看,Bosque 的表达方式很像 JavaScript 语言。Marron 说,引用相等(当两个变量指向内存中的同一个对象时)代表了一种可能导致问题的复杂性的例子。
在 Marron 的论文中,他写道:
基于一系列开发人员访谈和对分析运行时编译器开发的经验研究,我们确定了五个意外复杂性的主要来源,可以通过深思熟虑的语言设计来解决。这些问题是各种 bug 的来源,增加了开发人员在应用程序中推断和实现功能所需的工作量,并使自动推断程序变得非常复杂(甚至不可能实现)。
这五种复杂性来源分别是:
- 可变的状态和框架:在编程语言中引入可变性,破坏了以单调的方式对应用程序进行推理的能力,这种方式迫使程序员 (和任何分析工具) 明确哪些在运算之后仍然为真,哪些就无效了。可变代码通过返回值和对参数 (或其他全局状态) 的副作用来影响应用程序状态的能力也引入了对每个运算的逻辑框架进行推理的需要。
- 循环、递归和不变量:循环和递归是向推理提出的一项基本挑战,因为代码描述了单个步骤的效果,但是要理解完整的构造,需要对一组值上的量化属性进行泛化。不变量提供了所需的关联,但是一般针对它们的计算不可能存在一种通用的技术,甚至在有限的应用中也很难实现。
- 不确定行为:包括未定义的、未指定的、不确定的或环境的行为,需要程序员或分析工具来推断并解释所有可能的结果。虽然真正未定义的行为,例如未初始化的变量,已经从大多数语言中消失了,但是仍然存在大量未具体明确的行为,例如排序的稳定性、映射 / 字典枚举顺序等。这些增加了开发过程的复杂性,并且随着时间的推移,逐渐被视为应该消除的负债。
- 违反数据不变原则:编程语言通常为数组 / 元组中的单个元素或对象 / 记录中的字段提供访问和更新的操作符。事实上,这些访问器 / 更新器是在单个元素的基础上操作的,这导致程序员在多个步骤上更新对象的状态,在此期间,通常不变量在恢复之前会暂时失效。在这种情况下,大量细节必须予以跟踪和恢复,这可能会急剧增加发生错误和疏忽的机会。
- 等式和混叠:编程语言处于数学和工程学的边界上。尽管语言语义被表述为一个数学概念,但也存在一些常见的情况,例如引用相等、按值传递 vs. 按引用传递,或评估顺序,它们通常默认底层是冯·诺伊曼架构,要么是有意为性能考虑,要么是出于习惯或历史原因。虽然这些选择看起来微不足道,但是对可理解性有很大的影响——仅仅公开引用相等性就会增加关于混叠关系的推理的复杂性,并使其他体系结构上的编译变得非常复杂。
Marron 举了一个例子,譬如为了让某种方法以单例模式或缓存的形式返回一个新对象,就需要考虑对该方法进行优化。但 Marron 表示:“如果这个问题出现在对象具有身份的语言中,这种行为可能会改变程序的结果;然而,在不允许对象标识的 Bosque 中,这种优化则是安全的。”
他引用的另一个例子是各种形式的不确定行为,他说:“在 JavaScript 中,排序函数不需要是稳定的,所以 JS 的 V8 引擎使用了不稳定的排序。”
Marron 进一步解释道:“从理论上讲,这似乎是一件小事,但在实践中,这意味着每次开发人员对列表进行排序时,他们必须记住列表是不稳定的,并考虑到使用相同排序值重新排序的可能性,譬如 2008 年因为稳定性问题被爆出的 Chromium bug 90。”
Marron 的技术论文探讨了 Bosque 试图解决的编程语言复杂性的潜在来源。但是他说,消除可变状态、循环和引用相等性是三大要素。
他说:“在学术文献中,强更新、循环不变量和别名分析等相关问题已经被广泛研究了 30 多年,但仍然是一个巨大的开放问题。通过消除这些特性,以及解决相关问题的需要,许多像符号执行这样的事情可以简化为概念上的简单任务。”
Marron 说,Bosque 的最初目标是构建自动化的零工作量代码验证、自动化的 SemVer 检查和编译,以使用 SIMD 硬件,如 AVX 或 SSE。他说:“目前,我们只在小的示例上手工完成了这些工作,但从根本上说,在实际实现中似乎没有任何不可逾越的障碍。”
未来规划
目前,Marron 将 Bosque 视为探索语言设计选择的一种方式,并通过与学术界和在线开发人员社区的协作,帮助创建诸如验证器和编译器之类的自动化开发工具。
他说:“我们希望用 Bosque 来证明这个领域的各种概念。未来,我们可能会努力将这些想法以某种形式投入生产。”
目前,Bosque 依赖于一个用 TypeScript 编写的解释器,运行在 Node 上。作为参考实现。展望未来,Marron 打算为 WASM 和本地代码提前实现编译。他说,在接下来的几个月里,他将专注于各种 TODO 项目,比如 bug 修复以及开发支持用这种语言编写大型程序的功能。
如果 Bosque 在学术实验之外的开发生态系统中找到了一席之地,Marron 认为它可能会应用在云或物联网领域,因为 Bosque 代码可以在一个比较小的内存中编译,能够快速启动,并且可以通过符号分析验证其正确性。
参考链接:
- https://www.theregister.co.uk/2019/04/18/microsoft_bosque_programming_language/
- https://www.microsoft.com/en-us/research/uploads/prod/2019/04/beyond_structured_report_v2.pdf
- https://github.com/Microsoft/BosqueLanguage
本文经授权转载自微信公众号:AI前线,ID: ai-front