导读:虚拟机相当于应用程序在不同运行环境中的翻译。
说起谷歌安卓系统的“虚拟机”,很多人爱拿它和苹果iOS做比较,结果,安卓的很多短腿儿都让虚拟机背了锅,比如安卓手机运存容量是iPhone的两到三倍,流畅度却没有脱胎换骨的变化,有时还被iOS摁在地上摩擦,然后很多人将其归结为虚拟机拖了后腿儿。
虚拟机表示:为安卓流畅度背这口锅,也是为了广大程序员的饭碗着想!
解开这个梗,先要搞懂什么是虚拟机,以及虚拟机有什么用。
简单说,虚拟机是一种消除计算机硬件差异的机制,它可以提供一种稳定的运行环境,让相同的应用程序在不同的操作系统和硬件上运行。
说到应用程序的运行环境,需要展开一下。
应用程序的运行环境=操作系统+硬件,其中硬件是起主要作用。原因不复杂,特定指令集的CPU只能解释其固有的机器语言,不同的CPU能解释的机器语言(本地代码)自然不同,英特尔的CPU和ARM的CPU能解释得机器语言是不同的。这好比不会英文的人听不懂英语,反之亦然。
怎么才能让不会英文的人听懂英语?找英语翻译可以办到。
虚拟机就相当于应用程序在不同运行环境中的翻译。比如著名的虚拟机软件“Virtual PC for Mac”,它由微软出品,有了它,苹果的Macintosh用户也能在Mac操作系统上运行Windows应用了,把苹果电脑用出PC的感觉。
不过,到2006年时,微软停止了对“Virtual PC for Mac”的开发,因为苹果电脑换“芯”了,从PwoerPC换成英特尔的CPU,和Windows应用程序的运行环境相同,所以现在苹果电脑不借助虚拟机软件也能运行Windows及其应用程序。
安卓也有自己的虚拟机,它叫Java虚拟机,简称JavaVM(Java Virtual Machine)。
Java虚拟机有多种版本,有用于Windows的虚拟机,有用于Macintosh(现为MacOS)的虚拟机,也有用于移动设备的虚拟机,比如安卓系统的Java虚拟机。
不同的Java虚拟机对应不同的操作系统和CPU,好处是程序员不用关注操作系统和CPU的差异,只要是用Java语言写成的源代码,就可以在所有具有Java虚拟机的操作系统上运行。
Java虚拟机的运行过程是,Java编译器先将应用程序源代码转换成字节代码,再由Java虚拟机将字节代码转换成适用于相应CPU的机器语言,由其执行。
如果感到上面这段话比较晦涩难懂,记住这个结论也行:Java虚拟机是个称职好用的翻译,可以让不同的CPU看懂Java语言编写的应用程序。
虚拟机还有一个好处,就是写应用程序和操作系统的编程语言可以风马牛不相及。
iOS和安卓操作系统的源代码都是用C语言写成,由于C语言是较早出现的高级编程语言,入门门槛较高,而安卓应用程序是用Java编程,是一种更高级的编程语言(iOS的应用程序编写语言是swift),入门门槛较低。
Java之父詹姆斯·高斯林 (James Goslin
显然,Java的低门槛可以吸引大量人员进入应用程序编程行业,方便迅速建立生态。实际上这也是Java得以流行的原因。
不过,虚拟机也不是没有短板,最大的短腿儿就是,代码转来转去,会拖慢程序运行,特别吃硬件资源。这个胎里带的毛病,是安卓手机流畅度不及iPhone的原因之一,在绝大部分虚拟机上都能反映出来。
反过来想想,如果没有虚拟机的话,该怎么办?只能开发不同版本的应用程序,比如Mac版、iOS版、Linux版、安卓版和Windows版。对应用开发商来说,如此多的版本会增加开发成本和维护成本,结果就是一些小众的硬件很难建立起丰富的软件生态。
当然,对数以十万计的安卓应用开发程序员来说,没有Java虚拟机的话,就意味自己的Java武功被废,饭碗被砸了,要么改行,要么学C语言这么武功。这比开发多版本程序还让人着急。