备注

2026/03/31 星期二
最近看到鸿蒙6采用了ArkTS作为开发语言有了一些关于系统和编程语言的思考记录一下。

一、问题

移动操作系统(Android、iOS、鸿蒙等)都只支持特定编程语言(Java/Kotlin、Swift/Objective-C、ArkTS)开发程序,而桌面操作系统(Windows、Linux、MacOS等)都支出多种编程语言(C/C++、Java、Python、GO等),并且桌面系统还能够不断出现新的编程语言。

二、思考

这个现象是技术架构、商业策略、历史演变和应用场景等多重因素共同作用的结果,是系统平台为了性能、体验、安全和生态,做出的一种战略选择。

1.架构与运行环境差异

移动端的“沙盒”与“虚拟机”:

  • Android: 应用主要运行在Dalvik虚拟机(旧版)或ART(Android Runtime)环境中。虽然ART支持将Java/Kotlin代码编译成机器码,但整个应用生命周期、内存管理、UI渲染都深度依赖于Android框架和SDK。虽然可以通过NDK(Native Development Kit)使用C/C++开发高性能模块,但应用的主体框架和UI仍然需要用Java/Kotlin来构建,以与系统交互。
  • iOS: 应用被直接编译成ARM架构的机器码运行。iOS系统对应用的运行环境有极强的控制力,从内存管理到UI渲染都有一套严格的规范。Swift和Objective-C能够与底层的Cocoa Touch框架无缝集成,这是其他语言难以替代的。
  • 鸿蒙 (HarmonyOS): 采用了更先进的分布式架构,但其应用开发同样深度依赖于其框架。主要语言ArkTS(基于TypeScript)被设计用来高效地与鸿蒙的声明式UI框架(ArkUI)和分布式软总线协同工作,以实现跨设备流转的核心特性。

桌面端的“开放”与“原生”:

  • 桌面操作系统(Windows, macOS, Linux)的内核(如Windows NT, XNU, Linux Kernel)提供了非常稳定和标准化的系统调用接口(API)。只要一种编程语言能够编译成目标架构(x86, ARM)的机器码,并能调用这些系统API,它就可以在桌面系统上运行。
    桌面应用的运行环境更加“原生”,没有像移动端那样强制的虚拟机或中间层。这使得C++, C#, Java, Python, Go, Rust等各种语言都能相对容易地找到与操作系统交互的方式。

2. 性能、资源与硬件限制

移动设备的资源敏感性: 手机、平板等移动设备的电池、内存(RAM)和CPU性能都非常宝贵。
原生语言的优势: Swift、Kotlin、C++等“官方”语言允许开发者进行精细的内存管理和硬件访问,能够最大限度地压榨硬件性能,实现流畅的60/120fps渲染和快速响应,同时优化功耗。
跨平台/解释型语言的劣势: 像Python、JavaScript等语言通常需要解释器或虚拟机,会带来额外的性能开销和内存消耗。在资源受限的移动设备上,这可能导致应用卡顿、发热、耗电快,影响用户体验。
桌面设备的资源冗余: 桌面电脑和笔记本拥有更强大的CPU、大容量内存和持续的电源供应。因此,为了开发效率而牺牲一部分运行性能(例如使用Python、Java等)是完全可以接受的。性能不再是唯一的瓶颈,开发效率和生态丰富度变得更重要。

3. 商业策略与生态系统控制

这是最关键的非技术因素。

构建“护城河”与保证体验:
苹果 (iOS): 苹果通过强制使用Swift/Objective-C和Xcode开发工具,建立了一个高度封闭和可控的生态。这确保了所有上架App Store的应用都遵循其设计规范(Human Interface Guidelines),拥有一致的用户体验和高水平的安全性。这既是质量保证,也是强大的竞争壁垒,让用户“离不开”iOS的优质应用生态。
谷歌 (Android): 虽然Android更开放,允许通过NDK使用C++,甚至有GraalVM等技术让Java运行在iOS上,但谷歌依然强力推行Kotlin和Java作为“一等公民”。这是为了维护其生态系统的统一性,确保绝大多数应用都能在各种安卓设备上获得良好兼容性和性能。
华为 (鸿蒙): 鸿蒙系统从设计之初就强调“原生体验”和“分布式能力”。通过推广ArkTS等专用语言,华为旨在引导开发者充分利用鸿蒙的独特优势(如一次开发,多端部署),从而构建一个区别于Android和iOS的、更具竞争力的新生态。
降低维护成本与碎片化风险:
移动设备型号繁多,硬件配置、屏幕尺寸差异巨大。如果允许使用各种语言开发,平台方需要为每种语言的运行时环境(Runtime)提供支持、优化和安全补丁,这将是巨大的工程负担。
通过聚焦少数几种“官方”语言,平台方可以集中资源进行深度优化,并为开发者提供强大的工具链(如Android Studio, Xcode, DevEco Studio),降低开发和维护成本。

4. 历史演变与开发者生态

桌面端的悠久历史: Windows和Linux/Unix已经发展了数十年,积累了海量的用C/C++编写的底层库和应用。Java、Python、C#等语言也在桌面端有深厚的根基。这种历史惯性使得桌面系统天然支持多种语言。
移动端的“新大陆”: 智能手机时代只有十几年历史。Android和iOS在诞生之初就选择了当时最适合的语言(Java/Objective-C),并围绕它们建立了庞大的开发者社区、文档、库和框架。后来者(如鸿蒙)为了快速吸引开发者,也必须提供一套成熟且有吸引力的语言和工具链。

三、技术分析

虽然从表面看,桌面和移动系统的编程语言编译原理都遵循“高级语言 -> 机器码”的基本路径,但是编译原理的实现方式、技术侧重点和最终形态有着显著的不同。

1.桌面系统

桌面系统的编译环境具有资源丰富、架构开放、追求极致性能的特点。其编译原理更侧重于如何利用强大的硬件(多核CPU、大内存)生成最高效的机器码。桌面系统的编译流程分为两类:提前编译(Ahead-of-Time, AOT)和即时编译(Just-In-Time, JIT)。提前编译模式在程序运行前一次性将所有源代码完整编译成目标平台的机器码;即时编译模式在程序运行过程中,一边运行一边编译。一开始可能是解释执行,当发现某段代码被频繁调用(热点代码)时,才把它编译成机器码并缓存起来,下次直接用机器码运行。

  1. 核心编译流程(经典AOT编译)
    桌面应用的编译通常采用提前编译(Ahead-of-Time, AOT)模式,即在程序运行前,将所有源代码一次性完整编译成目标平台的机器码。这个过程非常经典,主要包括以下阶段:

预处理 (Preprocessing):处理宏定义(#define)、文件包含(#include)、条件编译(#if)等,生成纯净的源代码文件。
编译 (Compilation):这是核心阶段,分为:
词法分析:将代码字符串分解为一个个有意义的“词法单元”(Token),如关键字int、标识符myVar、运算符+。
语法分析:根据语言的语法规则,将Token流构建成一棵“抽象语法树”(AST),检查语法结构是否正确(如括号是否匹配)。
语义分析:检查程序的逻辑含义,如类型是否匹配(不能将字符串赋给整型变量)、变量是否已声明。
中间代码生成 (IR):将AST转换成一种与硬件无关的中间表示(如LLVM IR),这是现代编译器的关键,便于优化和跨平台。
优化 (Optimization):在中间代码层面进行大量优化,如删除冗余代码、循环展开、函数内联、指令重排等,以最大化程序运行速度。
目标代码生成 (Code Generation):将优化后的中间代码转换成特定CPU架构(x86, ARM)的机器指令(汇编),并进行寄存器分配、指令调度等底层优化。
汇编 (Assembly):将汇编代码转换成二进制的目标文件(.o或.obj)。
链接 (Linking):将多个目标文件和所需的库文件(如.lib, .so, .a)“链接”在一起,解析符号引用,生成最终的可执行文件(.exe, .app, 或无后缀的ELF文件)。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐