大家基本上都知道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和應用層之間,增加了一個平台層來保證可移植性。