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的跨平台原理

和java一样,针对每一种OS平台,QT都有一套对应的底层类库,而接口是完全一致的。
因此只要是在QT库上开发的程序,放在任何一种平台下都可以编译运行(前提条件是:程序中没有使用某OS特有的机能,需要先在平台上安装qt)。也就是说在OS和应用层之间,增加了一个平台层来保证可移植性。

Qt跨平台是指 代码跨平台而不是编译出来的文件跨平台(区别于java的jar包),同一份代码需要放到另一个平台上时,需要重新编译。

这是我个人的见解和采纳别人的总结的,希望各位补充,不管是实际开发还是面试中都会有帮助的。

Original: https://www.cnblogs.com/xupeidong/p/12291484.html
Author: 徐沛东
Title: QT和Java的跨平台

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606962/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL之视图、触发器、事务、索引及其他知识补充

    一、视图 视图是将SQL语句的查询结果当做虚拟表实体化保存起来,以后可以反复使用 create view teacher2course as select * from teach…

    Linux 2023年6月14日
    096
  • powershell遇到错误即推出的方法

    $ErrorActionPreference = “Stop”; $tcpClient = new-object Net.Sockets.TcpClient…

    Linux 2023年5月28日
    089
  • VMware ESXi 7.0 U2 SLIC 2.6 & Unlocker 集成 Intel NUC 网卡、USB 网卡和 NVMe 驱动

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    098
  • Redis入门讲解(介绍、安装、常用命令)

    Redis入门讲解(介绍、安装、常用命令) Redis是非关系型数据库 关系型数据库 关系型数据库是采用了关系模型来组织数据的数据库,以行和列的形式存储数据,由二维表及其之间的关系…

    Linux 2023年6月6日
    0108
  • C语言实现扫雷游戏(完整版)

    头文件定义、函数声明 下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现 宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面…

    Linux 2023年6月6日
    0137
  • 程序员要知道的22个学习网站

    点击标题即可直达链接网址 GitHub是一个面向开源及私有软件项目的托管以及在线软件开发平台,用于存储、跟踪和协作软件项目,开发者能够上传自己的代码文件,并与其他开发者在开源项目上…

    Linux 2023年6月6日
    095
  • Java学生管理系统(详解)

    下面会分享我在做这个练习时的一些方法以及程序代码 供大家参考(最后附上完整的项目代码)。 首本人只是个初学Java的小白,可能项目中有许多地方使用不规范的以及代码的格式问题会引起各…

    Linux 2023年6月6日
    088
  • Go-channel

    (1)channel本质就是一个数据结构——队列 (2)数据先进先出 (3)线程安全,多goroutine访问时,不需要加锁,channel本身就是线程安全的 (4)channel…

    Linux 2023年6月8日
    0105
  • python reportlab 生成table学习笔记

    利用python report生成table表格,需要定义表格的数据,表格的样式,最后利用doc.build方法生成文件。 在reportlab中文手册中描述table方法: Ta…

    Linux 2023年6月14日
    091
  • std::map自定义类型key

    故事背景:最近的需求需要把一个结构体struct作为map的key,时间time作为value,定义:std::map 技术调研:众所周知,map是STL库中常用的关联式容器,底层…

    Linux 2023年6月13日
    0127
  • Linux下IPC之共享内存的使用方法

    基本参考 《Unix环境高级编程》 第14.9节共享内存来学习。 需要说明的 讲shmget(key,size, flag)函数时,书上大概意识是说, 想访问已有的shm时,key…

    Linux 2023年6月7日
    079
  • Jenkins+svn自动化部署完整教程

    1、概述 Jenkins 是一个可扩展的持续集成引擎。主要用于持续、自动地构建/测试软件项目、监控一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的se…

    Linux 2023年6月7日
    094
  • [ Shell ] 通过 Shell 脚本导出 GDSII/OASIS 文件

    常见的集成电路版图数据库文件格式有 GDSII 和 OASIS,virtuoso 提供了下面两个工具,可以用来通过命令行导出版图数据。 strmout (导出为 GDSII 格式)…

    Linux 2023年6月7日
    0130
  • X86 assembly guide

    This guide describes the basics of 32-bit x86 assembly language programming, covering a sm…

    Linux 2023年6月7日
    0142
  • 异常—异常安全问题–内存泄漏动图演示

    异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的 直接或间接的调用者处理这个错误。 throw: 当问题出现时,程序会抛出一个异常。这是通过使用…

    Linux 2023年6月13日
    090
  • MyCAT实现MySQL读写分离

    用户连接到MySQL的中间件(代理),中间件接收用户的访问转发给后端的mysql数据库。 是MySQL的一个中间件软件,Mycat是一个开源的分布式数据库系统,是一个实现了MySQ…

    Linux 2023年6月7日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球