`
varsoft
  • 浏览: 2434379 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

说说动态语言

阅读更多

五一长假之前,我跟好几个开发一线的朋友聊技术的发展,突出的一个感觉是大家都在关注动态语言。有的是使用多年,眼见发展态势不错,大有为自己的先见之明扬眉吐气之感,有的则是刚刚使用,仍处在兴奋不已的状态之中,当然也有仍然保持观望态度的,不过即使是最“保守”的,也能够对动态语言表现出尊重。这与两三年前相比,已经是很大的进步。记得两年前我与Python爱好者tangtao合作策划《程序员》的第一个“动态语言专题”的时候,内内外外都还有不少质疑的声音,用J2EE的挥舞着“企业级”的大棒质疑动态语言的“严肃性”,用ASP.NET则沉醉于拖拖拽拽的GUI构造方式,自以为开发效率老子天下第一,对于动态语言嗤之以鼻。当时我们感到,动态语言在中国的发展时机还不成熟,所以最后给专题起了一个很有些无奈的名字:《动态语言:隔岸观火》。两年之后的现在,是业界的朋友反过来批评我们的杂志和网站对于动态语言的关注过于薄弱,落后于工业实践。惭愧之余,我这个动态语言的一贯拥护者不禁喜从中来:想不到形势会发展得这样快!

从最近得到的印象来看,我大胆地预言,动态语言在中国的大流行,不会是太远的事情了。首先是在Web开发领域PHP的迅速推广,很快应该会在互联网产业(面向公众的Internet应用)中广泛使用动态语言。这是一大类应用,而且是最活跃、增长最迅速的领域。在这个领域中,动态语言与开源系统结合起来,已经取得了巨大的进展,而且肯定还会取得更大的成功。往下是企业应用,这是主战场,相对来说在这个领域传统力量还是相当强大。动态语言在企业应用领域的道路还很比较长,不过机会仍然很大。在往下是PC软件开发领域,在国外,动态语言正在沁入,不过这个领域基本饱和,不太受关注。国内的软件产品开发,规模小,类型单一,影响力更是可怜,不提也罢。总之,几年之内,动态语言一定会像野火一样蔓延开,势不可挡。

我这个看法不仅仅是对于形式发展的总结,也来自于对软件技术发展趋势的认识。节前在CSDN跟gigix和xjy做过一个视频访谈,就谈了这个问题。我们觉得,广泛采用动态语言是互联网和企业迅速变化的现实所决定的一个趋势。

现在的企业应用跟十年前的MIS可是大不一样了,需求不断变化,修改没完没了。而互联网应用呢?在变化的剧烈和频繁方面,与企业应用相比可谓有过之而无不及。这本质上是因为企业在迅速变化,消费者在迅速变化,人们的需求在迅速变化,世界在迅速变化。现在经验比较丰富的企业开发者越来越达成共识,即事先分析企业应用、对抗需求变更,几乎肯定是死路一条,不管你采用什么先进的软件工程方法、建模工具、UML语言,都无法根本解决问题。你所服务的对象自己都天天在变,你怎么可能事先量好人家的需求然后慢吞吞地去添砖加瓦呢?既然无法避免变化,不如适应变化。与其想办法预见变化,不如让自己有能力迅速随需应变,提高自己对变化的反应能力,降低变化带来的成本。

这已经是共识了,问题在于怎么随需应变。分歧就在这里了。今天做ASP.NET、J2EE开发的离不开XML,就是为了“随需应变”,在变更发生时用XML来重新配置系统。以J2EE为例,高水平的J2EE开发者把XML文件越写越复杂,最后根本就就是把XML当成领域语言来用。说白了,就是把J2EE往上扩展成一个面向领域的引擎,再用一层标准化的、薄博的XML来最后的编程,我称之为“强引擎,弱脚本”方案。这样做是有原因的,Java/C#好歹是个编译语言,变更修改重新部署的成本比较大,所以要配合XML使用。但结果怎么样?并不理想。首先系统设计难度还是很大,你还是要设计一个强劲的引擎,设计得不好就带不动XML脚本。而设计这个强劲的引擎还是挺难的,设计错了修改起来还是挺麻烦的,发布以后也难免还要花大力气维护的。这问题没解决多少。

其次,也是我个人最反感的,就是XML的滥用。XML那东西本质上是用来在程序之间进行数据交换用的,是给程序读写的,不是给人读写的。无论从哪个角度来看,XML对人的阅读和创作都是非常不友好的。结果为了配合J2EE,硬是赶鸭子上架,让XML充当DSL,逼程序员去学习读写XML这种非常没有趣味的“语言”,真是不人道。更有甚者,为了使用各种框架、面向各个领域,开发者还很可能要学会多种不同语义的XML方言,而且很多这样的XML方言根本就没有经过设计,是土法炮制出来的。两种截然不同的语言搅和在一个系统里已经够糟了,更糟的是多种土法炮制的XML方言土语一起搅和在系统里,结果搞得各种语义不同的XML就像癌细胞一样在程序里扩散,这样的系统只能用恶心来形容。

总之,这种“强引擎,弱脚本”的方式,我认为是没有前途的。

相反,动态语言解决问题的方式是提供相对小而灵活的引擎,强大的语言机制,极其庞大丰富的可复用模块。你基本上在动态语言的范畴之内搭建整个系统,脚本与核心对象浑然一体,解决问题直截了当,无须转弯抹角,无须看似精妙其实无奈的一大堆架构、模式。动态语言一般实现了数据和程序的统一,基本不需要XML,程序易于变化,任何一处均可随时修改。语言的动态性也赋予你模拟领域语言的便利条件。结果便是,适应变化的能力大大增强,变化成本大大降低。很多以前的不可能将成为可能。

所以我觉得,是变化的世界要求我们使用对变化友好的动态语言。这就是结论。

另外,从程序员的角度来说,使用动态语言编程要比使用传统的编译语言,尤其是编译型面向对象语言轻松自如的多,从而也有趣得多。没有那么多条条框框,没有那么多城府沟壑。比如C++/Java/C#都极力反对用异常作为正常情况下程序跳转的工具,所谓“只在异常情况下使用异常”,说来容易,做起来常大费周章。而Python/Ruby都纵容甚至鼓励你使用异常作为正常程序流控制手段。比如Python中for循环的终止,在内部就是通过引发StopIteration异常实现的。能随意用异常作为流程控制手段,真是能省下不少脑细胞。比如我们平常津津乐道的不少设计模式,在动态语言里根本就是多此一举,一切来得直截了当,根本不用如此拐弯抹角。再比如Ruby可以在一个class被定义并且在系统中已经被应用的情况下,在系统运行时随意修改这个类的定义,Python中只要略施小计也可以做到,这在传统OOP语言中根本不可能。而Ruby在其招牌项目Rails中表现出来的declarative language的能力,也是令人惊羡的。使用这些动态语言,要先解放思想,之后就会有挣脱束缚,放开手脚的感觉。对于程序员来说,这当然是很惬意的。

分享到:
评论

相关推荐

    Python动态语言与鸭子类型详解

    动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力如PHP、...

    JSP基于SSM企业个性化资讯交流平台网站 | 毕业设计

    开发软件: Eclipse + JDK + ...新闻动态(分为推荐,生活,文化三个类目) 娱乐休闲(分为4个,音乐,微视频,动图,每日菜谱) 后台地址: jsp/backjsp/login.jsp 主要需要把temp目录复制到tomcat的webapp下面

    安卓简单QQ

    1. 概述 1.1课题题目:SimpleQQ(简易自动聊天软件) 1.2系统的主要目标: 通过Android开发原生的安卓手持设备...看动态模块 时间轴方式查看所有好友说说 聊天模块 当前登录用户可选择任意好友进行聊天,好友自动回复

    c++ 完备的运行时类型信息(动态类型信息)

    就说说动态类型信息这块,又或者说是反射。自然,语言本身提供的废物type_info就懒得说了,除了证明c++也东施效颦,也能支持动态信息之外,就别无用处了,有谁会正儿八经的用type_info做点正儿八经的事情呢。因

    在PyCharm中三步完成PyPy解释器的配置的方法

    介绍方法之前,我们先说说Python的解释器,由于Python是动态编译的语言,和C/C++、Java或者Kotlin等静态语言不同,它是在运行时一句一句代码地边编译边执行的,而Java是提前将高级语言编译成了JVM字节码,运行时直接...

    React开发实战

    那么可能有人说目前所有的三方库都是开源的,都开放,那我们...另外React与Angular最大的不同是:React是以Javascript为中心,而Angular是以html为中心,一种是动态语言,一种是展示语言,高下立现。 加群:460499457

    友推SDK是一款是面向移动应用的SDK组件,提供给开发者集成使用.rar

     刚才说到了视频相对于文字、图片、语音这三大媒介的好处,那该说说缺点了,如今普遍的观点就是创作的门槛以及流量成本高。我们先说流量成本,的确,在目前的用户认知中,只要谈到视频,第一反应就是耗流量。

    浅谈Javascript数组(推荐)

    在程序语言中数组的重要性... 数组,即Array类型,是开发中最常用的类型之一,javascript中的数组和其他语言最大的区别就是每一项可以保存任何类型的数据,而且数组的大小是可以动态调整的,有点绕?看看代码吧  1.

    【推荐】超全的移动安全自学资料精编合集(43份).zip

    Android安全软件壳: 说说Android软件壳 Android安全应用逆向: 反编译classes.dex文件 Android安全应用逆向: 使用Apktool解包并打包 Android安全应用逆向: 使用IDA静态分析so文件 Android安全应用逆向: 动态调试Smali...

    python数据结构之链表详解

    之前很多的教材都是用C语言实现链表,因为c有指针,可以很方便的控制内存,很方便就实现链表,其他的语言,则没那么方便,有很多都是用模拟链表,不过这次,我不是用模拟链表来实现,因为python是动态语言,可以直接...

    I need AV,Tomcat(翻译一下:我需要安慰,Tomcat)

    前段时间在朋友圈看到之前一个同事,发表了一个动态:“I need AV,Tomcat”(翻译一下:我需要安慰,Tomcat)。细聊才知道,他所负责的一个项目,生产环境上一个Tomcat开启了热加载模式,导致引起内存泄漏,造成...

    mysql数据库教案.docx

    通过任务引领型和项目活动形式,掌握简单的数据库设计、数据管理和维护方法,能进行web服务器的设置,具备使用web数据库与高级程序设计语言或动态网页结合完成简单程序开发的基本职业能力。 mysql数据库教案全文共9...

    如何避免PHP实例代码中的一些坏代码

    做PHP开发已经有快一年的时间了,在这一年的时间中,学习了很多生产环境中的技巧,学习了很多东西,期间也阅读了一些优秀的源码和关于代码的书,...由于PHP是一个弱类型的动态脚本语言,所以很多情况下,给了这个语言本

    Javascript下的urlencode编码解码方法附decodeURIComponent

    关于在ASP(Server.UrlEncode)、PHP(urlencode())函数编码结果,或是经过asp、php等动态语言直接写入COOKIES的中文字符,用JS读取的时候,都会碰到一个编码的问题,那就是最终字符串被urlencode编码了,而又时有...

    移动安全系列教学下载共43份.zip

    Android安全软件壳--41--说说Android软件壳.pdf Android安全逆向工程--40--逆向工程知识技能补充篇.pdf 移动安全--42--MobSF-v3.0源代码分析【长文巨献】.pdf 移动安全--43--我设计的Java代码混淆解决方案.pdf

    如何学习ACM,看后受益匪浅

    这其中比较难于掌握的就是动态规划,如何抽象出重复的子问题是很多题目的难点所在,笔者建议初学者仔细理解图论中一些以动态规划为基本思想所建立起来的基本算法(比如Floyd-Warshall算法),并且多阅读一些定理的...

    分析Python中设计模式之Decorator装饰器模式的要点

    先给出一个四人团对Decorator mode的定义:动态地给一个对象添加一些额外的职责。 再来说说这个模式的好处:认证,权限检查,记日志,检查参数,加锁,等等等等,这些功能和系统业务无关,但又是系统所必须的,说的...

    [源代码] ASP.NET 3.5 商用社交网站开发全程解析

    - 好友 模块 (Friends) (功能:查找好友、站内邀请好友、邮件邀请好友、导入好友邮箱、添加好友关系、删除好友关系、微博心情说说) - 站内信 模块 (Messages) (功能:发送站内信、删除站内信,回复站内信) - 图片...

    浅析nginx刚刚发布的JavaScript能力nginScript

    2015年9月,nginx宣布支持类JavaScript语言。这意味着开发者可以更轻松、自由的控制全球最优秀的HTTP及反向代理服务器,并在此之上可以衍生出更多有用、好玩的创意。Nginx也更开发的走向了动态配置化的下一个阶段。...

Global site tag (gtag.js) - Google Analytics