讨论讨论DSL(Domain Specific Language)如何?

237 views
Skip to first unread message

pongba

unread,
Oct 8, 2007, 9:53:05 AM10/8/07
to pon...@googlegroups.com
貌似这个概念被Martine Flower吹捧了好久了。具体可以google一下 :P

Martine Flower把这个编程范式定义为Language Oriented Programming,这个描述其实很精确。

我个人的感觉,就跟编程界的诸多工具一样,这个工具有两面性。一方面,它的出发点非常好:最直观的就是领域语言了,如今的general purpose language在支持DSL设计方面缺陷很多,导致一些很笨拙的方案,比如C++里面用操作符重载来实现regex,那叫一个丑。我不知道Ruby这方面如何,了解的人指教一下?
无论如何,DSL支持在主流语言里面还是一个second-class的特性。

但另一方面,对DSL进行first-class的支持。其实就是提倡这样一个思想:要把一个general-purpose的语言应用到一个领域,就是先在这个领域做一个DSL,然后再针对这个DSL编程。于是问题来了,谁来设计这个DSL?语言的设计可是比库设计难得多的问题。DSL带来的灵活性同时也使得设计一个接口的选择极大化了,原来在C里面只有光秃秃的函数,接口设计总离不开那几招。后来有了OOP,一下带来了一个额外维度的复杂性。现在来一个DSL,鬼知道有多复杂。当然,复杂性从来都不是阻止去用一个东西的合理理由。一个好的DSL正如一个好的接口一样能够帮助正确使用,阻止错误使用...

我只想问一个问题,一个典型的高级程序员,也许能够设计出一个足够的C库乃至OO库,但足够设计出一个足够的DSL吗?后者的门槛显然更高,想想正则表达式吧..

最后一个想法就是,Eric Raymond老大也说过,程序员会仅仅因为能用某个特性,而就去使用某个特性... 这也是为什么C++总被"更"复杂地使用着的原因。那么DSL呢?有多少领域DSL如此重要呢?

--
刘未鹏(pongba)|C++的罗浮宫
http://blog.csdn.net/pongba
TopLanguage
http://groups.google.com/group/pongba

oldrev

unread,
Oct 8, 2007, 10:03:17 PM10/8/07
to pon...@googlegroups.com
Ruby 的 DSL 确实很强,拜大量的省略用法和Functional-like特性所赐,Ruby 完
全可以把自己装扮成其他的简单语言。

问题是这个DSL的度很难把握,放得太松语言会太复杂,收得太紧又学不像。

Regards,
oldrev

在 2007-10-08一的 21:53 +0800,pongba写道:

Atry

unread,
Oct 8, 2007, 10:54:43 AM10/8/07
to pon...@googlegroups.com
嗯嗯,如果 C++ 支持重载空格也许 regex 会好看些

在07-10-9,oldrev <old...@gmail.com> 写道:

XXX123

unread,
Oct 8, 2007, 11:37:45 AM10/8/07
to TopLanguage
偶觉得ruby的DSL能力主要来自lamda和内嵌的表,函数的自由写法也帮了不少忙。C++有了lamda后配合模板估计在DSL方面会有很大进
展,就是语法难看了点,比不上ruby优雅。

pongba 写道:

Huafeng Mo

unread,
Oct 8, 2007, 10:20:33 PM10/8/07
to pon...@googlegroups.com
当我刚看到Template Metaprogramming里讲述如何创建一种子语言时,兴奋异常。不过越往下看,心越凉。这种古怪丑陋的语法,也能称为一种语言?想想也难怪,毕竟C++不是为干这个设计的,TMP纯粹是误打误撞。
我觉得DSL或许可以通过这么几种方式实现:
1、强化GPL的扩展能力,使其具备扩展出一种DSL子语言的能力。我在偶然的机会看到了一种叫XL的语言。它声称可以通过库和编译器扩展组件扩展语言。在库扩展语言方面,它实际上是先制作一个特定语义的语言实体,然后同相应的语法构造绑定。介绍里举了一个例子:function Multiply_Add(vector A, B, C) return vector written A*B+C
vector M, N, O
vector P := M * N + O
通过written关键字将一个向量运算函数同操作符运算绑定起来。其他方面没有细看,不知道它能够扩展到什么程度。或许这也可能作为一种思路。
2、语言族。一族具备共同的语法基础和编程模型的语言,其中核心是象C++这类强大复杂的语言,负责开发基础模块和组件。而外围的一些语言则可以使用这些模块,但不具备核心语言的那些复杂的特性。比如,外围语言可以用模板,但不能创建模板。外围语言就可以做成DSL类的语言,面向特定领域设计特性。.net实际上有这么一点味道,但是反过来了,将诸多不同的语言整合到一个统一的编程平台上来。这种做法往往为了兼顾各方的特性,使得编程模型限制很大。相反统一设计的语言族,则可以避免削足适履的情形。
3、特型开关。单一、强大的语言,但可以通过一些编译开关开放或屏蔽某些语言特性,使得语言"收缩"成为一种更简单的自语言。通过屏蔽不同的特性,或许可以产生不同特性的DSL。D&E里好像也提到过特性开关的问题,但是可能造成语言过度复杂,因而未被考虑。
我比较喜欢语言族,与其搞一些大而全的东西,还不如通过语言间的分工协作来的高效。高低搭配,各展其长,始终是效益最大化的最佳途径嘛。


在07-10-8,XXX123 <twj...@sina.com> 写道:

pongba

unread,
Oct 8, 2007, 10:59:26 PM10/8/07
to pon...@googlegroups.com
另外,我还有个想法。如果DSL真的进入业界的话,所有语言都得消失了。因为将只剩一种语言:用来定义语言的语言,元语言。为什么是一种元语言而不是几种,我觉得是因为在定义语言的语法方面必然会有一个最优方案,这不像OOP,OB,FP这些对现实世界的建模语言互补。既然有最优方案,最后总是那个最优方案胜出。

最后语言之争消亡,取而代之的是DSL之争,看谁写的DSL直观好用。不过话说回来,DSL之争还是语言之争。从一个意义上说,库(使用接口)的好坏之争还是语言之争。大家都是"抽象"之争。

我想说什么来着?

Atry

unread,
Oct 9, 2007, 1:38:30 AM10/9/07
to pon...@googlegroups.com
Lisp 就是那种元语言。 Lisp 虽然不能创造新的语法,但是一种专门的语法到一个 Lisp 的 CodeDOM的映射是非常容易的。 CodeDOM 是 .net 里面的反射,这里借用这个名词。

在07-10-9,pongba < pon...@gmail.com> 写道:

Huafeng Mo

unread,
Oct 10, 2007, 5:08:23 AM10/10/07
to pon...@googlegroups.com
ms不是推出了一个什么dsl tool吗?有用过的吗?

在07-10-9,Atry <pop....@gmail.com> 写道:



--
反者道之动,弱者道之用

Huafeng Mo

unread,
Oct 10, 2007, 9:45:03 PM10/10/07
to pon...@googlegroups.com
对了,以前的嵌入式sql是否可以算dsl?

在07-10-10,Huafeng Mo <longsh...@gmail.com> 写道:



--
反者道之动,弱者道之用

redsea(肖海彤)

unread,
Oct 10, 2007, 10:04:53 PM10/10/07
to pon...@googlegroups.com
dsl 的史前时代 ?
模糊记得当时的嵌入 sql 用起来麻烦事情还是很多的, 比起现在用脚本语言里面用sql 麻烦不少.

 
在07-10-11,Huafeng Mo <longsh...@gmail.com> 写道:
对了,以前的嵌入式sql是否可以算dsl?

Huafeng Mo

unread,
Oct 10, 2007, 10:34:28 PM10/10/07
to pon...@googlegroups.com
这样是不是可以算作一种dsl?
在财务软件中制作一个凭证:
string doc_num
begin document
    debit account 1010102 ¥1000
        credit account 5020301 ¥500
        credit account 50104 ¥500
    text "..."
    doc_num=document_id
    exception:
        on bad_account: ...
        on not_balance: ...
end document


在07-10-11,redsea(肖海彤) < red...@gmail.com> 写道:



--
反者道之动,弱者道之用

oldrev

unread,
Oct 11, 2007, 12:52:40 PM10/11/07
to pon...@googlegroups.com
LINQ 才能算

--

Regards,
- Oldrev

oldrev

unread,
Oct 11, 2007, 1:00:15 PM10/11/07
to pon...@googlegroups.com
Nemerle 的 SQL DSL:

ExecuteNonQuery ("INSERT INTO employee VALUES ('John', 'Boo')", conn);

这段代码会在编译时展开成标准的 .Net 数据库操作代码,DSL 还是让他们呆在引
号里比较好,省得 hosting 语言变复杂。

参考: http://nemerle.org/SQL_macros

在 2007-10-08一的 21:53 +0800,pongba写道:

> 貌似这个概念被Martine Flower吹捧了好久了。具体可以google一下 :P
>

> Martine Flower把这个编程范式定义为Language Oriented Programming,这个
> 描述其实很精确。
>
> 我个人的感觉,就跟编程界的诸多工具一样,这个工具有两面性。一方面,它的
> 出发点非常好:最直观的就是领域语言了,如今的general purpose language在
> 支持DSL设计方面缺陷很多,导致一些很笨拙的方案,比如C++里面用操作符重载

> 来实现regex,那叫一个丑。我不知道Ruby这方面如何,了解的人指教一下?
> 无论如何,DSL支持在主流语言里面还是一个second-class的特性。
>

> 但另一方面,对DSL进行first-class的支持。其实就是提倡这样一个思想:要把
> 一个general-purpose的语言应用到一个领域,就是先在这个领域做一个DSL,然
> 后再针对这个DSL编程。于是问题来了,谁来设计这个DSL?语言的设计可是比库
> 设计难得多的问题。DSL带来的灵活性同时也使得设计一个接口的选择极大化

> 了,原来在C里面只有光秃秃的函数,接口设计总离不开那几招。后来有了OOP,
> 一下带来了一个额外维度的复杂性。现在来一个DSL,鬼知道有多复杂。当然,

> 复杂性从来都不是阻止去用一个东西的合理理由。一个好的DSL正如一个好的接
> 口一样能够帮助正确使用,阻止错误使用...
>
> 我只想问一个问题,一个典型的高级程序员,也许能够设计出一个足够的C库乃
> 至OO库,但足够设计出一个足够的DSL吗?后者的门槛显然更高,想想正则表达
> 式吧..
>
> 最后一个想法就是,Eric Raymond老大也说过,程序员会仅仅因为能用某个特

> 性,而就去使用某个特性... 这也是为什么C++总被"更"复杂地使用着的原因。
> 那么DSL呢?有多少领域DSL如此重要呢?
>
> --
> 刘未鹏(pongba)|C++的罗浮宫
> http://blog.csdn.net/pongba
> TopLanguage
> http://groups.google.com/group/pongba
> >

--

Regards,
- Oldrev

pongba

unread,
Oct 11, 2007, 1:08:35 AM10/11/07
to pon...@googlegroups.com
On 10/12/07, oldrev <old...@gmail.com> wrote:
Nemerle 的 SQL DSL:

ExecuteNonQuery ("INSERT INTO employee VALUES ('John', 'Boo')", conn);

这段代码会在编译时展开成标准的 .Net 数据库操作代码,DSL 还是让他们呆在引
号里比较好,省得 hosting 语言变复杂。

参考: http://nemerle.org/SQL_macros

一般认为让DSL待在引号里的问题在于不能享受静态类型检查的好处。

oldrev

unread,
Oct 11, 2007, 1:16:19 PM10/11/07
to pon...@googlegroups.com
Nemerle 就强在这儿了,ExecuteNonQuery 是编译时展开的,所以能享受静态类型
系统的好处。

Nemerle 也有能力解放引号,参考 http://nemerle.org/Syntax_extensions 最后
一节

在 2007-10-11四的 13:08 +0800,pongba写道:

--

Regards,
- Oldrev

Huafeng Mo

unread,
Oct 11, 2007, 2:00:30 AM10/11/07
to pon...@googlegroups.com
最终极的dsl,我想差不多应该是这样吧:
列出所有父亲生于上海、母亲生于湖南、下月2日过生日的学生的学号、姓名、性别、出生日期、身份证号码、所在班级
:-P

在07-10-12,oldrev <old...@gmail.com > 写道:



--
反者道之动,弱者道之用
Reply all
Reply to author
Forward
0 new messages