由于外部dsl的独立性,在某些情况下也会出现特定的工具,辅助领域或是开发人员本身编写dsl代码 目前常见的编程语言大都是命令式(imperative)的,例如c#,java或是c++等等这些语言的特征在于,代码里不仅表现了“做什么(what)”,而更多表现出“如何(how)完成工作”这样的实现细节,例如for循环,i += 1等等,甚至这部分细节会掩盖了我们的“最终目标”在anders看来,命令式编程通常会让代码变得十分冗余,更重要的是由于它提供了过于具体的指令,这样执行代码的基础设施(如clr或jvm)没有太多发挥空间,只能老老实实地根据指令一步步的向目编程语言版本区别标前进例如,并行执行程序会变得十分困难,因为像“执行目的”这样更高层次的信息已经丢失了因此,编程语言的趋势之一,便是能让代码包含更多的“what”,而不是“how”,这样执行环境便可以更加聪明地去适应当前的执行要求 而内部dsl,正像之前提到的那样,它往往只是代表了一系列特别的api及使用模式,例如linq查询语句及ruby on rails中的active record声明代码等等内部dsl可以使用一系列api来“伪装”成一种dsl,它往往会利用一些“流畅化”的技巧,例如像jquery那样把一些编程语言环境配置方法通过“点”连接起来,而另一些也会利用元编程的方式内部dsl还有一些优势,例如可以访问语言中的代码或变量,以及利用代码补全,重构等母语言的所有特性 xslt,sql等等都可以算作是外部dsl外部dsl一般会直接针对特定的领域设计,而不考虑其他方面james gosling曾经说过:每个配置文件最终都会变成一门编程语言一开始您可能只会用它表示一点点东西,慢慢地您便会想要一些规则,而这些规则则变成了表达式,后来您可能还会定义变量,进行条件判断等等,而最终它就变成了一种奇怪的编程语言,这样的情况屡见不鲜现在有一些公司也在关注dsl的开发例如以前在微软工作的charles simo编程语言优势nyi提出了intentional programming的概念,还有jetbrains公司提供的一个叫做mps(meta programming system)的产品最近微软也提出了自己的oslo项目,而在eclipse世界里也有xtext,所以其实如今在这方面也有不少人在尝试还有一些dsl会以xml方言的形式提出,利用xml方言的好处在于有不少现成的工具可用,这样可以更快地定义自己的语法 声明式编程与dsl 大约25到30年前,anders开发了著名的turbo pascal,这是一套集语言、编译器及开发工具于一体的产品,这也是anders进入编程语言这一领域的起点anders谈到,如今的计算机和当年他开编程语言发展发的turbo pascal所用的z-80已经不可同日而语从那时算起,如今的机器已经有大约10万倍的外部存储容量,1万倍的内存大小,cpu速度也有大约1000倍的提高但是,如果我们比较如今的java代码及当年pascal代码,会发现它们的差别其实并不大anders认为编程语言的发展非常缓慢,期间当然出现了一些东西,例如面向对象等等,但是远没有好上1000倍事实上,近几十年来的努力主要体现在框架及工具等方面(如下图)例如.net framework里有超过一万个类及十万个方法,与turbo pascal相比的确有了超过1000倍的增长同样类似,现在的ide包含了无数强大的功能,例如语法提示,重构,调试器等等与此相比,编程语言的改进的编程语言优势确很不明显 关于声明式的编程风格,anders主要提出了两个方面,第一个方面是dsl(domain specific language,领域特定语言)dsl不是什么新鲜的玩意儿,我们平时经常接触的sql,css,正则表达式等等都属于dsl有的dsl可能更加专注于一个方面,例如mathematica,logo等等这些语言的目标都是特定的领域,与之相对的则是gppl(general purpose programming language,通用目的编程语言)martin fowler将dsl分为外部dsl及内部dsl两种外部dsl有自己的特定语法、解析器和词法分析器等等,它们往往是一种小型的编程语言,甚至不编程语言是什么会像gppl那样需要源文件与之相对的则是内部dsl内部dsl其实更像是种别称,它代表一类特别api及使用模式 在anders眼中,如今影响力较大的趋势主要有三种(如下图),它们分别是“声明式的编程风格”(包括“领域特定语言”及“函数式编程”)、过去的五年非常火热的“动态语言”(其最重要的方面便是“元编程”能力)以及多核环境下的“并发编程此外随着语言的发展,原本常用的“面向对象”语言,“动态语言”或是“函数式”等边界也变得越来越模糊,例如各种编程语言怎么学主要的编程语言都受到函数式语言的影响因此,“多范式”程序设计语言也是一个愈发明显的趋势 在过去5、60年的编程历史中,编程语言的抽象级别不断提高,人们都在努力让编程语言更有表现力,这样我们可以用更少的代码完成更多的工作我们一开始使用汇编,然后使用面向过程的语言(如pascal和c),然后是面向对象语言(如c++),随后便进入了托管时代,语言运行于受托管的执行环境上(如c#,java),它们的主要特性有自动的垃圾收集,类型安全等等anders认为这样的趋势还会继续保持下去,我们还会看到抽象级别越来越高的语言,而语言的设计者则必须理解并预测下一个抽象级别是什么样子的另一方面,如.net,java等框编程语言是什么架的重要性提高了许多,编程语言往往都倾向于构建于现有的工具上,而不会从头写起现在出现的编程语言,例如f#,以及java领域的scala,clojure等等,它们都是基于现有框架构建的,每次从头开始的代价实在太高 这是一篇发表在某杂志8月刊的文章,是根据我对anders hejlsberg的演讲内容的翻译的缩写原本的完整演讲内容有数万字,为了在杂志上发表因此简化成了五千字,因此如果您对完整内容感兴趣,不妨根据文末链接来访问完整内容,其中也包含大量分解的幻灯片以及代码 程序设计离不开编程语言,但是编程语言在国内的大环境中似乎一直是个二等公民国内的计算机教育和工程培训,似乎一直在宣传“语言不重要,编程语言版本区别重要的是思想”,“语言一通百通”等观点,甚至在许多人眼中“语言的讨论”完全是不入流的,但其实“编程语言”与“工具”、“框架”或是“开发方法”等事物一样,都对生产力有着重要的影响事实上,语言的发展历史比其他方面更为悠久,并且在过去十几年,甚至最近几年中都依然在不断的碰撞,演变期间一些新的语言诞生了,而另一些在当时看来阳春白雪的语言和编程范式也重新获得了人们的重视
anders hejlsberg是微软的technical fellow,担任c#编程语言的首席架构师,编程语言版本区别也参与了.net framework,以及vb.net和f#等语言的设计与开发几个月前,anders在比利时的techdays 2010及荷兰devdays 2010分别进行了一场演讲,阐述了他眼中对于编程语言的发展趋势及未来方向,本文便对他的观点进行了总结 白癜风治疗的较有效医院呼和浩特白癜风医院转载请注明原文网址:http://www.gzdatangtv.com/bcyyys/260.html |