Chinaunix首页 | 论坛 | 博客
  • 博客访问: 501946
  • 博文数量: 704
  • 博客积分: 39800
  • 博客等级: 大将
  • 技术积分: 4950
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 13:32
文章分类

全部博文(704)

文章存档

2011年(1)

2008年(703)

我的朋友

分类:

2008-10-15 13:42:28

  最近领域特定语言(DSL,Domain Specific Languages)这个话题比较热门。这可以从Rails现象中看到。Rails的流行以及Rails上广泛使用的领域特定语言(从现在起叫DSL),已经引起了对DSL的广泛兴趣。
 
  到现在为止开发人员有这样的印象,建立一个DSL,你需要专业的编译器理论知识,理解Lex和Yacc的内部工作原理并需要投入大量的时间来构建DSL.结果是极少数人愿意去尝试,他们都是从头开始构建自己的语言。
 
  这往往是成本高昂。
 
  同时,动态语言的爱好者可以毫不费力的利用他们喜欢的动态语言的动态特性来构建领域特定语言。事实上,他们中的许多以这种方式构建的任何应用程序,都有着显著的复杂性。
 
  这两种方法的差别有重要意义。第一种方式是创建属于自己的语言,就是所谓外部的DSL(External DSL)。这是一个耗资巨大的项目,因为一切都要从头开始构建,需要考虑运算符的优先级规则、运行时类库、执行代码、错误处理和I/O.第二种方法是利用和修改宿主语言,就是所谓内部的DSL(Internal DSL)。这些都容易构建和维护。你只需要考虑如何修改,所有的其它东西(通常是你不用关心的)都已经被宿主语言处理了。
 
  另一种做法是构建连贯接口(Fluent Interface),把它叫做DSL.我认为这不是一种DSL,这种方法往往在语言的自由性方面受到很大的限制。和就是很好的例子,包括 6和 3.你可以列举许多语言方面的API,但这不能让我觉得这是一个DSL.在任何情况下,我的个人偏好是使用具有很高语法灵活性的内部DSL.因为我基本上都是在CLR上工作,我想利用运行在这个平台上的宿主语言。它可以让我重用大部分的使用CLR的知识,不要低估这方面的好处。在你的手中有一个熟悉的环境是非常重要的。
 
  在深入语言之前,看看究竟什么是“高语法灵活性的语言”,怎么样?为内部DSL提供一个良好的宿主环境的语言需要具有哪些特性?
 
  我需要有合适的手段来表达我的想法。这可以通过有启发性的命名,表达特定域的概念,并通常和通用语言的做法不一样。你希望能够创建一个第四代语言,这很容易做到。让我们从一个我们电子表格所使用的脚本这样简单的DSL开始如何?
 
  你的任务就是创建乘法网格。
 

for x in range(100):     for y in range(100):         

cell[ x+1 , y+1 ]  = x * y    

formula x, 100, sum( x1, x100 )

  这是不是真的令人印象深刻呢?这和编程语言几乎完全一样,代码也是微不足道。除了和用Excel的自动化API做一样的工作外,更简短。
 
  注意到这就是我们所用到的所有代码。我们不需要一个类的定义,或者是一个主方法。这是一个没有任何语法包袱的可执行的DSL脚本。
 
  如果前面的例子没有给你留下深刻的印象,看看如何定义订单折扣的业务规则:

apply_discount_of 5.percent:        

when order.Total > 1000 and customer.IsPreferred        

when order.Total > 10000suggest_registered_to_preferred:        

when order.Total  > 100 and not customer.IsPreferred


  这看起来和编程语言有很大不同,它更像业务分析师在Word文档中定义的业务规则。
 
  从我的角度来看,上面两个例子都是领域特定语言。他们只是表达领域的方法和风格不同。这两个例子,我们实际上已经从语言中移除了和我们的领域没有直接关系的东西。这使得我们可以专注于域,并希望有良好的工具来处理。
 
  除了域概念以外,没有任何东西可以和具有与域相匹配的语法是一样重要的。
 
  当我们开始在CLR上研究高语法灵活性的语言的时候,我们有很多的选择。我们来评估几个语言。我们将从几个来自微软的语言开始。
 
   —— 这是一个非常刚性的语言,类型定义,没有独立的方法/代码块,僵硬的语言。所有这些特性使得C#不是一个DSL宿主语言的好选择。他也可以做到的,但它不如其他方法。
 
  VB —— 其实VB更适合面向对象的语言,因为它使用了许多英文单词作为关键字和操作符。令人遗憾的是它也是一个非常冗长的语言,我们要减少冗余性适合我们的域概念。
 
  JScript —— 这可能引来一片笑声,但是JScript是一个非常灵活的语言,为许多事情提供了较好的语法。只要去看看所提供的所有Javascript类库。JScript提供了和Javascript相同的基础功能。虽然这样,有一点不得不考虑的是你可以做到像JQuery或 Prototype那样多大的灵活性。然而它不够成熟,我不确定将来是什么样子的。虽然它在很多方面有灵活的语法,给人有种编程语言的感觉,这会让我在一个DSL中觉得分心。
 

[1]    

【责编:Luzi】

--------------------next---------------------

阅读(225) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~