节:字节码与多语言混合编程
Posted 李阿昀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节:字节码与多语言混合编程相关的知识,希望对你有一定的参考价值。
接下来,在这一讲我会给大家介绍两个概念,它们一个是字节码,一个是多语言混合编程。
字节码
关于字节码,我想大家应该对其是无比熟悉了,因为在Java虚拟机上解释运行的程序都得是基于字节码。
相信大家应该都知道一点,就是我们平时所说的Java字节码,指的都是用Java语言编译成的字节码,而Java虚拟机就是来解释运行这些Java字节码文件的。之前我们老是称呼Java字节码,可是以后就要换一换称谓了,即应将Java字节码统称为JVM字节码,原因无非就是因为Java虚拟机具有跨语言的平台的这样一个特征。
说到底还是那句话,只要其他编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,那么它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。
总之,Java虚拟机能够识别的不仅仅只是Java语言编译成的字节码,而且还能是其他语言编译成的字节码,所以这里我们统称为JVM字节码是没有任何毛病的。
接着,大家不妨再看一眼下面这张图。
看到上图中不同的编程语言各自的编译器没,这我们就可以称之为是编译器的前端,而编译器的后端则是指Java虚拟机架构中的解释器和JIT即时编译器,相信大家也都知道,Java虚拟机解释运行字节码文件就得用到它哥俩。
这里我为什么要突然提到编译器呢?这是因为在整个信息产业领域里面有三大技术难题,第一个是CPU,第二个是操作系统,第三个就是编译器。相信大家平时在媒体层面听的比较多的就是我们要有自己的CPU,我们要有自己的操作系统之类的口号了,其实编译器也是一大技术难题,只不过是现在很少有人去提它了。
多语言混合编程
正是基于Java虚拟机的跨语言的平台的这样一个特征,Java平台上的多语言混合编程现在正成为主流,而且这将会是一个越来越明显的趋势,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。
试想一下,在一个项目之中,并行处理用Clojure语言编写,展示层使用JRuby/Rails,中间层则是Java,应用层则根据不同的场景需求使用不同的编程语言来完成,是不是蛮符合通过特定领域的语言去解决特定领域的问题这样一个趋势啊!而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,相互之间调用各自的API就像调用自己语言的原生API一样方便,因为它们总归都是要经过编译生成相同规范的字节码文件的,于是,它们最终就可以运行在一个虚拟机之上了。
总之,不同语言之间是可以相互调用的,就像Java语言可以调用C语言一样,而且我们也看到了一种趋势,就是越来越多的编程语言都选择了使用JVM作为它们各自的一个解释运行的平台。
对这些运行于Java虚拟机之上、Java之外的语言,来自系统级的、底层的支持正在迅速增强,以JSR-292为核心的一系列项目和功能改进(如DaVinci Machine项目、Nashorn引擎、InvokeDynamic指令、java.lang.invoke包等),都推动着Java虚拟机从“Java语言的虚拟机”向“多语言虚拟机”的方向发展。
如何真正搞懂JVM?
上面我给大家讲了很多,但讲的这些都是一些理论性的知识,而要想真正搞明白JVM,仅仅只是懂这些理论性的知识肯定是远远不够的,我们还得要去实践才行。
这就像大家想真正搞懂如何去追一个女生一样,你学再多的理论,不去实践都是白扯,你只有去实践了,才算是与真理更进一步了。如果追你喜欢的女生没追到,那么你就该好好想一下别人为什么要拒绝你了,想明白之后再去学一点理论知识,然后再去追,等你真正追到手了,你才算真正搞懂如何去追一个女生了。
Java虚拟机是非常复杂的,要想真正理解它的工作原理,最好的方式就是自己动手编写一个!不知道大家有没有想过这个事,即自己动手编写一个Java虚拟机,嘻嘻😊,没想过就算了,我本人也没有自己动手写过。
那大家可能就要问了,自己动手编写一个Java虚拟机难不难呢?我的回答是可以说很难,也可以说不难,因为天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。简单点来说,就是会者不难,难者不会,这就像大家骑自行车一样,你已经会骑了,自然就觉得这事很简单,只须眼睛往前看,两脚往下蹬即可,想往哪边拐,手往哪边拧一下就行了,但这要是对于不会骑的人来说,那就是一件挺困难的事情了。
自己动手编写一个Java虚拟机,难与不难,主要就看你开发出来的用途是什么了。如果你想自己动手编写出来的Java虚拟机能够实现完整的虚拟机规范,甚至能够达到商用的性能和稳定性,那么就很难了,一个人是搞不定的;如果你没考虑到这些,而仅仅只是想了解一下Java虚拟机的底层工作原理,以及运行简单的程序就行,那么就不是很难了。
如果大家真有兴趣的话,那么不妨去看一下这本书,即自己动手写Java虚拟机。
该书作者是用Go语言来开发Java虚拟机的,里面代码我看了看,大概有1万多行,如果大家真要写的话,我想应该20天左右就可以搞定了。此外,该书作者也用了一个比较讨巧的做法,就是关于垃圾回收这块用的是Go语言的垃圾回收机制,这是因为Go语言本身就具有比较完整的垃圾回收机制。如果你要是用C语言来写的话,那么不难想象你肯定是会无比崩溃的,因为内存是直接完全暴露在你面前了,你得需要自己去管理内存,并进行垃圾回收。
以上是关于节:字节码与多语言混合编程的主要内容,如果未能解决你的问题,请参考以下文章