查看原文
其他

聊聊Java 平台上的非Java语言

2017-02-22 刘欣 码农翻身

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的感知能力, 安全重构的能力是极为重要的, 让人觉得安全,可控,适合大团队协作。


(完)



你看到的只是冰山一角, 更多精彩文章,参见《码农翻身2016文章精华


有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。



编辑推荐


掘金是一个高质量的技术社区,从移动开发到架构设计,编程语言到开源类库,让你不错过互联网开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存