HarmonyOS NEXT下一代编程语言仓颉介绍及入门

在前两天刚刚召开的华为开发者大会(HDC 2024)上,华为内部研发已久的国产自主编程语言仓颉终于正式对外官宣。了解了下该语言,很是期待,语法简洁且很强大,语言库api很丰富,连网络库和加解密模块,文件操作都带了。且支持包管理,这包管理在c++上可是个痛。而且它支持多个操作系统,包括Windows、Linux,以及macOS等平台,还支持调用c语音的动态库为开发者提供了极为便利的使用场景。

如果再加上性能上也很优秀的话,我想除了c和c++外,在系统编程领域,也可以尝试尝试它。

仓颉编程语言相关的开发文档也已经公布,目前包括了《仓颉编程语言白皮书》、《仓颉编程语言开发指南》和《仓颉编程语言规约》三部分,均可在仓颉编程语言官网中查阅,部分页面仍在更新中,感兴趣的开发者可持续关注。

仓颉编程语言介绍

仓颉 | 华为开发者联盟

随着万物互联以及智能时代的到来,软件的形态将发生巨大的变化。一方面,移动应用和移动互联网领域仍然强力驱动人机交互、设备协同、智能化、安全性等方向的创新,另一方面人工智能也同样驱动软件朝智能化、端边云协同等方向演进。新技术、新场景下应用软件的开发对编程语言提出了新的诉求和挑战。

仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的IDE工具链支持,为开发者打造友好开发体验和卓越程序性能。其具体特性表现为:

  • 高效编程:面向应用开发,我们希望语言能够易学易用,降低开发者入门门槛和开发过程中的心智负担,支持各种常见的开发范式和编程模式,让开发者简洁高效地表达各种业务逻辑。仓颉是一门多范式编程语言,支持函数式、命令式和面向对象等多种范式,包括值类型、类和接口、泛型、代数数据类型、模式匹配、以及高阶函数等特性。此外,仓颉还支持类型推断,能够减轻开发者类型标注的负担;通过一系列简明高效的语法,能够减少冗余书写、提升开发效率;语言内置的各种语法糖和宏(macro)的能力,支持开发者基于仓颉快速开发领域专用语言(DSL),构建领域抽象。

  • 安全可靠:作为现代编程语言,仓颉追求编码即安全,通过静态类型系统和自动内存管理,确保程序的类型安全和null safety等内存安全;同时,仓颉还提供各种运行时检查,包括数组下标越界检查、类型转换检查、数值计算溢出检查、以及字符串编码合法性检查等,能够及时发现程序运行中的错误;此外,还通过代码扫描工具、混淆工具以及消毒器,进一步提供跨语言互操作安全和代码资产保护等支持。

  • 轻松并发:并发和异步编程能够有效提高处理器利用率,并在交互式应用中确保程序的响应速度,是应用开发中必不可少的能力。仓颉语言实现了轻量化用户态线程和并发对象库,让高效并发变得轻松。

    仓颉语言采用用户态线程模型,每个仓颉线程都是极其轻量级的执行实体,拥有独立的执行上下文但共享内存。对开发者来说,用户态线程的使用和传统的系统线程的使用方式保持一致,没有带来额外负担;而从运行态视角看,线程的管理由运行时完成,不依赖操作系统的线程管理,因此线程的创建、调度和销毁等操作更加高效,且资源占用比系统线程更少。为了避免数据竞争,仓颉语言提供了并发对象库,并发对象的方法是线程安全的,因此在多线程中调用这些方法和串行编程没有区别,应用逻辑的开发者无需额外关心并发管理。对于一些核心库,仓颉还提供了无锁或者细粒度锁的算法实现,能够进一步减少线程的阻塞,提升并发度。

  • 卓越性能:仓颉编译器及运行时从全栈对编译进行优化,包括编译器前端基于CHIR(Cangjie HighLevel IR)高层编译优化(比如语义感知的循环优化、语义感知的后端协同优化等),基于后端的编译优化(比如:SLP向量化、Intrinsic优化、InlineCache、过程间指针优化、Barrier优化等),基于运行时的优化(比如轻量锁、分布式标记、并发Tracing优化等),一系列的优化让仓颉充分发挥处理器能力,为应用提供卓越的性能支持。另外仓颉语言对运行时进行原生的轻量化设计,通过对运行时模块化分层设计,定义仓颉公共对象模型和运行时公共基础组件,基于公共对象模型,实现运行时的内存管理、回栈、异常处理、跨语言调用等基础能力,大幅减少多个能力间的冗余对象设计,精简运行时体积。同时通过包的按需加载技术,减少仓颉应用启动的冗余包内存开销,因此对于资源敏感设备,占用资源更少,支持更友好。

除此之外,仓颉还支持面向应用开发的一系列工具链,包括语言服务(高亮、联想)、调试(跨语言调试、线程级可视化调试)、静态检查、性能分析、包管理、文档生成、Mock工具、测试框架、覆盖率工具、Fuzz工具以及智能辅助编程工具,进一步提升软件开发体验以及效率。以下我们将围绕上述几个方面介绍仓颉语言的主要特性,让读者能够快速了解仓颉语言的定位和主要技术特色。

仓颉编程语言的定位和竞争力

仓颉被设计为一款面向全场景应用开发的现代编程语言,主打高效编程、安全可靠、轻松并发、卓越性能、敏捷扩展。

在设计时,仓颉团队在安全性、易用性和性能之间进行了权衡。

设计语言时我们无法同时完美满足所有要求,例如,C、Rust、C++ 这类的系统编程语言性能极佳,但开发效率没那么高。JS 这类动态脚本语言开发效率高,但性能略差。Kotlin、Java、Go、Swift 这样的语言居于前两者之间,属于重业务开发的静态类型语言。

仓颉也选择了这种居中的定位,被设计为了具备自动内存管理功能、静态类型、面向应用开发的语言。在效率上,仓颉注重“语法简洁低噪音,且能面向领域易扩展”。在性能上,仓颉注重“垂直整合、性能可伸缩、稳定可预期”。在安全上,仓颉注重“缺省模式安全、强化编译期安全约束”。

仓颉语言特性

目前,仓颉语言特性基本完备,可满足大多数开发场景。

作为一门多范式编程语言,仓颉支持函数式、命令式和面向对象等多种范式,包括值类型、类和接口、泛型、代数数据类型、模式匹配、以及高阶函数等特性。此外,仓颉还支持类型推断,能够降低开发者类型标注的负担;通过一系列简明高效的语法,能够减少冗余书写、提升开发效率;语言内置的各种语法糖和宏(macro)的能力,支持开发者基于仓颉快速开发领域专用语言(DSL),构建领域抽象。

下面我们从函数式编程、高效并发、跨语言互操作和原生智能化来具体了解仓颉语言的主要技术特色。(摘选自仓颉白皮书:https://developer.huawei.com/consumer/cn/doc/openharmony-cangjie/cj-wp-abstract,以及仓颉语言规约:https://developer.huawei.com/consumer/cn/doc/openharmony-cangjie/cj-lan-spec

函数是一等公民

仓颉对过程式编程、面向对象编程和函数式编程都提供了良好的支持,包括但不限于值类型、类和接口、泛型、代数数据类型和模式匹配、以及函数作为一等公民等特性支持。

仓颉中函数可以作为普通表达式使用,可以作为参数传递,作为函数返回值,被保存在其他数据结构中,或者赋值给一个变量使用。

func f(x: Int) {
    return x
}
let a = f
let square = {x: Int => x * x} // lambda 表达式

 // 函数嵌套定义,以及函数作为返回值

func g(x: Int) { func h(){ return f(square(x)) } return h}

func h(f: ()->Unit) { f()}

let b = h(g(100))

高效并发:轻量化线程模型

仓颉线程采用的是 M:N 线程模型,因此本质上它是一种用户态的轻量级线程,支持抢占,且相比操作系统线程内存资源占用更小。

这种轻量化线程设计不仅降低系统的负担,而且使得开发者能够在不增加编程复杂度的前提下,轻松实现数千甚至数万个并发任务。其核心优势包括:

  • 简单的并发编程:不对开发者编写并发代码做过多语法约束,使其方便地使用仓颉线程并专注业务处理。

  • 轻量级的开销:由于创建和切换用户态线程的开销远远小于传统的内核线程,仓颉语言可以快速地创建和销毁大量用户态线程,使得开发高并发应用变得轻而易举。

  • 更高的并发能力:仓颉语言通过用户态线程模型,可以实现非常高的并发数,这使得它特别适合于 I/O 密集型和高并发的网络服务场景。

  • 减少上下文切换成本:在轻量化线程模型中,上下文切换发生在用户空间,避免了传统线程切换需要经过内核态和用户态之间频繁转换的高成本。在仓颉语言中,实现高效并发不再是一项复杂且耗时的任务。开发者可以通过简单的语法构造大量的用户态线程,无需担心传统并发模型中常见的性能瓶颈。假设我们有一个需求:需要同时处理多个网络请求。在仓颉语言中,这可以轻松实现,如下代码所示:

func fetch_data(url: String) {
    let response = http_get(url)
    process(response)
}

main() {
    let urls = ["http://example.com/data1", "http://example.com/data2", ...]
    let futures = ArrayList<Future<Unit>>()
    for (url in urls) {
        let fut = spawn { fetch_data(url) }  // 创建仓颉线程进行网络请求
        futures.append(fut)
    }
    for (fut in futures) {  // 等待所有仓颉线程完成
        fut.get()
    }
}

 在上述例子中,spawn 关键字用于创建一个新的仓颉线程,每个线程独立地执行 fetch_data 函数。仓颉语言的运行时环境会自动调度这些线程,而开发者只需关注业务逻辑的实现。最后通过获取线程结果来等待所有的仓颉线程完成,确保主线程能够同步地获取所有结果。

跨语言互操作

仓颉支持和 C、ArkTS/JS、Python 等编程语言的互操作,并采用便捷的声明式编程范式,可实现对其他语言库的高效复用和生态兼容。

跨语言调用的特性对实现“一套代码多端使用”的愿景非常有利,比如原来在嵌入式设备上用 C 语言开发,手表上用 JS 开发,手机上则用 Java,现在可以利用仓颉实现在跨设备、多语言的条件下做开发,并且三种语言在同一份代码里,还可以跨多个语言去做一些调试、定位,甚至是做一些 UI 和代码区之间的双向预览。

以 C 语言互操作为例,因为 C 语言太容易造成不安全,所以仓颉规定所有和 C 语言互操作的功能都只能发生在 unsafe 上下文中。unsafe 上下文是用 unsafe 关键字引入的。unsafe 关键字可以修饰一个代码块(unsafe 表达式的类型就是这个代码块的类型),也可以修饰一个函数。

语法定义为:


unsafeExpression
: 'unsafe' '{' expressionOrDeclarations '}'
;
unsafeFunction
: 'unsafe' functionDefinition
;

另外,仓颉编程语言要调用 C 函数,需要先在仓颉代码中声明这个函数且用 foreign 关键字修饰。

foreign func foo(): Unit
foreign var a: Int32 = 0 // compiler error
foreign func bar(): Unit { // compiler error
return
}

仓颉通过调试器 cjdb 提供源码级调试能力,支持跨语言调试,比如单步进入 / 退出跨语言函数代码、跨语言下的完整调用栈查看,一个调试器完成多种语言的调试,同时支持对仓颉线程进行调试,最大程度上提升用户调试体验。

原生智能化

从计算机与软件演进历程看,伴随硬件及应用的革新,语言每十年经历一次大变革。我们也经历了几个时期:PC 服务器隐藏硬件细节的高级语言如 Lisp、C、C++,传统互联网跨平台

易移植的语言如 Java、JS、Python,移动互联网降低开发门槛注重开发体验的语言如 Swift、Kotlin。现在,我们到了一个智能万物互联时期,需要一个能适应全场景的 AI 原生语言。

虽然 AI 技术已被广泛普及和应用,但 AI 应用开发通常需要开发者具备较深的专业知识,并且面临一定的挑战,例如,学习曲线陡峭、集成复杂性等。

华为设想通过仓颉语言提供原生 AI 能力来简化开发难度,这意味着 AI 相关的功能,如模型部署、智能决策等,将成为语言表达力的一部分,这将带来高效的开发体验。

常规的 AI 赋能是通过提供 AI 应用框架来实现,但是如果能在语言原生能力上提供更简洁的语法表达来降低开发者编写 AI 应用的门槛,这会是一件非常酷的事情。因此仓颉借鉴 web 端和移动端的技术发展,希望通过领域特定语言 DSL 能力来构建类似 AI 领域的声明式范式。

Agent DSL 是仓颉团队现在正在畅想和尝试的 AI 原生能力,它是一种专为 AI Agent 开发和多 Agent 协同而设计的领域特定语言,是一种内嵌在仓颉语言中的 DSL(即 eDSL),开发者无需额外学习复杂的库和框架,通过 DSL 可以简单直观地使用 AI 功能。


// Agent的定义
@agent class Planner {
  @prompt[pattern=APE] (
    action: "帮助用户制定旅行路线",
    purpose: "让用户在计划时间内多参观景点并得到充分休息",
    expectation: “生成一条合理的旅游景点路线,包括时间、景点、通勤等信息"
    )
}

// Agent的使用
let agent = Planner()
let result = agent.chat("我想前往上海")

入门教程

官网文档参见:《仓颉编程语言开发指南》文档中心

 

 

 

 

 

 

 

 结构体的定义与实例化

 

 

类的定义与实例化

 

 

 

 

 

 

 

 

 

 

 

其他资源

文档中心--仓颉编程语言白皮书

华为开发者学堂

华为自研编程语言“仓颉”来了!鸿蒙应用开发新语言,性能优于 Java、Go、Swift_腾讯新闻

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值