文章目录
  1. 1. Graphviz
  2. 2. JMock
  3. 3. CSS
  4. 4. HQL
  5. 5. XAML
  6. 6. FIT
  7. 7. Make等

软件世界充满了DSL,下面就给大家介绍一些具有代表性的例子。

Graphviz

Graphviz是一个有用的工具包,是一个程序库,用于对“节点 - 弧”图就行图形渲染。如:

用生成这个图标,就要用DOT语言编写,这是一种外部DSL:

digraph finite_state_machine {
    rankdir = LR;
    size = "8.5";
    node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
    node [shape = circle];
    LR_0 -> LR_2 [label = "SS(B)"];
    LR_0 -> LR_1 [label = "SS(S)"];
    LR_1 -> LR_3 [label = "SS($end)"];
    LR_2 -> LR_6 [label = "SS(b)"];
    LR_2 -> LR_5 [label = "SS(a)"];
    LR_2 -> LR_4 [label = "SS(A)"];
    LR_5 -> LR_7 [label = "SS(b)"];
    LR_5 -> LR_5 [label = "SS(a)"];
    LR_6 -> LR_6 [label = "SS(b)"];
    LR_6 -> LR_5 [label = "SS(a)"];
    LR_7 -> LR_8 [label = "SS(b)"];
    LR_7 -> LR_5 [label = "SS(a)"];
    LR_8 -> LR_6 [label = "SS(b)"];
    LR_8 -> LR_5 [label = "SS(a)"];
}

这个例子在图上显示了两种东西:节点和弧。节点用node关键字声明,但不一定要声明出来。用弧->操作符声明。在方括号里列出来的是,节点和弧的属性。

Graohviz使用的语义模型时C数据结构的形式。语义模型有解析器组装的,采用语法指导翻译和嵌入式语法翻译等技术,解析器本身由Yacc和C编写。该解析器很好地利用了“解析助手”。

JMock

JMock是Mock Object的一个java程序库。

JMock使用渐进式接口。

JMock采用表达式生成器处理DSL,并将其翻译成mock和预期的语义模型。

CSS

CSS是一个很好的DSL例子,很多CSS程序员都不认为自己是程序员,而是web设计师。

CSS在声明式计算模型方面也是一个很好的例子。

同大多数DSL一样,CSS在创建抽象方面能力不足—这是DSL受限表达力带来的后果。一种解决方案是,编写一种类似于CSS的DSL,生成CSS作为输出,如SASS和LESS。

HQL

Hibernate是一个广泛应用的对象-关系映射系统,可以将Java类映射到关系数据库的表上。HQL提供了这样一种能力,在Java类上以类似于SQL的方法编写查询语句,映射到真是数据库的SQL查询上。如:

select person from Person person, Calendar calendar 
where calendar.holidays[national day] = person.birthday 
and person.nationality.caleadar = calendar

这让我们可以以Java类的方式思考,而不是数据库,此外,这种做法还避免了不同数据库SQL方言之间各种恼人的差别。

HQL处理的本质是,将HQL查询翻译成SQL查询。Hibernate分三步走:

  1. 用语法指导翻译和树的构造将HQL输入文本转化为HQL的抽象语法树(AST)
  2. 把HQL AST 转换为SQL AST
  3. 代码生成器根据SQL AST生成SQL

可以把SQL AST看做语义模型。

XAML

XAML(eXtensible Application Markup Language)是UI布局的一种DSL。就是XML文件,用来布局对象结构:使用WPF,可以布局屏幕。如:

<StackPanel>
  <StackPanel.Children>
    <!--<UIElementCollection>-->
    <Button>First Button</Button>
    <Button>Second Button</Button>
    <!--</UIElementCollection>-->
  </StackPanel.Children>
</StackPanel>

从逻辑上说,XAML文档定义了一个C#类,这里确实会用到代码生成,生成的代码是部分类(partial class)。

其他布局图形结构的DSL:Swiby、PIC

FIT

FIT(Framework for Integrated Test)是一个测试框架。其目标是,以领域专家可以理解的方式,描述测试场景。随后的许多工具扩展了这个基本的想法,尤其是Fitness。

FIT的核心是提供一种记法,让非程序员也能够很容易地使用表格形式指定示例值。所以FIT程序就是一堆表格,典型的做法是嵌套在HTML页面中。

Make等

Make是一种外部DSL,提供一个组织构建的平台。构建的问题在于,很多步骤都代价昂贵,但并不需要每次都做,所以,编程模型选择依赖网络。Make程序由若干目标组成,这些目标通过依赖联系在一起。

Rake类似于Make和Ant,也用依赖网络作为其核心计算模型,最大的区别是它是Ruby的一种内部DSL。

Rake中的目标可以是任务,也可以是文件(支持面向任务和面向产品的两种风格的依赖网络)。

文章目录
  1. 1. Graphviz
  2. 2. JMock
  3. 3. CSS
  4. 4. HQL
  5. 5. XAML
  6. 6. FIT
  7. 7. Make等