使用低级语言编程可能是一项艰巨的任务,需要多年的教育、经验和知识。为了应对这一挑战,研究人员和公司正在研究领域特定语言(DSL),这些语言为特定用例提供编程的好处,而不需要深奥的编程知识。因为DSL更专业,所以程序运行得更快。

 

Debugging is a persistent challenge with DSLs

调试是DSL面临的一个持续挑战。图片由Alex Shipps/麻省理工学院CSAIL通过Midtravel提供

 

但困扰DSL的一个问题是通过调试消除软件中的错误。缺乏对这类语言的调试支持有时被称为“DSL的致命弱点”。为了避免在新的特定编程语言上使用现有调试器的挑战,麻省理工学院的研究人员最近宣布了一种名为D2X的新工具,它使调试DSL变得更容易。

 

什么是领域特定语言?

领域特定编程语言是一种计算机编程语言,旨在解决特定问题领域或用例。与可用于解决各种问题的通用编程语言(如Java或Python)不同,DSL是明确地针对特定应用程序或领域创建的。

与通用编程语言相比,DSL还提供了高级别的抽象。正因为如此,DSL的使用要比标准编程语言简单得多。

 

DSL允许用户轻松访问特定领域的知识。图片由Meinte Boersma提供。(点击图片放大)

 

例如,图像处理DSL包含用于标准处理任务(如图像模糊)的预先编写的软件功能。用户可以简单地调用“模糊图像”函数,而无需编写底层代码来启用这样的函数。

通过这种方式,DSL允许用户用适合其特定需求的语言表达概念和解决方案,从而提高了软件开发的效率。通过提供专门的语法和针对特定域优化的一组功能,DSL可以更容易地编写正确和可维护的代码,同时减少实现此类功能所需的编程专业知识。

 

麻省理工学院开发“DSL创建DSL”

2021年,由麻省理工学院博士生Ajay Brahmakshatriya和麻省理工大学教授Saman Amarasinghe领导的一组研究人员开发了一个名为BuildIt的软件包,据说可以大大简化创建DSL的任务。

研究人员认为,虽然第一次编写一个完全没有错误的程序几乎是不可能的,但这些错误通常会在开发周期的后期出现,有时会出现5000行代码,而此时很难发现错误。这使得软件工程师在程序代码完成并准备好进行测试后进行调试变得特别耗时和乏味。此外,现有的调试器不了解DSL的细节,这使得它们速度慢且效率低。

在BuildIt研究的基础上,麻省理工学院的团队最近推出了一种新工具,可以解决DSL的调试挑战。

 

D2X:DSL的简单调试基础结构

这个名为D2X的新工具是一个DSL调试基础设施,与大多数标准调试器兼容,不需要对调试器本身进行任何修改。

D2X是一个C++库,由两个不同的部分组成:一个称为D2X-C的编译器库和一个名为D2X-R的运行库。要调用D2X,开发人员必须调用D2X-C API来编码DSL输入中与DSL相关的调试信息,例如源位置以及活动变量及其值。然后,用户可以调用D2X-R库API,提供变量和源信息,并在DSL中插入和删除断点。

 

Mapping of source information with D2X

源信息与D2X的映射。图片由麻省理工学院提供

 

使用D2X作为接口最重要的特点是它易于与现有DSL兼容。使用D2X,研究人员通过只更改1.4%的编译器代码库来增强现有的DSL并提供调试支持。通过向DSL添加调试支持,用户可以获得DSL代码的端到端图片。其结果应该是提高最终用户和DSL设计者的生产力。

未来,麻省理工学院团队希望将更多功能与BuildIt合并,包括突出显示关键字和自动完成文本的编辑功能。研究人员还打算在添加调试器的同时添加评测器,以帮助开发人员评估程序中的性能问题。