与主流的C、C++和Java等开发语言相比,诸如PHP、Perl之类的脚本语言和Ruby、Python等语言虽然适应面相对较窄,但以其简洁、灵活、易于学习和维护的特点在企业应用中逐渐占据了一席之地。
动态语言解困开发人员
IT日益重要,它已成为可以带来竞争优势的一种核心能力。与此同时,IT部门要完成的软件开发项目的数量显著增加。企业的IT管理人员清楚地认识到项目未完成所带来的隐性成本,迅速抛弃了对动态语言存在的偏见,寻求可以迅速减少积压项目的一种方法。
说到往诸多企业开发语言里添加动态语言,仅仅为了完成项目而仓促生成“快速而粗劣”的代码仍是一种不明智的方法。这种方法不但会带来棘手的维护问题,比如《萨班斯-奥克斯利法案》法规遵从方面的限制,更不用说越来越重要的安全应用软件交付了。很多企业不能承担权宜之计的编程方法带来的风险。不过如果IT人员采取慎重的态度,利用动态语言开发适合的项目,那么就可以利用动态语言的独特表达力,编写干净、可靠、可重复使用的代码,从而提高工作效率,同时又不危及企业的完整性。
如果对动态语言进行合理细分,可以分为: 特定领域语言(DSL)、小语言、脚本语言(如PHP和Perl),以及最上层的通用动态语言(如Ruby和Python)。每种语言可以处理不同范围的任务,为开发人员提供先进程度不同的工具。如果使用得当,每种语言都能带来工作效率的提升,而这正是不堪重负的开发人员所寻求的。
特定领域语言
DSL广泛应用于整个企业,它被认为是动态语言革命的历史基础,而不是这场革命的一部分。DSL比真实语言更类似一连串命令或者数据项。Make(用于编译及链接C和C++程序的一个实用程序)就是一种DSL;Ant也是如此,它可以为Java执行类似功能。Ant“命令”被编码成必须遵守一定格式和顺序的XML语言,构成了DSL的语言集。这些工具很少拥有扩展的逻辑功能,譬如复杂的程序流或者决策功能。
小语言
比DSL高一级的动态语言就是小语言,它的特点是语法的表达力很强并能在特定领域里面传达复杂逻辑。小语言往往使用有限的词汇。Unix衍生出了许多小语言。最典型的一个例子,awk被设计人员描述成“用于编写小程序来执行常见数据处理任务的一种模式匹配语言”。譬如说,为了把表格数据从文本文件转换成Excel能够读取的CSV数据,只需要三四行awk语句。至于复杂的数据处理,awk可能要用100行代码,不过代码行超过这个数的awk程序非常少。
Unix的功能很强,这主要归功于众多实用程序和小语言让使用者能够通过外壳脚本对操作进行排序——外壳脚本本身是一种DSL或者小语言,具体取决于用户使用哪种外壳语言。小语言的问题在于,每种语言本身都自成一体。正因为如此,高级的Unix用户必须学习sed、awk、pic和外壳编程等方面的语法,这样才能充分发挥它们共同的潜力。因此,Unix用户一直在日益求助于比较通用化的脚本语言,这些语言涵盖了每种小语言提供的各项功能。
不过,小语言在商业市场领域仍过得有滋有味,独立软件开发商(ISV)使用这些专有方法,为编程人员提供了使用、改动或者扩展其产品的一种方法。最有名的例子就是PostScript,这是Adobe公司设计及维护的页面定义语言。多年来,PostScript的适用范围和复杂性都得到了扩展,现在类似一种真正的编程语言,但还是摆脱不了大多数命令侧重于页面布局的局限。
消除这个术语和微软所用术语之间的歧义也很重要:2004年,微软公司宣布了开发人员可用来自行编写DSL的一些工具。原本有极大吸引力的一种语言结果却成了毫不相干的东西。正如分析师Larry O'Brien所言:“微软的DSL与编写语言几乎没有多少关系。微软借用了DSL这个术语指代这样的开发工具:让程序员能够以可视化方式图解工作流、表达业务领域逻辑,然后可以利用这些图生成代码。这个解决办法尽管有效,但不是大多数人提到DSL时所指的那个意思。”他负责维护的知名Knowing.Net博客专门分析微软的开发技术。
脚本语言
在诸多动态语言中,基于脚本的动态语言最为一般人熟悉。说到IT人员利用动态开发技术获得好处,脚本语言正是这种模式开始真正获得回报的方面。这种高级语言在企业中通常用于执行两种功能当中的其中一种: 充当应用各部分之间的粘合剂,或者为低级语言提供很高的抽象级别。
Perl就是一个例子,这种粘合语言用于组合较大应用的各组件。JavaScript是另一种粘合语言,负责协调浏览器里面的各项活动。虽然JavaScript最初用于带来浏览器会话,但现在它带来了一种更丰富的浏览器交互,这主要是由于AJAX越来越流行。
第二种脚本语言在缺少表达性高级手段的环境下提供了高级编程构件。譬如说,最近发布的Groovy语言为Java引入了众多的高级构件,大大减少了Java创建及管理对象需要编写的代码数量。它还简化了数据结构的描述,并提供了处理XML数据的简单、直观的方法。Lua就是另一种此类语言,它非常适合于使用C编写的程序。Lua最近重新流行起来,扩大到了学术界以外的领域,这要归功于游戏开发人员,他们需要低级C代码的速度,也渴望得到Lua提供的较高级构件。
PHP是在企业中日渐得到接受的另一种脚本语言。PHP一般嵌入在网页中显示动态内容,它让种类非常广泛的应用可以在Web服务器上运行。实际上,如今的许多Web应用都使用PHP编写,因为它与Java相比是简易语言,而且便于学习及部署。不过,比较直观的语法让人觉得PHP程序是一种快速但粗劣的编程语言,这两个优缺点同样明显。不过,PHP在企业中的地位在迅速上升。
Python和Ruby
在为企业的动态语言潮流起到推波助澜的所有工具当中,Python和Ruby等通用动态语言为提高开发人员的工作效率带来了最大好处。这些开放源代码语言与特定领域并不联系在一起,提供的编程机制消除了标准应用编程方法速度缓慢或者单调乏味的缺点。它们易于学习及使用,还让开发人员能够不必生成大量的多余代码就可以编写大型应用。
Ruby和Python存在已有一段时间了,两者都是在上世纪90年代设计而成的。据跟踪分析语言使用的Tiobe.com网络声称,Python几乎是一炮打响,而Ruby直到最近才跻身于前十大语言。Ruby最近知名度上升主要归功于RoR(Ruby on Rails),这种Web框架让开发人员能够迅速把数据驱动的网站组合起来。
Ruby仍是企业开发领域的新语言。虽然IT人员部署Python有着悠久历史,可是Ruby在企业里会得到多少广泛的部署并不清楚,特别是在旗舰性的RoR框架外面。值得一提的是,Python和Ruby都拥有庞大、活跃、忠诚的开发社区,它们在不断编写新的库模块,同时支持有时还在推动最初的语言设计人员添加功能。随着这些语言本身不断得到完善,它们无疑会带来更高的工作效率。
企业当中的动态语言
说到动态语言在企业中找到一席之地,可扩展性提供了灵验的试金石,因为脚本语言不太适合需要高度可扩展性的项目,而是非常适合标准的业务数据处理(譬如批处理和报表生成)、中小型项目以及中低型流量负载的Web应用。狂热的爱好者势必会提到动态语言用于比较大的项目,但这种情况往往是例外,而不是惯例。
在IT部门面临的所有开发任务当中,Web应用是使用动态语言特别有效的领域。而首当其冲的几种动态语言是Ruby、Python和Groovy。
RoR即Ruby的杀手级应用是一种“固执已见”的语言,因为它对如何设计Web应用有着独特视角。RoR的主要设计师David Heinemeier Hansson将这种方法称为“约定优于配置”(convention over configuration),它可以让用户很快就能运作起来,只要其设计适合所选择的模式。RoR设计很少针对特定语言。而基于Groovy的Grails为Java虚拟机(JVM)提供了一种类似设计。
考虑Rails的管理人员应当注意:Hansson直言不讳地指出了RoR不是为企业应用而设计的。这类项目是远非RoR模式所能实现的,也不容易经过改动后就适合RoR。但要是没有把RoR推到它适用的小众领域之外,而是使用它处理其所擅长的任务,就能迅速完成开发项目,从而获得真正的回报。
Python利用了名为Zope的应用服务器,这种服务器的设计比Hansson的设计更接近传统Web框架的设计。Zope的人气曾经一度与现在的RoR一样旺,也是因为它可以完成以前只有低级语言才能完成的任务。
在微软IIS里设置支持动态语言
Python的主要优点在于,它可以运行在比Ruby更多的运行时环境上。现在有些版本可以运行在JVM上(Jython)、有些可以运行在微软.Net平台上(IronPython),后者得到了微软的支持。Python的另一个优点在于,它的客户群比较庞大,还有数量众多的开发人员,长期以来他们已积累了这种语言方面的丰富编程经验。
Groovy在三者当中的客户群最小,这是由于它的历史比较短。不过,它具有Ruby和Python所没有的一个独特优点:Java开发人员熟悉它的语法。该语言旨在为Java提供较高级语法,并且引入动态元素,那样Java开发人员就能提高工作效率,不像Java那样累赘多余。Groovy的另一个优点是,它作为单一的Java归档(JAR)文件来部署,那样它就可以轻松集成到比较大的Java应用里面。这样一来,开发人员就可以利用现有的Jave代码,同时获得动态语言的好处。
加快完成项目
正如Tiobe.com所示,动态语言的采用具有一种明显的模式: 新语言先是突然流行起来(譬如目前Ruby就是这样),之后进入持续稳步发展状态,使用率和采用率都稳定下来。不过值得一提的是,随着IT管理人员迅速认识到使用动态语言可以比企业的低级主流语言更快地编写有价值、易于维护的代码,PHP、Perl、Python和Ruby等动态语言正在企业里发挥更大的作用。
动态语言解决不了IT部门如今面临的项目过剩的所有问题。不过,合理分配动态语言来开发项目有助于迅速减少有待完成的IT任务,从而使企业能够获得迅速利用新出现的机会所必要的敏捷性。
链接一:动态语言与静态语言
动态语言(或称动态编程语言,Dynamic Programming Language)是指程序在运行时可以改变其结构的语言,比如新的函数可以被引进,已有的函数可以被删除等结构方面发生的变化。众所周知的ECMAScript(JavaScript)便是一种动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。
从概念上说,动态语言就是类型检查在运行时完成,而静态语言的类型判断是在运行前判断(如编译阶段),比如C#就是一种静态类型语言,静态类型语言为了达到多态会采取一些类型鉴别手段,如继承、接口,而动态类型语言却不需要。
静态类型语言的主要优点在于其结构非常规范,便于调试,方便类型安全;缺点是为此需要写更多的类型相关代码,导致不便于阅读。动态类型语言的优点在于方便阅读,不需要写非常多的类型相关的代码;缺点是不方便调试,命名不规范时会造成难于理解等问题。
现在有这样一种趋势,那就是合并动态类型与静态类型于一种语言中,这样可以结合动态语言和静态语言双方的优点。
Boo 是一种在.NET环境下与Python有相似语法的一种静态语言。Boo一方面可以获取动态语言,例如类似Python这样的语言语法方面的优势,可以内建一些数据结构;另一方面,其又是有类型的静态语言,具有速度等方面的优势。
链接二:动态语言的缺点
虽然动态语言提供了毋容置疑的编程优点,但它确实也有局限性。对于往诸多企业开发语言里添加动态语言的管理人员在使用相应技术开发特定的软件项目时,必须牢记以下这些缺点:
● 可扩展性:Python和Ruby都使用各自的虚拟机,但它们都不适合线程——实际上,它们对线程提供的支持很少。所以,需要许多并行线程的应用不适合使用Python或者Ruby来开发。另外,多核和多个处理器等硬件资源不会得到有效利用,因为这些虚拟机无法有效地利用这些硬件。因此,许多Ruby爱好者求助于JRuby,Sun支持的这个开源项目可以让Ruby在Java虚拟机上运行,从而对线程提供了出色的支持。JRuby用于内部开发的项目和试点项目还为时过早。
● 性能: 没有哪一种主要的动态语言使用像Java虚拟机那样得到全面优化的虚拟机。因而,这些语言的运行速度要比Java慢得多。其他因素如语言特性也影响了性能。Linux社区经常更新的语言基准测评显示,在众多测试当中,Java的运行速度是编译后C的1.8倍、Lua(使用即时编译器)的3倍、Python的6.7倍、PHP的7倍、Perl的9.8倍、Ruby的16倍。所以,要是性能至关重要,Java或者编译语言的速度比任何动态语言(使用即时编译器的Lua除外)快得多。
● 开发工具: 如果开发人员习惯了使用Visual Studio .Net或者几种主要的Java集成开发环境(IDE)具有的特性集,他们会惊讶地发现动态语言缺少相应环境。如今,面向Perl、Python和Ruby的最佳IDE是ActiveState公司新发布的Kimodo IDE 4.0。Kimodo的主要竞争者是单一语言工具。现在大多数这些语言还缺少有真实价值的开源工具,因为没有与Eclipse或者NetBeans相当的那个环境,不过这两种环境拥有支持各种动态语言的插件。
● 开发社区:虽然像Perl、Python和Ruby这些主要的动态语言都有活跃、发展兴旺的社区,但没有哪个可与C、C++和Java等主流语言的开发社区相提并论。这方面只有PHP最接近。这些社区规模比较小,这意味着在雇用具有特定语言技能的人员时,可利用的开发人员数量要少得多。幸好,动态语言一般比较容易学习。因此,公司可以很快对内部员工进行交叉培训。虽然新近培训的员工不会一夜之间成为专家,但他们可以立即编写代码,这归功于这些语言天生具有的高效优点。