首页 > 关于Scala虚拟机的一些疑问

关于Scala虚拟机的一些疑问

我最近一直在学习scala这种被成为下一代java的语言,应该说它的一些特性挺吸引人的。但我最近注意到Eclipse推出了一个叫做Xtend的语言,在新闻中提到

Eclipse Xtend可以编译成可读的Java代码,类似CoffeeScript之与Javascript。

什么意思?就是把一种语法替换成另一种而已,其机理有点像我们使用的模版引擎,模版语言最终会被替换成目标语言执行。那么scala呢?似乎高级一点,它是直接编译成java class的(或者.net平台的CLR代码)。

但很重要的一点是它本身没有虚拟机实现或者更加底层的支持。那么我想问的是

  1. Scala没有自己的虚拟机到底有没有问题,这是否会影响它作为一种语言的独立性和执行效率
  2. java虚拟机,以及CLR虚拟机跟其它的虚拟机有什么区别。因为我发现在这两个虚拟机上有很多其它语言的实现,比如JRuby, JPython, IronPython等等。但是像ruby, python这种语言又都有自己的虚拟机,但没听说在它们的虚拟机上又衍生出什么语言的。

目前感觉 Scala 的一个大问题是,会编译出很多你意想不到的 class 文件——这是受限于 JVM 所致。基于这个原因,对 bytecode 的控制也不确定很多,如果需要高性能的话,会是一个大问题。

  1. 不知道你说的“问题”是什么问题,提问可以更清楚一些么?Scala 不像 Python,既有 CPython 又有 Jython,Scala 没有脱离 JVM 的实现,怎么比较其“影响”?另外,可以运行在 JVM 上面有它自己的好处:Java 的库是海量的。(声明,当然像 Janino 这样的东西是存在的)

  2. Python 有自己虚拟机的说法是不严格的。Python 的默认实现 CPython 不是一个通用的虚拟机,也不是一个运行在虚拟机上的实现,它只是一个 Python 程序的解释器以及一些运行时环境、JIT,它不是像 JVM 那样通用的、严格定义的标准,也完全没有 JVM 那样 heavy。


我觉得,程序语言之所以称作“语言”,应该跟我们日常生活中所说的语言本质上是相同或相近的。会相同语言的人之间可以畅快交流,面对不懂的语言就需要翻译来帮我们了。

把JVM想想作白抠得星球说白语的劳工。白劳的语言我不懂,因为我只说Java,所以虽然他能做很多事情,但是没法告诉他要做什么,这时我就只好让javac来帮我翻译了。我媳妇的话我有的能听懂有的听不懂,可能因为女人总是喜欢说Scala吧。没办法,有钱只好任性,我又请了javac的弟弟scalac来帮我媳妇做翻译。

不知道翻译能力差别,还是老婆表达能力强,我发现交给白劳做同样的工作,老婆经常用的话比我少,是不是我也应该向女人学学怎么用隐喻高效表达想法?



Scala没有自己的虚拟机到底有没有问题,这是否会影响它作为一种语言的独立性和执行效率

首先,JVM虚拟机指Java虚拟机规范和遵从这个规范的实现。以下JVM专指后者。
1 Scala是一门独立的语言,是运行在JVM之上的。并且选择兼容java的庞大库。Java语言和JVM是分离的,只要是符合规范的二进制bytecode文件(class文件),JVM就能执行,而不管二进制的来源。也就是说,无论是Scala,Java,还是ruby,python,只要实现编译出二进制文件的编译器,就能在JVM上执行。理论上,除非有特殊标记,JVM是无法分辨二进制文件原来是什么语言编写的。
2 就执行效率而言,JVM 是运行时,当然取决于JVM的执行效率。而语言的影响,主要是Scala的新的语言特性带来的效率提升。而这种提升,我个人认为,在于提升程序员对代码的掌控力,更容易写出高效率的代码,比如Future特性,Filter特性,不可变型,函数式写法等等。

java虚拟机,以及CLR虚拟机跟其它的虚拟机有什么区别。因为我发现在这两个虚拟机上有很多其它语言的实现,比如JRuby, JPython, IronPython等等。但是像ruby, python这种语言又都有自己的虚拟机,但没听说在它们的虚拟机上又衍生出什么语言的。

当今语言的执行方式只要分三种

  1. 解释型
  2. 编译型
  3. 中间代码型(运行时型)

ruby等高级语言大多都是解释型,虽然简单灵活,但是效率敏感的项目会遇到问题。
编译型基本上是C/C++等语言,效率高但是不够灵活,比如跨平台,运行时调优,动态优化等等。
最靠谱的就是3,JVM是发扬光大的一个。几乎解决了上面所有的缺点的平衡方案。
楼主的提法混淆了语言和虚拟机,两者没有耦合性。而我认为,只有3的实现方式才能称得上是“虚拟机”。
你问为什么大家都用JVM,而不自己实现?因为JVM目前是非常优秀的运行时,并且开放,通用,使用JVM作为语言的扩展运行时是明智的选择。JVM除了oracle的实现,还有开源的实现,总之,JVM前途光明。

说点题外话,Scala相比Java强化了语法,加入非常具有前瞻性的语言特性,让程序员能更容易写出简洁高效优雅的代码,兼容Java庞大类库,使用JVM作为运行时。不得不说,非常值得期待。


  1. scala 编译器是把 .scala 编译成 bytecode 运行在 jvm 上,因此受限于 jvm,当然对scala 有极大的影响。从我个人观点来看 scala 更像是 java 语言上的一种更高层的封装,例如 scala 的 covariance 和 contravariance。

  2. jRuby 这些是希望在 ruby 的灵活性上能够使用 java 各种类库,且经过编译之后能获得性能上的提高,ruby 做 dsl 是很方便的。

【热门文章】
【热门文章】