Java 的创造者们在一开始就把Java 语言和Java 虚拟机分开, 现在看来是个非常明智的决定。
Java虚拟机定义了一个"软CPU", 和Intel 的x86 的指令集一样, 这个软CPU也有一套自己的指令,这就意味者对于任意一门编程语言, 只要你能编译成Java 的字节码指令,或者在运行时动态的生成字节码指令, 就可以运行在Java虚拟机中。
Java 虚拟机发展了这么多年, 已经非常的成熟和稳定, 是一个很有吸引力的平台。 除了Java 之外还有不少编程语言慕名而来, 今天就来聊一聊。
1.Jython和JRuby
从这两位名字开头的字母 "J" 就可以看出来这两个语言和Java 的血缘关系。
没错,他们就是可以运行在Java 虚拟机上的Python 和 Ruby 。 不同于用C语言写的CPython和 CRuby, 这两者需要一个JVM才能运行。
既然是运行在JVM上的语言, 自然要能调用Java 类库, 要不然放着这么多优质Java 资源不用多可惜!
下面就是一个在JRuby 脚本中调用 Java Swing的例子:
如果你思考的深入一些,就会有这么一个问题 : 由于Python 和ruby 都是脚本语言, 都是解释执行的, 没有编译的过程, 那Jython和JRuby 在解释的过程中,肯定得生成Java 字节码, 要不然JVM就会把他们拒之门外。那字节码是怎么在运行中生成的?
答案就是ASM , 一个可以动态生成字节码的Java 类库。
(码农翻身注: 参见文章《ASM: 一个低调成功者的自述》)
我个人觉得Jyhton和JRuby能在JVM上运行起来,调用Java 类库, 是个很好的卖点, 但是却难以大规模流行, 原因可能也是类库造成的。
最早的时候学习C语言, 由于没有良好的类库,就是对一个字符串操作都很麻烦, 那些更加高层的语言例如Java, Python, Ruby 就弥补了这个缺陷, 语言自带强大的类库, 再加上社区的贡献, 用起来非常顺手。 说个题外话, 这也直接导致了很多初学者的疑问: 语言都封装好了, 我还学数据结构干嘛?!
Python, Ruby 社区已经积累了大量的、好用的库, 他们才是Python, Ruby一派繁荣的主要原因, 但是这些库都是Python, Ruby写的, 也有不少是C语言写的, 这些海量的类库全部移植到Java 上绝非易事, 我们也不能要求类库的作者同时提供Java 版本 。
而Java 现成的类库总是感觉和Python , Ruby 有一点Gap, 语言设计的思维不同, 虽然可以集成互操作, 但还是感觉别扭。
也许Jython和JRbuy 只是小范围内或者特定场合使用吧。
2.Groovy
Groovy 并不像Jython, JRuby, 它并不是一个现有语言在JVM上的移植, 而是一个全新设计的语言。
Groovy被定义为JVM上的动态脚本语言, 适合编写脚本, 测试用例和 领域特定语言(DSL)。
用Groovy 写的软件中有两个比较知名:
1). Gradle
一个风头正劲的Build 工具, 得益于Groovy 简洁的语法, 可以用“Build领域特定的语言”来描述一个软件的构建过程, 写出的Build脚本 和Ant, Maven 的xml 脚本 相比,读起来更赏心悦目。 在Web项目,Android项目的 Build过程中有大量使用。
下面是一个例子, 大家可以感受一下和Maven 的区别:
2). Grail
这应该是模仿Ruby on Rail的一个项目,热度已经过去, 估计使用的人不多了。
记得在2008年IBM的毛新生带领着团队搞了一个Project Zero出来, 基于Groovy和PHP, 目标是快速Web项目开发, 喧嚣了一阵也是归于沉寂。
在JVM上, Java 是毋庸置疑的老大, Spring 是一座难以撼动的大山, 所以Groovy ***还是把注意力集中到 小工具,测试 以及Build上, 这是它能***发挥能量的地方。
3.Scala 和 Clojure
Scala ***次进入我的视线是一则新闻: Twitter 决定把核心应用从Ruby on Rails 迁移到Scala,作为曾经的Ruby拥趸, 看到这个消息是让人沮丧的 : Twitter 可是Ruby on Rails 经常拿来宣传的一个明星系统了, 现在Twitter 竟然想转到Scala , Scala是什么鬼? 怎么可能获得Twitter 工程师的青睐?
后来看了一下,Scala是一个很有趣的语言, 在他的官网上写着“Object-Oriented Meets Functional” , 面向对象遇上了函数式编程 ! 也就是说一门语言混合了两种编程范型。 不仅如此,它还是一个可以运行在Java 虚拟机上的语言, JVM的成熟和稳定, 可能也是Twitter 工程师选择Scala的重要原因。
(码农翻身注: 关于函数式编程, 可以参考《命令式编程 vs 声明式编程》)
有人说了,我面向对象还没学完呢, 还学函数式编程? 我推荐你看看《黑客与画家》一书, 看完以后十有八九会被Paual 自身成功的案例和 富有煽动性的语言给鼓动起来, 热血沸腾的去尝试函数式编程语言Lisp(我就是如此) :-)
但是我相信大部分人都只是浅尝辄止, 因为纯函数式编程和我们日常使用的C, Java, Python 这些命令式编程语言大相径庭, 需要巨大的思维转变, ***是完全忘掉之前所学的命令式编程才行, 所以学习曲线极为陡峭, 把很多人都吓回去了。
现在好了, Scala即支持OO, 又支持Functional , 你可以在一个相对舒服的环境渐渐的去尝试函数式编程的奥妙,确实是不错的选择。
如果你非要学习一个纯粹的函数式编程语言, 可以考虑Clojure ,这是一个运行在JVM中的lisp方言, 同样可以和Java 类库互操作。
4.总结
说了这么多, 如果让我为一个大型项目选择语言, 我极有可能还是要选择Java, 对于一个大型项目来说, 代码的可读性、可维护性是非常重要的,我之前读一些动态语言的代码, 看到一个变量而不知道它的类型,没法查看它的行为, 这是非常令人抓狂的体验。
而Java 这种静态类型的语言,IDE的感知能力, 安全重构的能力是极为重要的, 让人觉得安全,可控,适合大团队协作。
【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】