关键字:下一代编程范型主要原则
LOP : The Next Programming Paradig Language Oriented Programming : The Next Programming Paradigm
Sergey Dmitriev, JetBrains
现在是软件开发中开始下一次技术革命的时候了,而这次革命的轮廓正变得越来越清晰。下一代编程范型也在接近我们,但仍然没有完全成形--不同的部分有不同的名称:Intentional programming, MDA, generative programming, 等等;我建议把把所有这些新方法归并为一个名字: ‘language-oriented programming’(面向语言的编程), 而本文将阐述这种新的编程范型的主要原则
今天主流的编程方法有一些内在的假定像脖子上的绳索一样桎梏着我们,尽管大部分程序员还没有意识到它;即使算上在编程领域取得的所有进步,我们也仍然处于石器时代;我们有我们信赖的石斧(面向对象编程),能够满足我们的需要,但是当用它来对付最困难的问题时,它会裂成碎屑;为了超越石器前进,我们必须驯服烈火,只有这样,我们才能铸造出新的工具,激发一个创作的新时代,和新技术的爆发
我将讨论编程的局限,它强迫程序员像计算机一样思考,而不是令计算机像程序员一样思考;这是严重的,根深蒂固的局限,需要花费巨大的努力去克服它;当我说这将是编程中下一个大的范型转换时我并没有自命不凡;我们需要彻底重新定义我们编写程序的方法
本文中,我表述了我的观点和我当前在Language Oriented Programming (LOP)上的工作;首先我将展示目前主流编程方法的错误,然后我会使用示例来解释LOP的概念,它们基于我已有的一个LOP的实现:the Meta Programming System (MPS). 本文有意只是给你一个对LOP的惊鸿一瞥,目的是激发你对这个思想的兴趣,并希望能够得到反馈和讨论
Part I. LANGUAGE ORIENTED PROGRAMMING OVERVIEW
Language Oriented Programming and the Meta Programming System
理想的,做一个程序员意味着我可以对计算机做任何事情,我有完全的自由,完全的控制;但实际上,今天的程序员只有非常受限的自由;当然,我确实可以在计算机上做任何事情,但其中一些事情花费了我许多年的努力,而它们实际上只需要少的多的时间;一定有什么事情不对劲
程序员被限制是因为他们深深依赖于那些他们不能轻易改变的编程基础设施:编程语言和开发环境;如果我需要一些语言的扩展,我只能等待语言的设计者去更新它;如果我需要我的IDE有一些额外的强大功能,我只能等待供应商来添加新特性;就是这些依赖限制了我完全的自由;当然,我可以写我自己的编译器和IDE,实际上,这也是我启动了IntelliJ IDEA的原因,因为我厌倦了依赖现有的弱弱的Java IDE;但是,这会花费大量的时间和努力,并且显而易见,对大部分程序员来说是不可行的;理论上的自由和实际的自由之间存在巨大的差异;下文中当我谈到自由时,我指的是实际的自由
获得自由的途径是减少我们的依赖层次;例如,Java的一个主要目标是减少对操作系统的依赖,给开发者在不同操作系统上部署的自由;因此,为了在语言和环境之上获得自由,我们需要减少对它们的依赖
为什么这是一个问题呢?任何general-purpose的语言,像Java和C++,给了我们用计算机做任何事情的能力;这是事实,至少理论上是这样,但是,general-purpose的语言趋向于如同后面我将讲到的般生产效率低下;作为一种替代,我们可以使用domain-specific languages(DSLs,aka ‘little languages’),它们被精心设计成在特定问题域具有高度生产率,比如用SQL编写数据库查询;DSLs的强大之处,领域相关,也正是它们的弱处,因为任何真实世界中的程序都会包括许多不同的领域
general-purpose 和 domainspecific 之间,并不是对立的;我需要所有的自由,我希望能够做任何事情,同时有很高的生产效率;目前为止还没有什么好方法能够做到这点;理想情况下,我能够为程序的各个特定部分使用不同的语言,而它们能够融洽的一起工作,并且开发环境会完全支持这些语言,包括重构,代码补全,导航,以及主流语言具有的所有其它生产力工具
为了获得这种独立性,我需要有创建、重用、修改语言和环境的自由;为了使这种自由是可行的,它需要很容易的被获得;如果我们解决了易于进行语言和环境的开发的问题,对程序员来说将是一个巨大的进步;这就是Language Oriented Programming的切入点
要理解Language Oriented Programming是什么,让我们首先看一下今天的主流编程方法,它基本上是这样:
思考: 你需要编程解决一个问题,因此你在你的头脑里形成了如何解决这个问题的概念模型
选择: 你选择了某种general-purpose的语言来编写解决方案
编程: 你通过将你的概念模型艰难的映射到编程语言来编写解决方案
编程这一步是瓶颈所在,因为大部分情况映射不是容易的和自然的;这种方法在程序员表达复杂的设计方面已经被证明是低效的;相对的,下面是LOP的工作方式:
思考: 你需要编程解决一个问题,因此你在你的头脑里形成了如何解决这个问题的概念模型
选择: 你选择了某些特定的DSLs来编写解决方案
创建: 如果没有合适的DSL适合你的问题,你便创建一种DSL来适应你的问题
编程: 你通过将你的概念模型相对直接的映射到DSLs来编写解决方案
现在,编程这一步is much less of a 瓶颈了,因为DSLs大大简化了如何将问题翻译成某种计算机能够理解的东西;看起来困难已经简单的转移到了“创建”这一步,然而,通过联合使用工具支持和将LOP应用到自身,将使这一步更加简单
LOP 背后的动机基本是这样的:我想用我正试图解决的问题相关的概念和意图的词汇来工作,而不是被迫将我的思想翻译成某种general-purpose的语言所能理解的概念(比如:类,方法,循环,条件,等等...);为了达到这个目标,我需要使用domain-specific languages;怎样得到它们呢?创建它们;
我已经开始开发一个通用的平台(the Meta Programming System)来设计domainspecific languages,带有工具支持和开发环境;它将允许程序员像现在编写程序一样容易的来定义语言;这个平台将完全支持LOP,给程序员为程序的每一部分选择使用最合适的语言的自由,而不是将他们绑在某种固定的general-purpose的编程语言上
MPS 只是Language Oriented Programming的一个示例,尽管我在这里使用MPS来做示例,而实际上LOP可以用许多不同的方法来实现,你自己就可能知道一些替代方法;LOP 的概念不等同于它的实现,就像OOP的概念不等同于Java或C++或Smalltalk一样
What Is Wrong with Mainstream Programming
你知道这则古老的谚语:"If it ain’t broke, don’t fix it". 主流编程方法很明显不完整,我见过它带来的很多问题,而大部分滋生于这样一个事实:general-purpose的语言没有一种方法来完全支持任意的领域,同样也没有一种统一的domain-specific language;下面是将被LOP解决的主流编程中三个最糟糕的问题:
Time Delay to Implement Ideas
对我来说,最严重的问题是,在我确切的知道如何解决一个问题,和我通过一个程序成功的向计算机传达解决方案之间,有一个很长的时间差;我可以用几个小时的时间向另外的程序员解释问题和解决方案,而将解决方案编码到计算机中将花费长的多的时间;这是因为对另外的程序员,我可以使用表达能力非常丰富的自然语言,而对计算机,我只能使用某种表达能力差很多的general-purpose的编程语言;今天的编程语言只能表达几十种概念,而自然语言能够简洁的表达千万种概念;因此,向另外的程序员解释问题,我可以表达很高层的思想,而对计算机,我必须表达每一步的每一个细节
在主流编程中,大部分花在“编程”上的时间,实际上是在寻找用编程层次的抽象的术语来表达自然语言的概念的方法,而这是很困难的,没多少创造性的,或多或少是一种时间的浪费
举个例子,今天大量的开发时间花费在面向对象的设计(OOD)上,在程序员表达类、继承、关联等方面这确实是一种还算有创造性的过程;这项实践的目的是用面向对象的术语,如类和方法,来表达程序;OOD的过程是必要的,因为诸如类和方法等是面向对象语言能够理解的仅有的抽象,它看起来是必要和有创造性的,但是使用Language Oriented Programming,OOD根本就不需要
Understanding and Maintaining Existing Code
下一个问题是理解和维护现存代码;不管它是另一个程序员写的还是我写的,问题都一样;因为general-purpose的语言需要我把高层的领域概念翻译为低层的编程语言特性,在最终的程序中,很多高度概括的视角、蓝图都丢失了;当我在以后重新翻阅程序时,我不得不通过逆向工程来了解我最初的意图是什么,我头脑中的模型是什么;至少,我必须在脑海中重新建造最初在翻译到general-purpose的编程语言的过程中丢失的信息
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/