冒号和他的学生们(连载16)——动态语言

冒号和他的学生们

——程序员提高班纪事

16.动态语言

Freedom is not free                                                          ——Kelly Strong

           

叹号急不可耐地问:“现在可以谈动态语言了吧?”

冒号感言:“曾几何时,动态语言还只是陪太子读书的角色,那时候它们的名字是‘脚本语言’。近来却迅速崛起,俨然有与静态语言分庭抗礼之势。”

问号忍不住问道:“动态语言与脚本语言是一回事吗?”

“相比动态语言定义上的模糊,脚本语言的概念还是比较明确的。”冒号回避直接给出答案,“脚本script)的提法,是为了区别于一般的程序program)。Perl的发明者Larry Wall不愧为语言学家,对此有一个精彩的说法:‘A script is what you give the actors, a program is what you give the audience’。直译为:脚本是给演员看的,节目是给观众看的。此言妙在一语双关——program兼有‘节目’和‘程序’的意思。”

句号领会:“这里的演员指的是程序员,观众指的是用户。换言之,程序是为终端用户服务的,而脚本是为程序员服务的。”

“正解!”冒号肯定道,“脚本最常见的形式是壳脚本shell script),在非Unix类的操作系统中也称为批处理文件batch file)。”

“批处理文件倒是很熟悉,壳脚本听起来就怪怪的。”逗号嘀咕着。

“那是因为你在Windows的世界里长大,听不惯Unix的方言。”冒号一语道破缘由,“操作系统的内核称为kernel),出于安全考虑不便直接与用户交互,因此裹上一层shell),即人们常说的命令行解释器command line interpreter)。壳脚本是在壳上运行的脚本,扩展了命令行下可执行的命令。它最初主要是内建(built-in)命令的组合,用于系统程序的调度,是系统管理员的必备武器。其后,壳脚本也发展到用于应用程序的调度、连接、调试等,成为粘合glue)语言。”

逗号不禁有些疑问:“难道一般的程序语言如C之类的不能作此用吗?”

引号回应道:“这些语言通常需要‘编写-编译-链接-运行’的过程,十分繁琐。脚本语言编写后即可运行,快捷方便得多。”

冒号点点头:“不错,既然脚本主要用于整合其他程序,本身并不占用太多的资源,同时逻辑也不太复杂,因此脚本语言注重简洁、实用,语法要求不那么严格,性能上的要求也不高。除壳脚本外,还有一些专用于文本处理Text Processing)的语言或工具如AWKsedgrep等,多用于读写配置文件和日志文件、过滤处理各种程序的输入和输出,对于整合各种程序也非常实用。随着对脚本语言需求的增长,其局限性日益突出,Perl之类的高级脚本语言便应运而生了。Perl在壳脚本、AWKsed的基础上,融合了命令式C函数式Lisp的特征,渐渐成为最流行的脚本语言之一。”

问号注意到:“Javascript是浏览器端的脚本,来路似乎有些不同。”

冒号解释道:“除了命令行程序外,脚本语言在其他的应用程序中也身影频现,如图形界面应用、多媒体应用、网络应用等。尤其是网络应用,成为滋生和繁荣脚本语言最肥沃的土壤。例如:Perl非常广泛地用于网络服务器端的CGI编程;PHP更是专为动态网页而设计的语言;Ruby虽与Java同岁,但真正开始风行得益于网络应用框架Ruby on Rails的成功;至于Javascript,长期被边缘化为网页设计人员的语言,是web2.0的新宠AJAX真正将其带入程序员的视线。”

逗号有些好奇:“什么时候脚本语言变成了动态语言呢?”

“不是所有的脚本语言都能称作动态语言的,尽管后者并无确切的定义。”冒号回答,“从用途上看,一个脚本语言如果不再局限于命令行工具和粘合工具,从专用语言发展为通用语言,并能胜任复杂的应用开发,或许更有资格归为动态语言。”

句号发现:“动态语言似乎对字符处理都特别擅长。”

冒号道:“脚本语言与一般程序一个不同之处是,它一般是面向字符而非数值的,因为字符是最通用的接口,正好发挥其粘合作用,而数值运算对性能要求较高,多由核心程序来完成。动态语言继承了这个特点,并且除了正则表达式(Regular Expression)外,为字符串、数组、映射等常用结构提供了丰富简洁的运算,远比静态语言依赖于库(library)的方便得多。”

叹号问:“我们清楚了脚本语言中‘脚本’的来历,那动态语言中‘动态’又体现在何处呢?”

“问得好!”冒号闻言,正中下怀,“从用法上看,动态语言能在运行中增加或改变数据结构、函数定义、对象行为或指令流程等,具有典型的动态特征。相比而言,静态语言虽然也能实现同样的效果,但既不方便也不自然。此外不容忽视的一点是,动态语言大多是开源的,其本身的发展也更具动态性。”

引号非常注重理论:“动态语言的语法特征有那些?”

“动态语言秉承的一个理念是:优化人的时间而不是机器的时间,因此为提高人的生产率而不惜牺牲部分的程序性能。”冒号讲述着,“从语法上看,动态语言对类型的要求一般不如静态语言那么严格,代码更加简洁自由,故而多为动态类型的和弱类型的,天然支持泛型式编程。当然这不是绝对的,比如Groovy也支持静态类型,Python一般认为是强类型的。大多数动态语言支持eval函数,能动态执行任意字符串形式的代码,天然支持元编程。动态语言很多还支持包括高阶函数(high-order function)和闭包(closure)等在内的函数式编程。此外,大多动态语言也支持对象式编程,如PythonRubyPerl 5PHP 3等。”

句号补充道:“许多动态语言还支持过程式编程并发式编程,简直把主要的编程范式一网打尽了!”

“其实Python、Ruby和Groovy等还可以进行切面式编程。”冒号进一步指出,“而逻辑式编程语言的代表Prolog,同样有动态语言的特征。”

引号高兴地看到:“前面讲的八大范式无一漏网啊!”

叹号较为感性:“静态语言给人的感觉是沉稳持重,而动态语言则活泼轻快。如果同时用静态语言和动态语言编程,岂不培养出双重人格?”

“程序员本就是双重人格的。”冒号淡淡地说,“你总结得没错,两类语言的风格的确大相异趣:待静态语言披盔戴甲、备马抬枪之际,动态语言已衣袂飘飘,长剑出手了。当然如果是应付强敌的长期作战,静态语言还是有优势的。”

引号听声辨音:“这意味着动态语言不适用大型应用开发吗?“

“这么说未免有些武断。”冒号并不同意,“诚然,动态语言的语法比较宽松,相对容易出错。但也有人辩称,动态语言的代码量少于相应的静态语言,bug应该更少。有人认为动态语言调试不如静态语言方便,有人却说随着IDE的日益强大,出错几率和找错成本也在减少。谈到运行效率,动态语言虽然多为解释型语言Interpreted Language),但许多也提供了与Java类似的字节码编译bytecode compilation)甚至JIT编译(Just-in-time compilation)。动态语言在某方面甚至还更胜一筹:譬如一个类的接口如果发生变动,在静态语言中所有该类的子类必须重新编译、连接,这在大型应用中是非常耗时的,而动态语言则大可不必,其实这不足为奇——在它眼里类本来就是能动态改变的。”

逗号开始担忧起来:“动态语言优点突出而弱点并不突出,这样下去静态语言还有市场吗?”

冒号坦然道:“动态语言小快灵的风格的确吸引了越来越多人的注意,也渐渐走入静态语言的世界。Java平台和.Net平台不仅为RubyPython等动态语言铺设了跑道,而且为培植诸如Groovy等动态语言提供了土壤。同时,JavaC#本身也融进了越来越多的动态特征。”

句号断言:“静态语言这种融合性以及内在的安全性和高效性,决定了它不可能被动态语言完全取代。”

“对!”冒号坚定地说,“当脚本语言穿上动态语言的彩衣,昔日不起眼的毛毛虫便羽化成碟,开始飘舞在众人追逐的目光之中。但静态语言也绝不会淡出人们的视线,它如矫健的苍鹰,依然有搏击长空的雄力。程序员只要保持严谨的作风和开放的心态,既有稳如泰山的马步,又有一跃凌空的飞腿,静如处子,动如脱兔,如履平地般游走于高高的梅花桩上,绝无跌落之虞。”

一股豪情在众人心中荡漾开来。

冒号看了看时间,敛起眼中精光:“关于动态语言,我们简单谈到这里,下课!”

posted on 2008-05-28 14:40 郑晖 阅读(2424) 评论(1)  编辑  收藏 所属分类: 冒号和他的学生们

评论

# re: 冒号和他的学生们(连载16)——动态语言 2008-05-29 16:15 plk

节选了片段,发布在我的blog上。支持!

请继续写下去。嘻嘻  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

公告

博客搬家:http://blog.zhenghui.org
《冒号课堂》一书于2009年10月上市,详情请见
冒号课堂

留言簿(17)

随笔分类(61)

随笔档案(61)

文章分类(1)

文章档案(1)

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜