论坛首页 编程语言技术论坛

DSL的讨论

浏览 21822 次
锁定老帖子 主题:DSL的讨论
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-08-19  
马教主的原话(这个中文bliki翻译得真好)
http://blog.csdn.net/mfowler/archive/2006/08/16/1069927.aspx
0 请登录后投票
   发表时间:2006-08-19  
gigix 写道
马教主的原话(这个中文bliki翻译得真好)
http://blog.csdn.net/mfowler/archive/2006/08/16/1069927.aspx


引用

我做设计时,经常借构建一套DSL的思路来类推——有意把class和方法设计成DSL的样子。不论用什么语言,我都尽量这么做,如果做不到,我就乐得转用代码生成技术了。在我们ThoughtWorks公司的较大型系统上,代码生成以及类似的技术使用得非常普遍。

什么时候需要把DSL和主语言划清界线,我认为这个问题的答案因主语言而异,用Smalltalk时我几乎从没感觉有必要分离出一种DSL来,而这种需求在用C++/Java/C#时则非常常见。

因此,我认为有的语言适合设计内部DSL,有的不适合。适合的是那种“一条道跑到黑”的风格简约的语言,它们在某一方面比其他传统语言走得更远更纯粹(例如 Lisp的函数式风格,Smalltalk的“对象-消息”思想),这是我分析Lisp和Smalltalk得出的结论。再看Ruby,它比前两者更常规化一些,也比它们都庞大,但仍不失为一门用来构建内部DSL的好语言


Keywords over API。
0 请登录后投票
   发表时间:2006-08-19  
buaawhl 写道
Keywords over API。

IF a THEN b ELSE c

你说这里的IF...THEN...ELSE是keywords还是API?
0 请登录后投票
   发表时间:2006-08-19  
gigix 写道
buaawhl 写道
Keywords over API。

IF a THEN b ELSE c

你说这里的IF...THEN...ELSE是keywords还是API?


Keywords.
0 请登录后投票
   发表时间:2006-08-19  
DSL 收到欢迎,主要原因是形式上看起来自然舒服,类似于自然语言的形式,或者某个领域中专用的语言形式。

形式上,DSL爱好者都有 Keywords over API 的偏好,喜欢去掉 . ( ) 等符号,而加入其他的单词作为承接,以增加可读性和描述能力。

有些语言的 API 写起来,形式上可以写得如同定义DSL关键字一样。比如,Smalltalk, FP, Ruby等。
0 请登录后投票
   发表时间:2006-09-25  
赞同gigix的观点,反对buaawhl的观点。

DSL本来就没有要做成通杀型的语言的欲望。本来就是领域特定的。本来就是为了解决特定领域问题的。我们解决特定领域问题自然可以采用通用目的语言,但是由于其目的的通用型,导致其繁琐和不自然,然后出现了各种类库和框架来帮助人们比较自然的表达领域问题。但是,由于这些类库和框架的基语言仍然是通用目的的语言,总是或多或少的影响到领域问题的表达能力,最常见的情况就是:对于特定设想情况的问题的解决采用框架就非常简单,一旦问题超越了特定的设想情况,就变得非常复杂和不自然。这里的原因是框架不仅仅是一个接口规范,它还隐含了实现规范。而DSL是一个Language,是一个真正意义上的接口抽象,是对问题领域的一个更高层次的理解,所以,DSL解决领域特定问题显得非常的自然和高效。

但是,一定要把握住:DSL是领域特定的,要想推广到别的领域是非常不合适的,那还不如用通用目的的语言好呢。

举个例子:SQL是关系型数据操纵领域的特定语言,也就是说,它是一种DSL,我们用它操纵数据非常的舒服和自然,可是如果我们把它推广到界面描述这个领域,就会发现他非常蹩脚。这不是SQL的错,也不是说DSL这个想法的就是愚蠢的,而是说:这样用的人是愚蠢的。

显然,我们是针对特定的领域创造特定的DSL的。这本质上跟创造一个框架差别不是很大,只要我们的框架或者类库是纯抽象的,完全把领域相关的操作定义清晰的就行。

比如:SQL语言也有一个发展的过程,没有Pivot的时候大家进行OLAP就显得非常复杂了,这说明DSL虽说是特定于领域的,但也不能阻止它进化,只要搞清楚自己的边界就行。如果边界的扩张明显的使得语言变得复杂和不可理解,这时候,应该思考的是定义另一个DSL。
0 请登录后投票
   发表时间:2006-09-25  
charon 写道
buaawhl 写道


人工智能有个领域叫做,遗传算法。就是代码自动生成,优胜劣汰。
发展到最终,就是《终结者》里面的天网。
天网对人类犯下了多大的罪行,各位精品电影爱好者应该深有感触。


兄弟,遗传算法没那么大本事。它只是更为广义的演化算法中的一个分支。
比他更牛X一点的是人工生命,但是从90年代后期已经逐渐和MultiAgentSystem(MAS)有融合趋势。最初的人工生命的起点太低,很难演化出复杂的结构来(但是那些相对简单的结构,确实干净漂亮.细胞自动机是冯诺依曼的另一个异常重要的创新,估计每隔20年就会有一坨子人被它吸引)
现在也就是MAS的发展才有可能有你说的那么恐怖的后果。不过,也有可能过了n年发现此路不通。这是一场复杂度、计算方法和计算能力的竞争。

现在MAS发展到什么程度了?这条仿生的道路我个人觉得最难的就是突变的模拟,否则竞争来竞争去还是那几个预设的属性和行为。

布娃娃说的那种代码产生一直是科幻小说里的理想,因为那种代码产生不是为了像DSL那样解决重复劳动而是为了创造出新的行为和属性。而且代码本身是不知道那个新行为是干嘛的,需要通过长时间的环境检验。。。呜,好像说跑题。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics