标题:Language Oriented Programming:The Next Programming Paradigm
网址:http://www.onboard.jetbrains.com/is1/articles/04/10/lop/mps.pdf
中文译文网址:http://blog.csdn.net/chelsea/archive/2005/02/17/290486.aspx
这篇文章的中文译文在切尔斯基的blog上面看到,翻译得非常好,看来是花了不少工作量,而且译者对这个领域非常熟悉,强烈感谢那些翻译外文文献无私贡献给大家的人。下面的摘要直接转载了切尔斯基的原文摘要。大意和感想部分是我自己写的。
摘要:
现在是软件开发中开始下一次技术革命的时候了,而这次革命的轮廓正变得越来越清晰。下一代编程范型也在接近我们,但仍然没有完全成形--不同的部分有不同的名称:Intentional programming, MDA, generative programming, 等等;我建议把把所有这些新方法归并为一个名字: ‘language-oriented programming’(面向语言的编程), 而本文将阐述这种新的编程范型的主要原则今天主流的编程方法有一些内在的假定像脖子上的绳索一样桎梏着我们,尽管大部分程序员还没有意识到它;即使算上在编程领域取得的所有进步,我们也仍然处于石器时代;我们有我们信赖的石斧(面向对象编程),能够满足我们的需要,但是当用它来对付最困难的问题时,它会裂成碎屑;为了超越石器前进,我们必须驯服烈火,只有这样,我们才能铸造出新的工具,激发一个创作的新时代,和新技术的爆发。我将讨论编程的局限,它强迫程序员像计算机一样思考,而不是令计算机像程序员一样思考;这是严重的,根深蒂固的局限,需要花费巨大的努力去克服它;当我说这将是编程中下一个大的范型转换时我并没有自命不凡;我们需要彻底重新定义我们编写程序的方法本文中,我表述了我的观点和我当前在Language Oriented Programming (LOP)上的工作;首先我将展示目前主流编程方法的错误,然后我会使用示例来解释LOP的概念,它们基于我已有的一个LOP的实现: Meta Programming System (MPS). 本文有意只是给你一个对LOP的惊鸿一瞥,目的是激发你对这个思想的兴趣,并希望能够得到反馈和讨论。
大意:
全文总体分为两个个部分:一是面向语言编程概论;二是元编程系统的介绍。
第一部分讨论了这个几个问题:
1)通用编程语言(例如JAVA,C++)和DSL(Domain Specific Language,例如SQL)之间的比较与分析。显然通用编程语言适用面广而不精;而DSL则精而不广;
2)当前主流编程方法与LOP的流程比较:主流编程方法分为思考、选择、编程;而LOP分为思考、选择、创建、编程。
3)当前编程语言的缺点:一是实现的耗时长,从确切的知道某个问题的解决方案到编程实现它总是一个漫长的过程;二是代码的维护和理解困难;三是陡峭的学习曲线,学习编程语言以及相关的类库总是一个艰难的过程。
4)LOP的细节:对于“编程”的定义,编程不是写一组计算机指令,而应该是对某个问题的清晰无误的表达;“编程”不能仅仅限制在文本中,程序不应该天生就是文本;LOP将编程语言分为三个部分:结构、编辑器、和语义;结构定义了抽象语法、支持的概念、以及如何安排它们;编辑器定义了具体的语法,如何描绘和编辑语言;语义定义了行为,它如何被解释,和/或它如何被转换成可执行代码;当然,语言还可以有其它方面,比如约束和类型系统。(上一句话引自http://blog.csdn.net/chelsea/archive/2005/02/17/290486.aspx的译稿)
第二部分介绍了如下内容:
1)在MPS中如何创建语言:“创建语言”本身是一个问题,解决这个问题的方法就是一个“程序”。我们知道对于“程序”使用DSL可以得到更高的效率。于是MPS提供了用来“创建语言”的DSL。对应于语言的三个方面,MPS提供了三种语言:Structure Language用来创建语言的“结构”;Editor Language用来创建语言的“编辑器”;Transformation Language用来创建语言的“语义”。
2)平台、框架、库和语言:MPS提供了三种基本的语言:Base Language是一种最小化的通用语言;Collection Language是一种专门用来处理集合的语言;User Interface Language是用户界面语言。
3)MPS的起步:MPS目前刚刚起步,可能适用于以下两个方面:Java应用程序;创建你的应用程序的配置/脚本语言。
感想:
1. 关于“编程”本质的讨论。
关于“编程”的本质,作者在文中说:“今天,百分之九十九的程序员认为编程就是编写一串计算机能够执行的指令集;我们被教育说计算机建立在图灵机模型之上,因此它们用指令集的术语来“思考””。这句话放到五年前说还差不多,当前MDA技术的发展,很多程序员已经脱离了这个误区。其实,从最早期的计算机教材中就已经清楚的说明:程序是从问题域到解决空间的一个清晰无误的解决方案。选择计算机指令集作为程序的表达方式只不过是一种无奈的选择,当前的很多技术已经尽力要脱出这个巢臼。以MDA技术为例,当前很多的MDA工具已经可以不写一行代码解决一些经典的问题,例如用ArcStyler编写Web访问的程序,只需要建立模型然后进行代码生成和配置即可。还有Rose和EMF等UML工具,可以把大部分的编程工作放到构建UML类图中,只是在最后进行少量的代码补充工作。Together更是使代码和UML图一致化,同时用不同的方法展现程序。因此,其实“编程”的本质在很多程序员的心里已经达成了共识,大家不甘心在“编写计算机指令集”这棵树上吊死,只是如何才能找到更好的解决方案目前还众说纷纭,希望LOP是一条光明之路。
2. 程序和本文之间关系的讨论
万恶的MFC也曾经给我一些启蒙教育,其中最出色的就是它的“文档-框架-视图”结构,虽然它把著名的MVC模式解释得一塌糊涂,不过当时的我还是觉得一个文档可以对应多个视图是一个很棒的想法。当然,在MVC中我才真正领略了model和View的实质所在。对于程序来说,其根本实质可以称之为model,而其表现形式可以称之为view。在目前看来,大部分程序的view都是以文本形式表现的,例如java代码。不过,UML在前几年就已经颠覆了这个“程序即文本”的观点。UML的成功就在于它提供了适当的图形化符号来对应程序的结构部分。但是当前我们还是不能完全离开文本代码的,不过在图形(例如类图或者程序流程图)和文本之间寻找一个适当的平衡是一个很有意义的事情。我记得曾经在一篇文章中有人专门讨论过这个问题:http://www.softmetaware.com/oopsla2003/bettin.pdf
3. Transformation Language本质是什么,是否可以很好的规定语言的语义?
LOP的精华部分应该是这个Transformation Language,因为如果这个环节能够很好的解决的话,可以说这个工作也就成功了一大半。因为对于定义一个新的语言,其结构特征和编辑器都不是关键问题,使用MOF应该可以定义出一个语言的结构部分。但是如何让一个模型运行起来却一直不能解决。虽然有可执行UML的提法,但是好像并没有完全解决问题。
可以说MDA是一个理想的解决方案,它可以定义建模语言,定义建模语言到主流编程语言的代码生成,但是无法解决如何在建模语言中定义语义性。一旦可以在建模语言中定义运行语义,就可以彻底抛弃当前的编程语言,从而把编程彻底的变为“建模”。
Transformation Language的想法是利用这个语言定义语言之间的转换,将一个自定义的语言转换为当前流行的编程语言,然后利用此编程语言进行运行。作者想尽力描绘出一个美好的画面,但是在关键的部分还是语焉不详。且不论定义一个新的语言需要多么广阔的专业知识和创造力,仅仅定义两种语言之间的映射,就是一项浩大的工程啊。“念天地之悠悠,独怆然而泪下”。
4. 最终讨论,LOP是否能够提升编程的抽象层次,最终提高程序员的生产力?LOP适用于哪些方面?
从文中看来,LOP并不像MDA那样着力于提高编程的抽象层次,它并不想用“建模”来替代“编程”。而是独辟蹊径,提供给程序员一个创造新语言的工具,对于每个专业领域,都能够快速的开发出一个DSL,使用这个DSL可以大大提高这个领域的生产力。照此来看,LOP似乎又可以称为“DSL Generator”。至于是否能够总体上提升生产力,还是要看具体情况而定。无论如何,LOP走出了一条新路,对它的创造者,我表示深深的敬佩。
另外,MPS可能会在下个月提供下载,试用之后,再做评论。