2019年的某个时候,麻省理工学院博士。学生AjayBrahmakshatriya制定了一个简单但仍然非常具有挑战性的目标。他想让在特定领域(例如气候建模、生物信息学或建筑学)具有专业知识的人能够编写自己的编程语言,即所谓的领域特定语言(或DSL),即使他们几乎没有或者没有创建编程语言的经验。

新的软件工具提供了一种更简单的方法来调试任何特定领域的编程语言

Brahmakshatriya是麻省理工学院计算机科学与人工智能实验室(CSAIL)教授SamanAmarasinghe领导的研究小组成员,他希望这些语言具有人们舒适使用它们所需的所有辅助功能,包括调试工具。这个消除软件错误的过程是必不可少的,他和Amarasinghe同意,因为他们称缺乏调试支持是“DSL的致命弱点”。

这几年对他们俩来说都是富有成效的。2021年,Brahmakshatriya和Amarasinghe推出了BuildIt,这是一个大大简化创建DSL任务的软件包。上个月,在计算机协会联合主办的蒙特利尔国际会议上,两人介绍了D2X,这是一种可以轻松向任何DSL添加调试的工具,并且已被证明与BuildIt配合得特别好。他们关于这项工作的论文甚至赢得了会议颁发的两项杰出论文奖之一。

Brahmakshatriya解释说,在专门领域产生语言的主要原因是“为了提高易用性”。例如,图像处理DSL可以具有“模糊整个图像”的功能。Brahmakshatriya指出,用通用语言发出相同的命令需要更多的代码行。“这是使用DSL的部分原因。另一个是性能。”由于操作特定于该领域,因此可以更轻松地对其进行优化——以正确的顺序执行,从而更高效、更快速地完成。

Brahmakshatriya将BuildIt描述为“用于创建DSL的DSL”。它促进了一个多步骤过程,用于采用现有的通用编程语言并将其削减,直到它以正确的方式专门化。“假设你有一个问题,你想写一个程序来解决它,”他说。“你可以编写一个程序来解决整个问题,或者你可以编写一个较小的程序来解决你感兴趣的问题的子类。你编写的程序越专业,它运行的速度就越快。”BuildIt旨在根据这些指导原则构建DSL。

Halide——一种图像处理语言,于2012年发明,早于BuildIt出现——是Amarasinghe小组推出的首批DSL之一。它的开发由当时的研究生Jonathan-RaganKelley和当时的CSAIL博士后AndrewAdams领导。“Halide现在非常流行,它被用于许多Adob​​e应用程序,包括Photoshop,但它仍然没有调试器,”Amarasinghe说。他补充说,原因是“调试器非常复杂。很难编写它们,这就是为什么大多数小型DSL不支持调试的原因。”

根据Brahmakshatriya的说法,这不是一个理想的状态,他坚持认为每个DSL都应该有自己的调试器。“你不能直接将现有的调试器用于你的新语言,因为它们不了解领域。”此外,他说,编写一个第一次就完全正确的程序是不可能的。“你总是从有错误的东西开始,尽管它们通常要到开发周期的很晚才出现。如果在那个时候出现错误,当你有5,000行代码时,可能会非常困难找到它。”因此,一旦程序“代码完成”——开发人员认为它已准备好进行测试——软件工程师可能不得不将一半以上的时间投入到繁重的调试工作中。

但帮助正在以D2X的形式出现(发音为“detox”,因为它与消除程序中的毒物或缺陷的概念有关)。D2X本身不是一个程序,而是被归类为一个库——一段可以被其他程序重用的计算机代码。它旨在与现有调试器(例如GDB或LLDB)一起使用,充当这些工具和给定DSL之间的桥梁。调试器需要有关要清理的程序或编程语言的信息。“每个调试器都需要采用自己特定格式的信息,可以是400页的文档,”Amarasinghe说。“如果你使用D2X,你就不必担心了。它已经为你处理好了。”

Brahmakshatriya说,使用D2X作为接口,“您的程序可以使用流行的调试器进行调试,而无需对调试器本身进行任何修改。”在他看来,这是将D2X与BuildIt相结合的主要优势:“如果您使用BuildIt编写DSL,则无需做任何额外的工作。您可以免费获得调试器,而无需编写任何额外的代码行的代码。”

“D2X正面解决了高性能软件的内在矛盾,”康奈尔大学计算机科学副教授AdrianSampson评论道。“一方面,领域特定语言是我们在现代时代大幅提高计算效率的唯一希望。但是,从头开始为一种新语言制作一个新的调试器是很困难的,没有调试器是一个合理的原因“程序员可能会拒绝一种‘更好’的语言而选择一种‘更差’的语言。D2X的伟大之处在于它降低了为DSL构建有用的调试器的障碍。”

但就布茹阿玛沙特里亚而言,故事还没有结束。除了调试之外,他想与BuildIt合并的另一个功能是编辑,这使得编写程序变得更加容易。例如,编辑可以突出显示文档中的某些关键字,这可以提高其可读性。它们可以执行其他功能,例如自动完成,在输入一小部分后自动填充文本。

Brahmakshatriya希望将分析器以及调试器和编辑器作为BuildIt平台的一部分。“剖析器就像调试器,但它们不是帮助你发现错误,而是让你评估程序中的性能问题,”他说。“如果程序运行速度比预期慢,您可以使用分析器了解程序的哪一部分陷入困境。”他说,未来可能会添加其他有用的功能。

Amarasinghe坚持认为,所有这些努力将使创建专门语言的前景更具吸引力。“在我看来,有大量的人支持传统语言——数以千计的程序员为C、C++或Java构建工具,”他说。“另一方面,如果我正在构建一个简单的DSL,我没有成千上万的程序员来提供所有支持。”但现在,有了BuildIt和D2X,他补充说,“小家伙可以获得其他人获得的所有东西,包括调试器,最终是编辑器和分析器——与传统语言相同的好处。而且你不需要团队工程师编写各种复杂的代码。”