10th 二月 2011
在JVM平台并入Oracle产品线后,Oracle将对JVM平台进行多项改进和调整。内容包括增强平台的模块化和集成性等特征、为Java SE增加多核处理支持,在Java ME中增加多点触摸支持等。与此同时,Oracle开发部副总裁Adam Messinger在Qcon开发大会上透露,Oracle计划在提供免费版JVM基础上新增收费版本,在收费版JVM里整合HotSpot JVM与JRockit JVM,为高端用户提供功能更为强大的解决方案。
对开发者来说,无论Oracle策略如何,JVM平台依然有着巨大的吸引力。依托于JVM平台的动态语言,始终保持着蓬勃的生命力。在这些动态语言中,能够同时兼容Java虚拟机和.Net CLR通用语言运行时的Fantom,是其中极具特色的动态语言。
Fantom最初被称为Fan语言,由于定名为Fan不易检索,开发者在09年11月份将当时新发布的版本定名为Fantom语言。Fantom使用与BSD 类似的Academic Free License 3.0开源协议授权。
Fantom的开发者将其设计为一门实用且有趣的脚本语言,来解决Java和C#编程中实际存在的问题,降低开发者编码的难度。Fantom语言最大的特点是它的可移植性,Fantom代码能够无缝的在Java VM和.NET CLR平台之间进行迁移。为了保证平台间的顺利移植,Fantom代码首先被编译为fcode,即一种字节码表示法,之后转换成为Java字节码或IL解释语言,转换的过程在程序运行时完成,开发者可以以单个文件的形式在虚拟机中部署Fantom代码模块。
对于Java VM和.NET CLR平台切换时的API调用,Fantom给出了简便易用的解决办法。Fantom提供了一组与Java 和.NET API配合使用的API接口供开发者使用,来屏蔽不同平台间对于系统API调用的差异。
当然,Fantom语言的可移植特性不仅限于Java和.NET平台,Fantom支持将代码编译为JavaScript脚本供开发者在浏览器端使用。Fantom语言从一开始就为跨运行时的编程而设计,在未来的规划中,Fantom语言还将支持iPhone的Objective-C语言,以及LLVM集成编译环境或集合了Python与Perl语言优势的Parrot语言。
在Fantom编程支持方面,开发者可以使用基于NetBeans Platform的IDE环境FantomIDE进行编码和调试,IDE包含开箱即用的Fantom环境,语法和词法解析使用开源语法分析器ANTLR设计,FantomIDE还提供了Javascript、CSS、HTML、XML等脚本支持以及Subversion和Mercurial等管理工具。
JVM平台从不缺乏优秀的动态语言,Groovy、JRuby、Jython、Scala都是其中的佼佼者,不同语言的风格类型、运行速度和工具支持也各有千秋。Fantom以其跨运行时的特性和先进的设计理念,是否将来能脱颖而出得到开发者的认可,让我们拭目以待。
本文曾发表于《程序员》杂志-2011年02期”程序天下事”栏目。
Posted in 编程语言 | 2 Comments »
3rd 十一月 2010
LLVM编译环境是C、Objective-C和C++的编译工具集,为面向C或基于C的语言提供新一代高效易用的虚拟机环境。LLVM起源于2000年伊利诺伊大学发起的开源项目,起先主要在学术研究领域应用。在2005年,Apple为LLVM提供了人员支持以帮助其发展,并保持LLVM与Xcode良好的兼容性,使其成为一个开发者易于使用的编译器。
相比较传统的GCC工具,LLVM的设计秉承了更为现代的模块化思想。LLVM为开发者提供了中间代码和编译基础设施,并能与IDE紧密交互和集成,作为IDE的底层支撑基础,为代码补全、重构等功能提供辅助,同时在程序编译、连接、运行环境执行过程中实现全新的编译优化策略。值得一提的是,LLVM还提供了很多编译器以外的辅助工具,如对代码进行静态检查并生成HTML格式的分析报告等。
在程序编译过程中,GCC完成了从预处理到代码生成的整个过程,其封装式的设计使得很多中间信息无法被其他程序重用。而Clang将编译过程分隔成模块化的阶段,以大幅度增强开发者对于代码的操控能力。Clang的设计目标之一就是要超越GCC编译器,在Clang官方站点的性能比较栏目中,列举了Clang与GCC、Elsa以及Portable C的各项比较优势。
在LLVM 2.7版本之前,LLVM支持C和Objective-C编译,在LLVM 2.7版本发布时引入了对于C++的支持。LLVM的编译器由Clang完成,Clang在编译速度方面非常高效,体现在包括预处理、语法解析、语义分析、抽象语法树生成的各个编译步骤之中。同时Clang在内存占用方面的开销非常经济,较之GCC有大幅度的缩减。与GCC相比,Clang的设计清晰简单、易于理解,具备良好的扩展性,同时能够保持与GCC 的兼容性。Clang为程序诊断信息提供了非常好的版式结构,为程序语法错误提供了源码提示,以及上下文调用的错误提示。
在最新发布的LLVM 2.8版本中,增加了C++标准库实现LibC++。在C++标准符合性以及高效代码生成方面,LibC++库有很强的优势。新版本LLVM中还包含了新一代高性能调试器LLDB,LLDB使用与LLVM编译器相同的解析器和源代码工具,以替代先前的GDB调试器。
来自伊利诺伊大学香槟分校的Vikram,同时也是LLVM开发者Chris Lattner的导师,在代码生成和优化大会CGO 2009上的主题演讲《下一代编译器设想》中谈到:下一代编译器、优化器和运行时的基础架构将更注重在静态语言中应用实时编译和动态优化技术,并且编译器将借助更为灵巧的自动调优策略来挖掘程序优化潜能,同时编译器将会采用投机优化的方式来弥补静态分析优化的不足之处。LLVM项目已经在为下一代编译器的实现方向做出努力,这个致力于超越GCC的新一代编译环境,必将为程序编译注入新的动力。
本文曾发表于《程序员》杂志-2010年11期-“程序天下事”栏目。
Posted in 编程语言 | 1 Comment »
6th 九月 2010
诞生于2007年的Clojure是JVM平台上的Lisp实现,Lisp 以强大的功能和表达性而著称,但应用范围存在着固定的局限,于是发起人Rich Hickey设计Clojure的初衷便是希望得到一门能够服务于高并发应用场景,较Lisp更为先进的函数式编程语言。
Clojure 保持了函数式语言的主要特点,同时避免了不稳定状态、递归和高阶函数。Clojure在语法上非常简单,其设计优势在于,让开发者绝大部分工作专注在真正解决问题上,而非耗费在如何模块化设计和如何进行解耦层面上。与Lisp语言相似,Clojure也是基于S-表达式设计。S-表达式给出了表达半结构化数据的约定,以其在Lisp 语言中的广泛应用而为人熟知。S-表达式在Lisp 中既用作代码,也用作数据,其最通用的特性是使用S- 表达式作为括号化的前缀表示。
与JRuby 、Jython 、Scala等依托于JVM 运行的语言相同,Clojure 是运行在Java虚拟机平台上的Lisp 方言,能够直接调用Java 类库,借助JVM 平台广泛的适用性,为Clojure语言的应用拓展了空间。此外,Clojure 可以说是社区智慧的结晶,在Rich Hickey等核心开发者之外,Clojure 语言的补丁、文档、测试和不少新功能的开发思路都是来自于开源社区参与者的贡献。
Clojure 之所以受到广泛关注,最主要的原因来自于其并发特点,如支持软件事务存储(Software Transactional Memory,STM )等特性。在实际应用方面,站点FlightCaster为用户提供了航班延误的预告信息,同时也为iPhone和Blackberry提供了终端应用。FlightCaster的Web前台用Rails 实现并部署在Heroku上,后台数据分析和处理程序则由Clojure实现,同时在后台使用了Hadoop、Cascading、Cloudera等工具。在FlightCaster 站点中,数据预处理并转换成适当视图用以分析的操作,以及所有统计推断和机器学习代码都使用Clojure 实现。FlightCaster站点将Clojure数据结构用作通信和存储的中间表示,Clojure 代码分析得到的航班预告模型,以Json中间格式来表示,然后推送到Rails 前端,以Json格式读取数据并展示给用户。
对于Clojure 开发者来说,开发工具首选是使用NetBeans IDE的Enclojure插件,Enclojure 提供了支撑Clojure 开发的一组类库,包含独立的REPL(Read/Evaluate/Print/Loop)支持,同时支持REPL 和远程JVM 建立连接。Enclojure 提供的编辑器支持具备语法高亮显示、函数声明定位,S-表达式导航,Lisp 风格缩排,代码结构化导航,内置项目模板,断点设置和单步调试,并能够对代码错误给出超链接提示。此外Eclipse 也提供了专门的Clojure 语言开发插件CounterClockwise,在源代码编辑,代码调试,REPL 支持方面也有独到之处,适合于习惯于Eclipse 的开发者使用。
本文曾发表于《程序员》杂志-2010年09期-“程序天下事”栏目。
Posted in 编程语言 | No Comments »
8th 八月 2010
Go语言是Google公司的实验性语言,以BSD协议开放源代码。Go语言在Inferno操作系统相关的研究工作基础上开发,最初由Rob Pike等Google工程师在2007年9月启动设计工作,在2009年11月正式对外发布。
Go将动态语言易于编写的特性和静态语言的高效性相结合,具备良好的易用性和极佳的执行效率。Go语言最初定位于网络服务器、存储系统和数据库的程序设计,同时在语言中包含并发构造体,以方便的帮助开发者创建并行任务。Go语言具有效率极高的编译器,目前Go编译器能在Linux、FreeBSD以及Mac OS X平台下运行,但暂时没有对Windows环境提供编译支持。Go开发团队曾在博客中表示,编译完成的Go程序运行速度接近C语言实现的程序。
在今年五月份举办的Google I/O大会上,Go语言背后的工程师Rob Pike和Russ Cox两人一同为开发者带来了Go语言编程讲座,解释Go语言的灵活设计和独到之处。Go语言的主要设计者Rob Pike是Google公司的资深工程师,在分布式系统、程序语言设计以及软件开发工具方面有着多年的经验。此前在贝尔实验室工作期间,Rob曾是网络操作系统Plan 9的设计者,同时也是Inferno 操作系统的设计者,Rob还曾与AWK 和AMPL编程语言的设计者Brian Kernighan一起合著有两本Unix环境下编程语言的书籍。同时,Rob Pike还给出一份可供参考的Go语言教程。
针对Google I/O大会上收集到开发者的提问,在Go开发团队博客上给出了常见问题的FAQ。在Android平台支持方面,Go编译器支持面向ARM处理器的代码生成,所以在Android平台上运行Go程序是可行的,Go语言开发团队也将积极推进Android平台上的开发工作。由于Go具备简洁的语法和语言本身的一致性,已有大学执教的老师表示将会在自己教授的编程语言课程中为学生开设Go语言选修项目。
目前在Google内部已有部分应用使用Go语言来实现,同时开发团队表示,Go已相对成熟,完全能够用于最终系统的开发和交付,甚至可以使用Go来开发Web应用。在后续工作中,Go开发团队将不断对语言进行改进提升,并随时欢迎开发者在社区中反馈Go语言开发时遇到的问题。目前在国内使用Go语言进行实际开发的公司还为数很少,尝试使用Go语言的开发者大多源自个人兴趣或技术预研,随着Go语言类库和成功案例的增多,将会有越来越多国内开发者在实际开发中尝试Go语言带来的效率和便捷。
本文曾发表于《程序员》杂志-2010年08期-“程序天下事”栏目。
Posted in 编程语言 | 3 Comments »
12th 六月 2010
在今年QCon北京大会上,来自支付宝的架构师蔡学镛为参会者分享了REBOL编程语言相关的主题讲座。对大多数开发者来说,在实际开发项目中选用REBOL语言目前并不算多,但REBOL语言却有着与生俱来的优势,能够帮助程序员得心应手的完成特定应用场景的开发工作。
REBOL是Lisp语言的替代品,由业界知名的操作系统和编程语言架构师Carl Sassenrath设计,是为分布式计算和通信量身打造的轻量级开发语言。REBOL完全能够胜任Lisp语言的应用场景,同时REBOL又打破了Lisp的局限。REBOL更类似于一般编程语言的表达方法,允许使用中缀运算符,且不需使用Lisp语言那样一对对嵌套的小括号来表示递归。REBOL语言具有统一的库函数,如REBOL/Core、REBOL/View、REBOL/Command、REBOL/SDK、REBOL/IOS等库函数,在图形界面、编程辅助、网络处理等方面提供丰富的支持。
REBOL的图形界面设计能力十分强大,通过简单的图形界面编程语句就可以完成图形界面的创建,并且图形界面的展示美观漂亮。同时REBOL内置了View Draw Dialect方言,帮助开发者以最简便的方式完成图形界面中元素的定制,同时可以根据开发者的需求进行方言的拓展,定义开发者需要的子语言。作为网络编程语言,REBOL在网络处理方面具备很强的能力,对于文件下载、网页抓取、邮件接收等操作,在REBOL中仅需几条语句即可完成操作。
对比REBOL语言,在动态语言中应用非常广泛的Python语言,具有完整的面向对像特性,语言简便易用,编写的程序非常优雅。从加快开发速度的角度考虑,能够代替C和Java语言完成工作任务,同时与C语言的沟通能力非常好,任何为C编写的接口能够很容易转化为Python接口。而REBOL是基于相关表达式的对象语言,REBOL被称作最接近人类语言的编程语言,有着自身的独特之处,能够方便的表示数据和元数据。REBOL的设计理念之一就是始终保持小巧,即便REBOL已内置了几十种数据类型和数百条函数,以及多种Internet协议、错误处理等内容,REBOL解释器仅有几百K大小,REBOL程序编写方便,在代码编写时程序不需要对库和包含做声明即可使用,帮助开发者以最精炼的语句实现应用。同时REBOL代码可以跨越几十种系统平台,在不同平台之间移植代码不需做任何改动。
需要强调的是,REBOL是商业公司产品,可以提供给开发者免费使用,但源代码并不开放,使用部分REBOL函数库如数据库连接库,需要支付额外的费用。但从另一个角度看,由公司维护的语言能够在最大程度上保证类库的统一,减少开发者额外的负担。
目前REBOL语言的解释器最新版本为R3 Alpha,在REBOL语言中文参考文档方面,蔡学镛和蔡民奎先生已经在网络整理了REBOL语言的中文参考文档,其中包含REBOL 3.0指南,REBOL内建函数,REBOL数据类型等不同的内容,感兴趣的开发者甚至可以加入其中,一同更新维护REBOL语言的中文资料。
本文曾发表于《程序员》杂志-2010年06期-“程序天下事”栏目。
Posted in 编程语言 | No Comments »
25th 五月 2010
Hadoop使用Java语言实现,编写具体的应用业务除了借助Hadoop的Java API外,还可以使用开发者所熟悉的Python或C++等其他语言编码。在Hadoop安装路径的/src/examples/目录中,给出了Python实现的分布式应用示例。除了将Python代码通过Jython运行时转换为jar包部署,还可借助Hadoop Streaming工具,利用可执行程序或脚本代码实现Map-Reduce中的Mapper或Reducer过程,借助标准输入输出交互数据而不需编写Java实现类。
如何以Pythonic的方式完成Hadoop经典的WordCount词频统计工作,来自德国的开发者Michael G.Noll在博客中撰文讲解了实现方法:在Python编码中,通过STDIN标准输入和STDOUT标准输在Map和Reduce代码之间传输数据。Python的sys.stdin方法读取输入数据,并通过sys.stdout打印输出数据,而数据的交互处理过程交由Hadoop Streaming来处理。以同样的方式,可借助Perl、Ruby或其他动态语言完成Map-Reduce处理过程。
在Hadoop API的Python封装方面,著名音乐站点Last.fm发布了基于Python的Dumbo(小飞象)项目,Dumbo能够帮助Python开发者更方便的编写Hadoop应用,并且Dumbo为MapReduce应用提供了灵活易用的Python API。Last.fm的开发者,同时也是Dumbo项目发起人Klaas Bosteels 认为,对于定制Hadoop应用,使用Python语言代替Java会让工作变得更有效率。
在基于Dumbo框架的应用实现中,不需模仿Michael G.Noll给出的代码将mapper和reducer存放于不同的文件中,而只需在程序中定义mapper和reducer函数,并通过语句dumbo.run(mapper,reducer)来启动执行过程。在作者给出的Dumbo示例中,能够将Hadoop原先60行Java源代码实现的WordCount示例,简化为Python实现的7行源代码来完成。此外,Dumbo还提供了一些易用的功能,包括向dumbo.run()执行操作传递第三方参数。并在Dumbo项目文档中,给出了从Apache访问日志文件中进行IP统计的完整示例,以及四个简短的应用示例。
另外一个相似的项目Happy,则为Jython开发者使用Hadoop框架提供了便利,Happy框架封装了Hadoop的复杂调用过程,让Map-Reduce开发变得更为容易。Happy中的Map-Reduce作业过程在子类happy.HappyJob中定义,当用户创建类实例后,设置作业任务的输入输出参数,然后调用run()方法即可启动分治规约处理,此时,Happy框架将序列化用户的作业实例,并将任务及相应依赖库拷贝到Hadoop集群执行。目前,Happy框架已被数据集成站点freebase.com采纳,用于进行站点的数据挖掘与分析工作。
Posted in 编程语言 | No Comments »
3rd 二月 2010
2008年夏末的傍晚,我和同事在昌黎黄金海岸遛弯时,接到了Sun中国社区经理Ada Li的电话。Ada在电话里聊起,计划在Sun开发者网站开辟一个新栏目,专门介绍那些有趣的Sun工程师的故事。
Sun公司聚集了众多IT精英,不少工程师都身怀绝技,这一点我早有耳闻。我一直很感兴趣Sun的技术,而且交稿准时,Ada便希望我能撰写这个专栏,我自然也乐意来做。
于是,Sun中国技术社区之星的写作计划就这样开始了。从2008年10月到2009年10月,恰好写了整整十二期栏目。起初我主动向Ada征询过动笔时预设的格式和内容要求,Ada的回复却很豪爽,说这是我负责的栏目,可以自己决定。
准备栏目文稿不需太多时间,被采访的工程师也都乐意配合我一起把内容做好。在此期间,接触到不少有趣的Sun员工,比如去M@x办公室拜访时,看见他工作台上摆放的神龛,里面供奉着Java的开源吉祥物Duke玩偶。撰写Alex Peng的介绍时,得知他是Solaris系统的铁杆粉丝,但凡有人说Solaris不好,他总会把对方辩到心服口服为止。如此的趣事很多,但无一不体现着工程师们对于Sun产品近乎偏执的热爱,以及对事业的责任感。
如今,Sun加入Oracle的计划已尘埃落定,很多在Sun中国工程研究院的工作的朋友也相继离开,当然,这也包括部分在社区之星栏目中介绍过的工程师。市场争夺总是弥漫着硝烟,但Sun公司一直恪守工程师文化和自由开源的精神,让每一个开发者因Sun的贡献而受益。
把这十二期栏目集结成文,一为留作纪念,同时也希望感兴趣Sun文化的朋友可借此管中一窥,了解Sun众多伟大产品背后,一群可爱工程师们的平凡故事。
Sun中国技术社区之星文章汇总(PDF:3M):http://www.gaoang.com/files/sun-sdn-star.pdf
Posted in 编程语言 | No Comments »
20th 九月 2009
Nimbus是网格中间件Globus旗下的开源云计算项目,Nimbus面向科学计算需求,通过一组开源工具来实现基础设施即服务(Infrastructure-as-a-Service,IaaS)的云计算解决方案。
Nimbus项目最初的名称为Virtual Workspace Service(VWS),其中Workspace Service是整个平台的核心模块。在Nimbus平台里,包含的组件有:Workspace Service节点管理器、基于WSRF的远程协议实现、基于EC2的远程协议实现、云计算客户端、Workspace Pilot整合虚拟机等面向不同层面的应用组件,Nimbus项目各个组件在设计上非常轻量化且具备自身完备性,可以通过多种异构方式进行组合,组件之间的连接关系如图所示。

在Nimbus支持下,客户端通过部署虚拟计算机(VMs)的方式租用远程资源。Nimbus的部署在服务节点上,运行环境仅需Java和bash,在管理节点上,还需要具备Python (2.3+)、以太网连接层桥接工具ebtables,DHCPd以及Xen虚拟化环境。
同样实现云计算基础平台的OpenNebula项目给出与Nimbus类似的开源数据中心实现,在在物理资源上实现虚拟机环境,但与OpenNebula不同的是,Nimbus以WSRF服务对外提供远程接口,同时具备安全控制机制。Nimbus的接口可以在后端同OpenNebula虚拟机管理器相结合。
在Nimbus的线路图里,包含缓存管理、网络传输、本地资源管理、细粒度执行、安全机制等各个方面的设计目标,功能强大。但研究类项目的易用性一直不太好,大多数配置工作都需要通过命令行完成,阻碍了项目的普及和推广,希望日后在可用性方面有所改进。
Posted in 编程语言 | 3 Comments »