桌面应用的多种跨平台方式跨平台桌面应用开发

众所周知,个人PC安装的操作系统主要有三种:Windows、MacOS、Linux(像Chrome OS这种小众的就不计较了),国产操作系统例如UOS、Deepin、优麒麟等大多是基于Linux定制开发的系统。随着国产化替代的推进以及Mac电脑在开发设计领域逐渐受到欢迎,Windows的老大哥地位越来越不稳固,考虑到完善生态是各家面向大众推广的重要一环,跨平台开发应用便是其行之有效的手段。下面列举三种跨平台的方式。

「没有最好,只有最适合。」

虚拟机(代表JVM、CoreCLR)

Java Virtual Machine

JVM是Java应用运行所依赖的虚拟机,Java宣称的“write once, run anywhere”就是靠JVM实现。得益于Linux服务器的高市场占有率,众多的Java Web应用被开发出来通过JVM运行在Linux服务器之上,也因此Java程序员的比例非常高,就业最容易。常见的场景是,Java开发人员在个人电脑(大多是Windows系统)上编程,然后打包部署到Linux服务器。可能是因为Java的前端框架SWT、Swing等上手不太容易,GUI界面不够美观,所以Java桌面应用是比较少的,虽然也有例如Eclipse这样的明星级应用。

CoreCLR是微软.NET框架的虚拟机,也就是说C#程序依赖它来运行。微软一开始的跨平台框架叫做.NET Core,后来与.NET Framework大一统发布了.NET 5,2021年发布了.NET 6。名字确实更简洁了,但微软随意命名的作风一直被人诟病,希望以后不要再改了,像Java一样几十年如一日,现在已经持续发展到Java17了。

值得一提的是,.NET有一个开源版本Mono也是跨平台的,Mono最初由Xamarin公司(前身是Novell公司)开发,2016年被微软收购。著名的游戏引擎Unity就运行在Mono之上,但是Mono整体上不如.NET强大,C#的很多新特性在.NET上支持得更好,Unity也有意迁移,替换掉Mono。

交叉编译(代表Qt、Flutter)

Flutter

Qt可谓是跨平台的佼佼者,综合考量界面统一美观、稳定性、性能等,Qt是当前桌面跨平台应用开发的不二之选。Qt通过封装底层操作系统API,交叉编译后生成对应平台的动态链接库(.dll或.so)和静态链接库(.lib或.a),然后打包时将这些库放入安装包内,所以Qt应用的安装包会稍微有点大。

2017年谷歌推出的Flutter也是交叉编译,只不过UI层是通过Skia图像渲染引擎进行自绘渲染,3D方面甚至可通过OpenGL、DirectX等使用到硬件加速功能,界面效果更加炫酷。Flutter开发使用的是Dart语言,提到Dart又一个小插曲,就是来自于Mozilla的Rust语言,Rust没有GC,防内存泄漏方面却远胜于其他语言,也易上手学习;与Dart相比之下,网络上有人提议为什么不用Rust将Flutter重写,这种提议得到了很多人响应,Flutter+Rust组合确实看起来很美好。Rust其实也可以跨平台,它有一个框架叫Tauri,有兴趣的条友可自行研究下。

交叉编译是一种很靠谱的方式,但开发环境的搭建往往异常复杂,使用到的开发工具种类多且体积大,总体来说对开发人员的要求较高。

脚本语言执行环境(代表NodeJS、Python)

NodeJS的出现掀起了前端领域的腥风血雨,使JavaScript真正成为了全栈语言,因为NodeJS让JavaScript不仅仅只运行在浏览器中,还可以让它具备访问操作系统API的能力,做很多浏览器不能做的事情。Electron框架就打包了NodeJS作为运行时环境,以及Chromium浏览器内核,这样极大降低了Web应用改造成桌面应用的成本,微软开发VSCode就是一个强大的Electron跨平台应用,有在线和本地两种形态。但是,微软似乎对Electron仍不太满意,发布的新版Edge浏览器,使用了一种webview2控件,webview2有独立和嵌入式两种版本,感觉独立版本可以当作JS虚拟机安装到各家操作系统上,以后JS跨平台应用就不用再将Chromium和NodeJS打包进自身安装包内了,这样就大大降低了安装包的体积。

除了Electron,React Native也是JS跨平台阵营的一员大将,尤其是2019年微软推出了React Native for Windows,更是让React Native在PC端也可以大放异彩。微软真是跨平台领域的模范生,到处都可见它的身影,危机感很浓烈呀……

Python的GUI框架也有很多种,内置的有tkinter,其他框架有wxPython、PyQt5等,但是Python的桌面应用做着玩,做些小应用什么的还可以,大型应用从兼容性、稳定性等方面考虑,不建议使用Python。

脚本语言是边解释边执行,这是一把双刃剑,虽然开发速度快,但是对内存等计算机资源的占用却比较高,Election应用太耗内存这是不争的事实,这跟浏览器打开太多页签会占用过多内存导致卡顿是一样的道理。

总结一下,虚拟机是服务端常用的方式,现代虚拟机也已优化的足够好了,在桌面领域跨平台,Qt是一种潜意识中比较靠谱的方式,如果开发团队实力没问题,Qt往往是首选的方式;Electron是当前比较流行的方式,有很多成功的范例;但是,我个人倾向于webview2这种方式,因为WebAssembly、WebGL这些技术的发展使得Web应用和原生应用的差距越来越小,再加之Web渲染器也能呈现比较美观的界面,开发难度也小,未来与Flutter一较高下也未尝不可。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注