《领域特定语言》一1.6 使用语言工作台

简介: 本节书摘来自华章出版社《领域特定语言》一书中的第1章,第1.6节,作者 (英)Martin Fowler,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.6 使用语言工作台

迄今所述的两种风格的DSL(内部和外部)是思考DSL的一般方式。或许,它们还没有得到广泛理解和运用,虽然应该如此,但是它们拥有很长的历史,也得到了适度的应用。因此,本书余下的部分就是让你在这些方面得到起步,运用那些成熟以及容易得到的工具。
但是还有一类全新的工具已初露端倪,它们也许会极大地改变DSL的游戏规则─这种工具称为语言工作台(language workbench)。语言工作台是一个环境,其设计初衷就是帮助人们构建新的DSL,以及有效地运用这些DSL所需的高质量工具。
使用外部DSL的一大劣势在于,我们会为相对有限的工具所羁绊。在文本编辑器里设置语法高亮,也就是大多数人所能到达的水平。诚然,你可以争辩,DSL很简单,脚本规模很小巧,以此说明这样就很好。但还是有人希望拥有支持现代IDE的成熟工具。语言工作台不仅让定义解析器变得简单,而且让为这门语言定制一个编辑环境变得简单。
所有这些都是有价值的,但是语言工作台真正有趣的方面在于,它们让DSL设计者从传统的基于文本的源码编辑走向不同形式的语言。最明显的一个例子就对图表语言的支持,我们可以通过状态转换图直接指定秘密面板状态机,见图1-7。
类似于这样的工具不仅可以定义图表语言,还可以从不同的角度来查看DSL脚本。在图1-7里,我们看到一幅图,一个列表(包括状态、时间),还有 一个表,其中是进入事件的代码(如果认为界面看上去太乱,它是可以从图中省略的)。

image

许多工具都有这种多窗格的可视化编辑环境,但是自己打造一个这样的东西需要很大的工作量。语言工作台要做的一件事就是,让这件事做起来变得相当容易。确实,我第一次上手MetaEdit这个工具,就能很快得到像图1-7这样的一个例子。这个工具可以让我为状态机定义语义模型,定义图形化和表格化的编辑器,像图1-7这样,然后根据语义模型编写代码生成器。
然而,虽然这种工具看上去不错,但许多程序员还是本能地怀疑这种玩具式的工具。有一些非常实际的原因,使得用文本表示代码更有意义。因此,其他工具另辟蹊径,提供一种后IntelliJ风格的能力─为基于文本的语言提供类似于语法指导的编辑,自动补全及其他类似功能。
我的怀疑是,如果语言工作台真的流行,其所产生的语言会不同于我们常规理解的编程语言。这种工具的一大益处在于,非程序员也可以编程。对这种想法,我常嗤之以鼻,因为这就是COBOL最初的意图。然而,我必须承认,有一个编程环境异常成功,它给非程序员提供了一个编程工具,让这些不认为自己是程序员的人也能编程─电子表格。
许多人并不把电子表格当做编程环境,然而我们可以说,它们是迄今为止最为成功的编程环境。作为一个编程环境,电子表格有一些有趣的特征。第一个有趣的因素就是把工具紧密地集成到编程环境。没有独立于工具的文本表示,也就无须解析器处理。工具和语言紧密地结合与设计在一起。
第二个有趣的因素称为说明性编程(illustrative programming)的东西。看一下电子表格,最为可视化的东西并不是可以进行所有计算的公式;而是构成样本计算的数字。这些数字是一个图示,展现了程序执行时所做的工作。在大多数编程语言里,程序是至关重要的,只有在运行测试时,才关注其输出。在电子表格里,至关重要的是输出,只有在单击单元格时,我们才会看到其程序。
说明性编程并不是一个赢得广泛关注的概念。为了讨论它,我甚至不得不创造出一个词。对于外行程序员而言,这可能是一个非常重要的部分,有了它,他们才得以对电子表格进行操作。它也有劣势,比如,缺乏对程序结构的关注,这样会导致大量复制–粘贴编程,以及结构糟糕的程序。
语言工作台支持开发类似于这些全新编程平台。因此,我认为,它们所产生的DSL可能更接近于电子表格,而非我们通常理解的DSL(也就是本书要讨论的内容)。
我认为,语言工作台有着非凡的潜力。如果能够达成目标,它们会完全改变软件开发的面貌。然而这个潜力,虽然深远,但尚在稍远的未来。语言工作台尚处于起步期,新的方式会定期出现,旧有的工具则进一步深化。所以,这里我不会过多地讨论,因为我觉得在本书预期的生命周期里,它们会有剧烈改变。但是,后面确实有一章是讨论它的,因为我觉得它值得关注。

相关文章
|
9月前
|
开发框架 API 开发者
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 二)
在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。
|
1月前
|
程序员 C++
C++语言模板学习应用案例
C++模板实现通用代码,以适应多种数据类型。示例展示了一个计算两数之和的模板函数`add<T>`,可处理整数和浮点数。在`main`函数中,展示了对`add`模板的调用,分别计算整数和浮点数的和,输出结果。
13 2
|
6月前
|
算法 IDE 程序员
快速入门C++17:了解最新的语言特性和功能(上)
快速入门C++17:了解最新的语言特性和功能
快速入门C++17:了解最新的语言特性和功能(上)
|
5月前
|
数据可视化 前端开发 JavaScript
iVX,重新定义编程:人人都可掌握的可视化编程
iVX,重新定义编程:人人都可掌握的可视化编程
71 0
|
6月前
|
存储 安全 编译器
快速入门C++17:了解最新的语言特性和功能(下)
快速入门C++17:了解最新的语言特性和功能
|
9月前
|
开发框架 前端开发 开发者
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 五)
如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,我们推出了可以提炼公共样式进行复用的装饰器@Styles。
|
9月前
|
开发框架 JavaScript 开发者
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 一)
ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前,建议开发者具备TS语言开发能力。
|
9月前
|
开发框架 前端开发 JavaScript
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)
页面和自定义组件生命周期 在开始之前,先明确自定义组件和页面的关系
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 三)
|
9月前
|
开发框架 开发者
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 四)
当创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。
|
Rust JavaScript Cloud Native
谁是虽好的语言 ?- 语言选型闲聊(下)
近期我们公司做架构升级,调研了一下各种语言, 包括TypeScript,c#,rust, 还有java和go。这个过程中有一些个人看法,可能会有些偏颇或者不正确的地方,我就简单一说,大家一乐,无意引战。
217 0
谁是虽好的语言 ?- 语言选型闲聊(下)