打印
[Cortex-M0技术交流]

面向语言编程(转)

[复制链接]
1349|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呆板书生|  楼主 | 2013-8-23 06:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
好几年前看了JetBrains的CEO Sergey Dmitive一篇**Language Oriented Programming - The Next Programming Paradigm才开始知道LOP的,当时也试用了MPS,觉得眼前一亮。到现在隔了好几年了,对LOP的具体内容也有点忘记了,而近期在思考OpenExpressApp的模型驱动开发(MDD)方面的内容,所以在这里再次整理一下这方面的内容,这样也会有更多人了解它,下面的内容会参考前面说的那篇**以及其他LOP内容与大家分享下。

  LOP和MPS背后的思想并不新鲜,实际上已经出现超过20年了;Language Oriented Programming本身这个词也已经提出十多年了。LOP放弃了传统的基于文本的语言,用创造新的语言来代替类库,可以和编辑器所整合,并且每个程序员都可以创造自己的语言。Martin Flower却对此饶有兴趣,并写了Language Workbenches和A Language Workbench in Action - MPS两篇**进行了介绍。

概述

  按照Dmitriev先生的观点,通用语言的问题在于:它们描述领域模型的能力太差。在完成概念性的领域建模之后,开发者们还必须经过一个漫长的编码过程,才能把模型描述为机器可理解的程序,反过来要理解这些代码所描述的领域模型也是同样困难。而DSL虽然能够很好地描述领域模型、解决领域问题,但这种语言又太少了,而且大多数开发者必须苦苦等待少数大厂商为他们提供适用的DSL。很大程度上,这种“语言的失位”造成了软件开发的低效。

  Dmitriev先生提出的解决方案就是LOP:借助工具的帮助,允许开发者创建自己的DSL。这样的DSL当然能够最贴切地描述领域问题,从而大大提高开发效率。而且,这样的“自定义DSL”也不必是文本形式的,它可以直接保存为树状结构(或别的结构),并直接以图象的形式展现。

主流编程中三个最糟糕的问题

从理解问题后到实现的时间很长
在明白问题和解决方案后,将解决方案编码到计算机中将会花费很长的时间。这是因为可以使用非常丰富的自然语言表达问题,但我们只能通过通用的编程语言与计算机交流。而现在的编程语言只有几十种,而自然语言表达可以有千万上万种,因此这种转换的成本是比较大的。

在主流编程中,大部分时间都是在“编程”上,这实际上是在用编程层次的抽象术语来表达自然语言的概念,而这是很困难的,没多少创造性,或多或少也是一种时间的浪费。举个例子,今天大量的开发时间花费在面向对象的设计(OOD)上,在程序员表达类、继承、关联等方面这确实是一种还算有创造性的过程,但是使用Language Oriented Programming,OOD根本就不需要。

(个人观点:这个我还不是很了解,我想底层还是需要的吧,有待进一步了解)

理解和维护代码
在通用语言的程序中,很多高度概括的视角、蓝图都丢失了,这不利于我们对产品理解。解决这个问题的传统方法是写注释或用其它形式的文档来记录设计信息和模型信息,但这证明了这是一种脆弱的解决方案,因为它需要编写这些辅助文档的成本、以及文档和代码带来的不同步麻烦等问题;理想情况下,代码应该是自我描述的,我应该只阅读代码本身来理解代码,而不是什么注释和外部的文档。

学习曲线高
OOP很少能够直接表述领域概念,它们必须引入额外的枝节(如一个类的运行时行为)来完成到领域概念的映射。理解这些领域、学习这些类库不是一项简单的任务,我们需要用大量的指南和文档来解决这个问题,但是学习这些将花费大量时间;当一个类库变得复杂的时候,它也变得更难以学习,程序员将因此失去学习它的动机。即使掌握了领域问题和技术的这种复杂映射之后,依然还会很容易的误用类库,因为开发环境(像编译器和编辑器)不能帮助你正确的使用类库。

LOP的切入点  

  通过计算机改变世界,程序员都希望自己对计算机有完全的控制,但实际上,我们经常被那些不能轻易改变的编程语言和开发环境等基础设施限制。当需要进行一些语言扩展时,我们只能等待语言的设计者去更新它;如果需要我的IDE有一些额外的强大功能,只能等待供应商来添加新特性;就是这些依赖限制了我们完全的自由;当然,程序员也可以写自己的编译器和IDE,但这样将会花费大量的时间和努力,并且并不一定能成功。

LOP的切入点就是允许我们可以创建、重用、修改语言和环境。要理解LOP是什么,可以从下图的主流编程和LOP方法过程进行一下比较,它使得编程阶段已经不是瓶颈了,而转移到了“创建”这一步,作者开发可一个通用的平台(the Meta Programming System)来设计DSL,它允许程序员像现在编写程序一样非常容易的就可以定义自己的语言;这个平台将完全支持LOP,给程序员为程序的每一部分选择使用最合适的语言的自由,而不是将他们绑在某个固定的通用编程语言之上。

相关帖子

沙发
dong_abc| | 2013-8-24 22:29 | 只看该作者
了解一下。

使用特权

评论回复
板凳
呆板书生|  楼主 | 2013-8-25 09:44 | 只看该作者
本帖最后由 呆板书生 于 2013-8-25 09:46 编辑

LOP是什么

    Language - Oriented Programming is a style of programming that tries to produce code that looks like it came from a Domain Specific Language but is still valid in a general purpose programming language.

LOP将不只是编写程序,还包括创建用来编写程序的语言
今天,百分之九十九的程序员认为编程就是编写一串计算机能够执行的指令集,但这种编程的观点是有缺陷的,它混淆了编程的目的和手段,首先需要澄清一个事实:一个LOP的程序,不是一串指令集。那它不是指令集,又是什么呢?

当我有一个问题要解决,我会用单词、标记、概念等来形成自己的解决问题模型,这时候从未把它们想象成一堆指令集,而是一个在领域中一些特定的具有内在联系的概念集合。例如当思考GUI领域时,我会想象如何布局,这个按钮到那边去,这个输入域到这边来,这个组合框里面需要有一些数据的列表,这时可能只是在头脑中把它画出来,而根本不用任何语言。应该有一种方法允许我们使用这种表述作为真正的程序,而不仅仅是通过与其它程序员交流的手段来编写解决方案,一个程序是对某个领域的某个问题领域以及解决方案的清晰而明确定义的模型表示。

这就是我认为程序员应该拥有创建他们自己的语言的自由的主要原因:GPL是无歧义的,但是太冗余和易于出错;而自然语言表达能力十分丰富,但是又太不精确太不结构化了;所以我们允许程序员可以自己创建一种结构化的、精确定义的、能够更加自然表示的语言来形成解决方案。因此LOP将不只是编写程序,还包括创建用来编写程序的语言;我们的程序将被编写的更接近问题域而不是计算机指令集领域。

将程序直接存储为结构化内容
因为当前的阅读和编辑程序最方便和最通用的方法是使用文本编辑器,所以人们习惯性的认为程序是作为文本来存储的。但是程序的文本表示有重大的缺点,其中最重要的是基于文本的编程语言非常难以扩展;如果程序以文本的形式存储,你就会需要一个无歧义的文法器来解析程序;当为语言加入新特性时,维护语言无二义性的扩展变得日益困难;我们将需要发明更多类型的括号、操作符、关键字、顺序规则、嵌套,等等;语言的设计者们花费了无数时间来思考语法,并试图发现扩展语言的新方法。

如果打算让创建语言变得容易,我们就需要将程序的表示和存储从程序本身分离开;我们应该直接将程序存为一种结构化的内容,编辑器能够提供我们喜欢的可视化表现形式;我们可以把程序做成文本、表、图、树、或其它任何形式,我们甚至能为不同目的使用不同的表现形式,比方说,图形化表示用来浏览,文本化表示用来编辑;我们能够为代码的不同部分使用领域相关的表示,比如为数学公式使用图形化的数学符号、为图表使用图形化的图表、为spreadsheets使用行和列等等;我们能够为问题域使用最合适的表现形式,可以是文本,但不限于文本;最好的表现形式依赖于我们如何思考问题域;表现形式的灵活性也将使我们的编辑器比以往更加强大,因为不同的表现形式有不同的方式去编辑它们。

(个人观点:感觉存储为结构化内容,不需要解释器进行文法分析,有点类似意图编程思想)

三要素:结构、编辑器和语义
在LOP中,一种语言有很多方面,如约束和类型系统,但LOP主要有下面三个要素来定义:

结构:定义了抽象语法、支持的概念
编辑器:定义了具体的语法,如何展现和编辑
语义:定义了行为,如何被解释,以及如何被转换成可执行代码
  (个人观点:我觉得LOP语言有点建于在文本DSL和图形DSL之间的一种形态)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

868

帖子

2

粉丝