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

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(也就是本书要讨论的内容)。
我认为,语言工作台有着非凡的潜力。如果能够达成目标,它们会完全改变软件开发的面貌。然而这个潜力,虽然深远,但尚在稍远的未来。语言工作台尚处于起步期,新的方式会定期出现,旧有的工具则进一步深化。所以,这里我不会过多地讨论,因为我觉得在本书预期的生命周期里,它们会有剧烈改变。但是,后面确实有一章是讨论它的,因为我觉得它值得关注。

时间: 2024-09-20 05:34:05

《领域特定语言》一1.6 使用语言工作台的相关文章

如何设计一门编程语言(十) 正则表达式与领域特定语言(DSL)

几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一开始上来就设计通用语言的.我自己第一次做这种事情是在高中写这个傻逼ARPG的时候了.当时做了一个超简单的脚本语言,长的就跟汇编差不多,虽然每一个指令都写成了调用函数的形态.虽然这个游戏需要脚本在剧情里面控制一些人物的走动什么的,但是所幸并不复杂,于是还是完成了任务.一眨眼10年过去了,现在在写Gac

《领域特定语言》一第1章 入 门 例 子1.1 哥特式建筑安全系统

第1章 入 门 例 子 落笔之初,我需要快速地解释一下本书的内容,就是解释什么是领域特定语言(Domain– Specific Language,DSL).为达此目的,我一般都会先展示一个具体的例子,随后再给出抽象的定义.因此,我会从一个例子开始,展示DSL可以采用的不同形式.在第2章里,我会试着把这个定义概括为一些更广泛适用的东西. 1.1 哥特式建筑安全系统 在我的童年记忆里,电视上播放的那些低劣的冒险电影是模糊却持久的.通常,这些电影的场景会安排某个古旧的城堡.密室或走廊在其中起着重要的作

《领域特定语言》一导读

前 言 在我开始编程之前,DSL(Domain–Specific Language,领域特定语言)就已经成了程序世界中的一员.随便找个UNIX或者Lisp老手问问,他一定会跟你滔滔不绝地谈起DSL是怎么成为他的镇宅之宝的,直到你被烦得痛不欲生为止.但即便这样,DSL却从未成为计算领域的一大亮点.大多数人都是从别人那里学到DSL,而且只学到了有限的几种技术. 我写这本书就是为了改变这个现状.我希望通过本书介绍的大量DSL技术,让你有足够的信息来做出决策:是否在工作中使用DSL,以及选择哪一种DSL

《领域特定语言》一第2章 使用DSL 2.1定义DSL

第2章 使用DSL 看过上一章的例子后,即便尚未给出DSL的一般定义,对于何为DSL,你也应该已经有了自己的认识.(第10章中有更多例子.)现在,要开始讨论DSL的定义及其优势与问题.这样就可以为下一章讨论DSL实现提供一些上下文. 2.1定义DSL "领域特定语言"是一个很有用的术语和概念,但其边界很模糊.一些东西很明显是DSL,但另一些可能会引发争议.这一术语由来已久,不过,正如软件行业中的很多东西一样,它也从未有过一个确切的定义.然而,就本书而言,定义是非常有价值的.领域特定语言

C语言找出数组中的特定元素的算法解析_C 语言

     问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它.能否只用一个额外数组和少量其它空间实现.       思路:如果能用两个辅助数组,那么相对来说简单一点,可定义数组Min和数组Max,其中Min[i]表示自a[i]之后的最小值(包括a[i]),Max[i]表示自a[i]之前元素的最大值.有了这两个辅助数组后,对于a[i],如果它大于Max[i-1]并且小于Min[i+1],那么就符合要求.       但是题目要求

C语言实现修改文本文件中特定行的实现代码_C 语言

好的,首先我先叙述下功能要求:其实很简单,就是Shell中sed命令的C语言实现,实现定位到所需要的字段的那一行,之后修改成需要的内容.但是由于C语言是面向过程的语言,需要顺序执行的特点,所以,实现中遇到了很多麻烦,在这里博主将实现的过程描述如下,以便大家参考. 问题描述: 文本内容: 复制代码 代码如下: wireless.1.authmode=1wireless.1.compression=0wireless.1.current_ap=ssid12wireless.1.current_sta

《21天学通C语言(第6版•修订版)》一第1章 C语言概览1.1 C语言简史

第1章 C语言概览 21天学通C语言(第6版•修订版) 欢迎阅读<21天学通C语言>第6版.今天的课程将带领读者开始向精通C语言的程序员进发.今天您将学习以下内容: 为什么说C语言是一种不错的编程语言. 程序开发周期中的各个步骤. 编写.编译并运行您的第一个C语言程序. 由编译器和链接程序所生成的错误消息. 1.1 C语言简史 21天学通C语言(第6版•修订版) 读者可能想知道C语言的起源,为何叫C语言.C语言是由贝尔实验室的Dennis Ritchie于1972年开发的.开发它并非为了消遣,

C语言泛型编程实例教程_C 语言

本文实例讲述了C语言泛型编程的方法,分享给大家供大家参考之用.具体分析如下: 首先,泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同.在C语言中,可以通过一些手段实现这样的泛型编程.这里介绍一种方法--通过无类型指针void* 看下面的一个实现交换两个元素内容的函数swap,以整型int为例: void swap(int* i1,int* i2){ int temp; temp = *i1; *i1 = *i2; *i2 = temp; } 当你想交换两个

C语言 数据类型详细介绍_C 语言

C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 1 基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型. 2 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量. 3 void 类型: 类型说明符 void 表明没有可用的值. 4 派生类型: 它们包括:指针类型.数组类型.结构类型.共用体类型和函数类型.

c语言-语言重视概念?C语言中什么是表达是表达式

问题描述 语言重视概念?C语言中什么是表达是表达式 请教大神,麻烦详细回答,请全面点. 还有学习C等计算机语言要特别重视概念的东西吗?比如什么是常量,什么是变量等 老师平时i老是提问同学概念问题. 我平时都没怎么重视概念.以为看懂了程序就OK了. 来个大神分享心得.. 解决方案 基本概念当然非常重要,但是重要不等于难以理解,相反,如果你具有非常丰富的编程经验,不用刻意地学,也能领悟. 解决方案二: 多看书,就能掌握基础知识了,然后使用的时候多查查,温习 解决方案三: 在学生期,是一定要重视概念的