1.6 使用语言工作台
迄今所述的两种风格的DSL(内部和外部)是思考DSL的一般方式。或许,它们还没有得到广泛理解和运用,虽然应该如此,但是它们拥有很长的历史,也得到了适度的应用。因此,本书余下的部分就是让你在这些方面得到起步,运用那些成熟以及容易得到的工具。
但是还有一类全新的工具已初露端倪,它们也许会极大地改变DSL的游戏规则─这种工具称为语言工作台(language workbench)。语言工作台是一个环境,其设计初衷就是帮助人们构建新的DSL,以及有效地运用这些DSL所需的高质量工具。
使用外部DSL的一大劣势在于,我们会为相对有限的工具所羁绊。在文本编辑器里设置语法高亮,也就是大多数人所能到达的水平。诚然,你可以争辩,DSL很简单,脚本规模很小巧,以此说明这样就很好。但还是有人希望拥有支持现代IDE的成熟工具。语言工作台不仅让定义解析器变得简单,而且让为这门语言定制一个编辑环境变得简单。
所有这些都是有价值的,但是语言工作台真正有趣的方面在于,它们让DSL设计者从传统的基于文本的源码编辑走向不同形式的语言。最明显的一个例子就对图表语言的支持,我们可以通过状态转换图直接指定秘密面板状态机,见图1-7。
类似于这样的工具不仅可以定义图表语言,还可以从不同的角度来查看DSL脚本。在图1-7里,我们看到一幅图,一个列表(包括状态、时间),还有 一个表,其中是进入事件的代码(如果认为界面看上去太乱,它是可以从图中省略的)。
许多工具都有这种多窗格的可视化编辑环境,但是自己打造一个这样的东西需要很大的工作量。语言工作台要做的一件事就是,让这件事做起来变得相当容易。确实,我第一次上手MetaEdit这个工具,就能很快得到像图1-7这样的一个例子。这个工具可以让我为状态机定义语义模型,定义图形化和表格化的编辑器,像图1-7这样,然后根据语义模型编写代码生成器。
然而,虽然这种工具看上去不错,但许多程序员还是本能地怀疑这种玩具式的工具。有一些非常实际的原因,使得用文本表示代码更有意义。因此,其他工具另辟蹊径,提供一种后IntelliJ风格的能力─为基于文本的语言提供类似于语法指导的编辑,自动补全及其他类似功能。
我的怀疑是,如果语言工作台真的流行,其所产生的语言会不同于我们常规理解的编程语言。这种工具的一大益处在于,非程序员也可以编程。对这种想法,我常嗤之以鼻,因为这就是COBOL最初的意图。然而,我必须承认,有一个编程环境异常成功,它给非程序员提供了一个编程工具,让这些不认为自己是程序员的人也能编程─电子表格。
许多人并不把电子表格当做编程环境,然而我们可以说,它们是迄今为止最为成功的编程环境。作为一个编程环境,电子表格有一些有趣的特征。第一个有趣的因素就是把工具紧密地集成到编程环境。没有独立于工具的文本表示,也就无须解析器处理。工具和语言紧密地结合与设计在一起。
第二个有趣的因素称为说明性编程(illustrative programming)的东西。看一下电子表格,最为可视化的东西并不是可以进行所有计算的公式;而是构成样本计算的数字。这些数字是一个图示,展现了程序执行时所做的工作。在大多数编程语言里,程序是至关重要的,只有在运行测试时,才关注其输出。在电子表格里,至关重要的是输出,只有在单击单元格时,我们才会看到其程序。
说明性编程并不是一个赢得广泛关注的概念。为了讨论它,我甚至不得不创造出一个词。对于外行程序员而言,这可能是一个非常重要的部分,有了它,他们才得以对电子表格进行操作。它也有劣势,比如,缺乏对程序结构的关注,这样会导致大量复制–粘贴编程,以及结构糟糕的程序。
语言工作台支持开发类似于这些全新编程平台。因此,我认为,它们所产生的DSL可能更接近于电子表格,而非我们通常理解的DSL(也就是本书要讨论的内容)。
我认为,语言工作台有着非凡的潜力。如果能够达成目标,它们会完全改变软件开发的面貌。然而这个潜力,虽然深远,但尚在稍远的未来。语言工作台尚处于起步期,新的方式会定期出现,旧有的工具则进一步深化。所以,这里我不会过多地讨论,因为我觉得在本书预期的生命周期里,它们会有剧烈改变。但是,后面确实有一章是讨论它的,因为我觉得它值得关注。