聊聊Java平台上的非Java语言

开发 开发工具
Java虚拟机定义了一个"软CPU", 和Intel 的x86 的指令集一样, 这个软CPU也有一套自己的指令,这就意味者对于任意一门编程语言,只要你能编译成Java 的字节码指令,或者在运行时动态的生成字节码指令, 就可以运行在Java虚拟机中。

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获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2009-01-16 09:10:39

JavaCRM系统企业应用

2010-03-22 09:30:55

Linux非开源软件

2013-08-27 10:31:05

Headless模式Java SE设计模式

2012-04-25 14:27:03

JavaScala

2016-11-28 09:08:43

java系统异步非阻塞

2012-04-25 14:12:12

JavaScala

2012-04-26 13:37:43

ScalaJavaQCon

2012-06-12 09:43:34

微软Linux服务

2012-11-05 10:39:15

IBMdw

2019-11-26 14:52:40

Linux工具写作者

2016-12-28 09:30:37

Andriod安卓平台依赖注入

2021-08-10 19:15:17

语言编程应用

2011-12-01 11:36:42

云计算苹果谷歌

2023-07-03 16:15:46

模型训练

2010-06-09 17:46:53

2011-09-07 17:04:40

QT平台模拟鼠标

2021-12-11 19:00:54

Java中断机制

2022-04-02 08:14:02

JavaThreadLoca数据

2021-12-16 06:52:33

C语言内存分配

2011-08-23 09:16:19

Python
点赞
收藏

51CTO技术栈公众号