QT和Java的跨平台
大家基本上都知道QT是跨平台的,Java也是跨平台的,那咱们今天就来聊聊他们两个:
相同点:都是跨平台
不同点:Java 的运行是建立在虚拟机上的,在虚拟机上 一次编译到处运行,但虚拟机是平台各异的,执行代码格式统一。
Qt 程序的运行是建立在 Qt Framework上的,一次编码到处编译,但Framework是平台各异的,编程接口统一。
详细介绍:
java也是跨平台的。但是从实现技术角度来看,它比Qt简单。java是把针对不同平台与操作系统的跨系统核心代码抽象出来,形成单独的JVM层(java virtual machine),也就是大家熟知的java虚拟机。java代码运行在JVM上,把跨平台java语言框架问题分解为在不同平台上设计JVM的问题,结构简单、逻辑清晰、易于实现(我自己,觉得就像c语言里的switch-case结构,linux结构则如何,windows则如何)。java语言设计本身不受平台的任何限制,可集中精力设计出受人欢迎的程序设计语言。只要针对不同大类的平台开发相应的JVM,代码就可以跨平台实现。
当然,java也为此付出了运行效率的代价。因为一般程序直接通过操作系统由CPU执行,而java语言需要先通过JVM再映射到操作系统里,最后由CPU执行,执行过程多了一步。早期由于java语言主要使用解释性编译器,从而导致运行效率进一步降低。但是随着即时编译技术(JIT)的推出,尤其是硬件计算速度的大幅提升,java运行效率问题得以解决。
Qt平台并没有使用类似JVM的明显抽象层(但是原理类似,它底层封装了针对不同平台的类库,API之类的,只是这些都被上层做了封装,对开发者来说操作各种平台的接口都是一样的),因此在框架开发过程中处理各种平台问题的复杂性要超过java。
跨平台程序设计的难点在于兼容不同平台的进度调度、消息管理和文件处理等操作系统内核模块。按常规理解,如果开发一个跨平台程序设计框架,则需要抽象出所有支撑平台核心模块的原理和特色,然后针对每个所提供的功能API分别实现,工作量大增。Qt就采用了这种方式,为不同用户针对不同平台的开发提供了所对应的程序包(难怪会有针对不同操作系统的Qt包),而且Qt针对核心模块进行了简易化抽象处理,以较小的代价兼容所有平台。
以消息管理为例,Windows消息管理大致分为时间函数产生消息、消息传递到目标事件函数、目标函数处理消息3个步骤。但Qt处理消息管理采用了信号/槽机制,将传统的3步操作缩减到2步,通过connect函数将事件产生函数(信号)直接连接到目标事件处理函数(槽)。事件处理简单有效,易于实现兼容各种版本的操作系统。
QT的跨平台原理:
因此只要是在QT库上开发的程序,放在任何一种平台下都可以编译运行(前提条件是:程序中没有使用某OS特有的机能,需要先在平台上安装qt)。也就是说在OS和应用层之间,增加了一个平台层来保证可移植性。