华为:2025年鸿蒙编程语言白皮书
2.09 MB
65 页
0 下载
32 浏览
0 评论
0 收藏
| 语言 | 格式 | 评分 |
|---|---|---|
中文(简体) | .pdf | 3 |
| 概览 | ||
鸿蒙编程语言白皮书 文档版本 发布日期 V1.0 2025-06-20 2 版权所有 © 华为终端有限公司 2025。保留一切权利。 本材料所载内容受著作权法的保护,著作权由华为公司或其许可人拥有,但注明引用其他方 的内容除外。未经华为公司或其许可人事先书面许可,任何人不得将本材料中的任何内容以 任何方式进行复制、经销、翻印、播放、以超级链路连接或传送、存储于信息检索系统或者 其他任何商业目的的使用。 商标声明 华为,以上为华为公司的商标(非详尽清单),未经华为公司书面事先明示许可,任何第三 方不得以任何形式使用。 注意 华为会不定期对本文档的内容进行更新。 本文档仅作为使用指导,文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。 华为终端有限公司 地址: 广东省东莞市松山湖园区新城路 2 号 网址: https://consumer.huawei.com 3 1)高效开发 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · O1 鸿蒙编程语言整体框架 18 CONTENT 鸿蒙编程语言适用场景 1)ArkTS 概述· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 6 2)仓颉概述· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 3)C/C++概述· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4)语言互操作介绍· · · · · · · · · · · · · · · · · · · · · · · · · · · · O2 3)安全 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4)跨平台· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 5)技术资产保护 · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 7 8 9 25 43 47 48 2)高性能· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · 4 O3 鸿蒙编程语言演进策略 1)语言演进整体策略· · · · · · · · · · · · · · · · · · · · · · · · · 2)智能化演进策略 · · · · · · · · · · · · · · · · · · · · · · · · · · 3)未来一年语言演进策略· · · · · · · · · · · · · · · · · · · · · 54 56 58 5 1 第一章:鸿蒙编程语言整体框架 鸿蒙是多语言生态,ArkTS、仓颉和 C/C++充分互补。ArkTS 是动态类型编 程语言,主打易学易用、生态丰富、极简开发、持续创新四大特征;仓颉是静 态类型编程语言,主打高性能、强安全、跨平台、智能化等特性。为满足不同 业务场景诉求及不同开发者编程习惯,两者长期协同发展和长期演进,并保持 生态兼容。ArkTS和仓颉均通过垃圾回收机制自动管理内存,C/C++支持Native 开发,需开发者手动管理内存,三种语言相互配合,共同支撑鸿蒙应用生态构 建。 图 1-1:鸿蒙 APP 架构示意图 6 ArkTS 概述 ArkTS 是鸿蒙应用开发高级语言。 ArkTS 基于 TypeScript(简称 TS),保持了 TS 的基本语法和风格,同时通 过引入静态类型校验模式和类型推断增强规则,强化开发期静态检查和分析能 力,提升代码健壮性,并实现更好的程序执行稳定性和性能。ArkTS 同时也支 持与 TS/JavaScript(简称 JS)高效互操作,可以完全复用 TS/JS 生态,已广泛 应用于鸿蒙应用生态。 在标准 TS 的基础上,ArkTS 结合鸿蒙应用开发的诉求进行了创新和能力扩 展,主要新增四大特性如下: 并发编程模型:ArkTS 新增提供 TaskPool 和 Worker 两种并发编程 API 供开发者使用。同时,ArkTS 进一步提出了 Sendable 对象模型的机制 来支持对象在并发任务间的引用传递,极大提升 ArkTS 对象在并发实 例间的通信性能。 声明式语法:ArkTS 结合 ArkUI 提供声明式 UI 描述、状态管理、渲染 控制等强大的 UI 开发能力,拥有简洁且富有表达力的语法,通过简洁 的语法和实时预览功能,大大提高了 UI 开发的效率,使得代码更易于 编写和阅读。 强大的标准库:ArkTS 拥有一个功能丰富的标准库,涵盖了从数据结 构、算法到输入输出等方方面面,例如:高精度浮点运算、二进制 Buffer、XML 生成解析转换和多种容器库等丰富的操作方法,帮助开 发者简化开发工作,提升开发效率。 模块化管理:ArkTS 支持应用模块化开发、编译、打包和运行,例如: 应用模块化按需加载能力,方便大型复杂应用的多模块业务场景,高 性能启动运行,提高了代码的模块化管理和重用性。 7 方舟编译运行时(ArkCompiler)支持 ArkTS、TS、JS 的编译运行,目前 它主要分为 ArkTS 编译工具链和 ArkTS 运行时两部分。其中 ArkTS 编译工具链 负责在开发侧将高级语言编译为方舟字节码文件(*.abc),而 ArkTS 运行时则 负责在设备侧运行字节码文件执行程序逻辑。 ArkTS 会结合鸿蒙应用开发的需求持续创新,平滑演进。进一步丰富并发 编程、完善类型系统、现代化语法等显著改进和新特性,使开发者能够更快速 地构建稳定且性能优越的应用。 仓颉概述 仓颉是鸿蒙应用开发高级语言。 仓颉作为一款面向鸿蒙应用开发的现代编程语言,是一款静态类型、静态 编译的编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、 以及开箱即用的 DevEco Studio 工具链支持,为鸿蒙应用开发者打造友好开发 体验和卓越程序性能。其具体特性表现为: 高性能:仓颉基于静态类型和静态编译优化技术,具有“编译前端+编 译后端+运行时”的全栈垂直优化能力,为鸿蒙应用提供卓越的性能支 持。仓颉采用内存共享的并发模型,提供轻量用户态线程和易用的无 锁并发数据结构让并发编程变得轻松高效;提供了低时延高效率的自 动内存管理,支持鸿蒙应用以更高帧率、更少内存流畅运行,从而降 低设备功耗,延长续航。仓颉运行时采用轻量化设计,使仓颉应用具 有较低的基础开销。通过仓颉包按需动态加载技术,仓颉应用启动/运 行占用资源更少。 8 强安全:仓颉通过静态类型系统和自动内存管理,确保程序内存安全; 同时,仓颉提供多种编译时和运行时检查,包括数组下标越界检查、 类型转换检查、数值计算溢出检查、以及字符串编码合法性检查等, 能够及时发现程序运行中的错误。 跨平台:仓颉支持基于静态编译至机器码的跨 OS 平台执行能力,允 许开发者实现“同构开发、异构运行”的跨 OS 平台代码共享,支持 OpenHarmony、Android、iOS、Windows、Linux、MacOS 等 OS 平台。 智能化:仓颉通过元编程扩展出面向 LLM 智能体编程的 Agent DSL, 该语言提供多种特性有效简化 Agent 编写复杂度,包括 Agent 声明式 配置、提示词模式、多 Agent 协同、多轮对话等;同时,该语言兼容 MCP 生态,能够让开发者快速开发智能体应用。 C/C++概述 鸿蒙应用开发全面支持 C/C++语言开发能力,为开发者提供开发套件 (NDK)及配套工具链。基于 C/C++实现的功能模块,可通过跨语言互操作封装 为 ArkTS 和仓颉扩展模块,提供给 ArkTS 和仓颉高效使用。 C/C++在应用开发中的适用场景 高性能计算场景:游戏引擎、物理仿真等计算密集型任务。 硬件加速场景:需要深度优化 CPU 指令集的专用算法库。 生态复用场景:复用存量代码。 9 C/C++支持组件 为构建符合鸿蒙技术标准的应用开发能力,提供了一套完整的 C/C++开发 组件体系,具体包括: NDK(Native Development Kit):作为鸿蒙应用开发的核心工具套 件,NDK 对外发布提供完整的编译工具链、系统 C API 接口、C++运 行时环境支持。 libc 标准运行时库:基于开源 MUSL 库作优化,鸿蒙系统实现了标准 C 语言运行时支持、功能扩展、系统级性能的提升。 标准 C++运行时库:采用 LLVM 项目的 libc++作为基础,提供完整的 C++标准库实现,支持 C++11、C++14、C++17 和 C++20 标准。 编译工具链:选用毕昇编译器作为官方指定的 C/C++编译器,确保符 合最新语言标准规范、支持特有的编译优化、提供稳定的工具链支持。 这套组件体系共同构成了鸿蒙系统对开发能力的完整支持,为开发者 提供了高效、稳定的 C/C++开发环境。 语言互操作介绍 ArkTS 与 C/C++互操作 为了更好复用 TS/JS 的生态,ArkTS 语言提供 Node-API 的兼容实现,提供 ArkTS 与 C/C++的跨语言操作;Node-API 是基于 Node.js 12.x 的 Node-API 规 范扩展开发的机制,为开发者提供了 ArkTS 与 C/C++模块之间的交互能力。它 提供了一组稳定的、跨平台的 API,可以在不同的操作系统上使用。 涉及到互操作的主要场景如下: 10 系统可以将框架层丰富的模块功能通过 ArkTS 接口开放给上层应用。 应用开发者也可以选择将一些对性能、底层系统调用有要求的核心功 能用 C/C++封装实现,再通过 ArkTS 接口使用,提高应用本身的执行 效率。 Node-API 的组成架构 图 1-2:Node-API 的组成架构 Native Module:开发者使用 Node-API 开发的模块,用于在 ArkTS 侧 导入使用。 Node-API:实现 ArkTS 与 C/C++交互的逻辑。 ModuleManager:Native 模块管理,包括加载、查找等。 ScopeManager:管理 napi_value 的生命周期。 ReferenceManager:管理 napi_ref 的生命周期。 NativeEngine:ArkTS 引擎抽象层,统一 ArkTS 引擎在 Node-API 层 的接口行为。 11 ArkCompiler ArkTS Runtime:ArkTS 运行时。 Node-API 的关键交互流程 图 1-3:Node-API 的关键交互流程 ArkTS 和 C++之间的交互流程,主要分为以下两步: 初始化阶段:当 ArkTS 侧在 import 一个 Native 模块时,ArkTS 引擎 会调用 ModuleManager 加载模块对应的 so 及其依赖。首次加载时会 触发模块的注册,将模块定义的方法属性挂载到 exports 对象上并返 回该对象; 调用阶段:当 ArkTS 侧通过上述 import 返回的对象调用方法时, ArkTS 引擎会找到并调用对应的 C/C++方法。 仓颉与 C/C++互操作 仓颉支持与 C 互操作,即支持仓颉函数与 C 语言函数的互相调用以及跨语 言数据转换。对于 C++ 代码,开发者首先需要把 C++ 接口封装成 C 接口,再由 仓颉通过互操作调用。 12 仓颉与 C 互操作机制考虑兼顾互操作语法的简洁性,以及低互操作开销, 主要提供以下能力: 声明式接口描述:支持 @C 注解和 foreign 关键字,允许在仓颉代码 中声明被调用的 C 函数接口; 低互操作开销:在仓颉侧使用 @C 和 foreign 标注的结构体和函数, 其实现与 C 在二进制层面保持兼容;提供 inout 关键字,可将仓颉栈 上的变量引用传递到 C 侧,减少跨语言拷贝;提供 @FastNative 注解 标注 foreign 函数,减少调用被标注函数的运行时开销;支持将仓颉 Array<T> 中数据的原始指针实例传递到 C 侧访问,避免大块内存拷贝; 以上特性合理使用,可帮助开发者降低跨语言开销。 以下是一个示例,假设 C 侧有如下函数,会被仓颉代码调用: 1. #include <math.h> 2. 3. typedef struct { 4. double x; 5. double y; 6. } Point; 7. 8. Point rotate(Point input, double t) { 9. Point output; 10. output.x = input.x * cos(t) - input.y * sin(t); 11. output.y = input.x * sin(t) + input.y * cos(t); 12. return output; 13. } 对应的,仓颉侧可以通过编写如下代码来调用该 C 函数: 1. @C 2. struct Point { // 用仓颉结构体语法声明 C 结构体 3. Point(var x: Float64, var y: Float64) {} 4. } 5. 13 6. // 用仓颉函数语法声明 C 函数 7. @FastNative 8. foreign func rotate(point: Point, alpha: Float64): Point 9. 10. func callInterop(x: Float64, y: Float64, alpha: Float64): Unit { 11. // 引用 C 侧类型和函数时,就像在引用仓颉程序中的元素 12. unsafe { 13. let input = Point(x, y) 14. let output = rotate(input, alpha) 15. println("${output.x}, ${output.y}") 16. } 17. } 18. 19. 20. Point rotate(Point input, double t) { 21. Point output; 22. output.x = input.x * cos(t) - input.y * sin(t); 23. output.y = input.x * sin(t) + input.y * cos(t); 24. return output; 25. } 其中: 通过 @C 注解和 foreign 关键字声明对应的 C 结构体和函数,然后在 仓颉代码中调用相关函数; 由于与 C 语言的互操作过程中,会引入了 C 的许多不安全因素,因此 在仓颉中使用 unsafe 关键字,用于对跨 C 调用的不安全行为进行标 识; 同时例子中使用 @FastNative 注解来标注 rotate 函数,实际调用中运 行时会基于这个标注优化互操作开销。 14 更详细描述请参考《仓颉编程语言开发指南》中 仓颉-C 互操作 1 章节。 仓颉与 ArkTS 互操作 在鸿蒙应用开发中,仓颉和 ArkTS 各具特点和优势,存在使用仓颉与 ArkTS 混合开发的诉求,例如以下场景: 场景一:在使用 ArkTS 开发时,通过跨语言互操作调用仓颉开发的代 码模块,发挥仓颉高性能高并发优势,提升应用性能体验。 场景二:在使用仓颉开发时,通过跨语言互操作调用 ArkTS 库,复用 ArkTS 丰富的库生态。 针对互操作场景诉求,仓颉提供 ohos.ark_interop 互操作库来实现与 ArkTS 的互操作。该库主要提供以下关键数据结构: JSValue: 用于表示来自 ArkTS 中的对象(如数字、字符串、对象、函 数),是仓颉与 ArkTS 数据转换的桥梁。 JSContext: 用于表示与 ArkTS 互操作的上下文,提供模块加载、 JSValue 创建等能力。 JSCallInfo: 用于表示当发生来自于 ArkTS 互操作调用时,调用的参数 集合。 1 仓颉-C 互操作参见 https://developer.huawei.com/consumer/cn/doc/cangjie-guides-V5/cangjie- c-V5 15 ArkTS 调用仓颉 针对场景一的诉求,可使用互操作库,在仓颉侧实现可被互操作调用的接 口,示例如下: 1. package ohos_app_cangjie_entry 2. 3. // 导入互操作库 4. import ohos.ark_interop.* 5. 6. func addNumber(context: JSContext, callInfo: JSCallInfo): JSValue { 7. // 从 JSCallInfo 获取参数列表 8. let arg0: JSValue = callInfo[0] 9. let arg1: JSValue = callInfo[1] 10. // 把 JSValue 转换为仓颉类型 11. le
| ||
下载文档到本地,方便使用
共 65 页, 还有
1 页可预览,
继续阅读
文档评分

