目录

  • 介绍
  • 语言概述与设计理念
  • 设计目标
  • 核心语言特性
  • 多后端支持
  • 简洁高效的语法
  • 多范式编程支持
  • 类型系统与安全性
  • 静态类型系统
  • 内存安全机制
  • 异常处理
  • 并发编程模型
  • 轻量级线程
  • 同步原语
  • Future和Promise
  • 元编程与领域特定语言
  • 宏系统
  • 领域特定语言支持
  • 生态系统与工具链
  • 标准库
  • 包管理
  • 开发工具
  • 应用场景与未来展望
  • 适用场景
  • 优势总结
  • 结论

过去好长时间了,这篇文章到现在才发出来。。。。

之前在群里看到消息HarmonyOS NEXT Cangjie正式版本测试活动正在招募,作为已经参加仓颉鸿蒙测试版内测快两年的不会仓颉语言的开发人员,当然要参与一波了。
不过可惜的是这次是小范围招募,问卷链接也不让转发

img

img

既然已经开始正式版测试活动了,想来距离正式发布也不远了,内测了快两年的仓颉新手开发,现在也应该开始学一下仓颉了。

Q:为啥之前没有学习仓颉?
A:之前在做鸿蒙项目的时候,一直在用ArkTS,仓颉一直在beta版本,我们也没有在项目中使用。所以就没有去学习。

介绍

现在官网能下载到的版本是2025/07/01发布的 1.0.0
另外仓颉相关的官方代码代码仓库已经迁移到了gitcode:https://gitcode.com/Cangjie%E3%80%82
下面抄一段官网白皮书上的原文,对仓颉有个粗略的了解:

仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE 工具链支持,为开发者打造友好开发体验和卓越程序性能。其具体特性表现为:
高效编程:面向应用开发,我们希望语言能够易学易用,降低开发者入门门槛和开发过程中的心智负担,支持各种常见的开发范式和编程模式,让开发者简洁高效地表达各种业务逻辑。
安全可靠:作为现代编程语言,仓颉追求编码即安全,通过静态类型系统和自动内存管理,确保程序的类型安全和 null safety 等内存安全;同时,仓颉还提供各种运行时检查,包括数组下标越界检查、类型转换检查、数值计算溢出检查、以及字符串编码合法性检查等,能够及时发现程序运行中的错误;此外,还通过代码扫描工具、混淆工具以及消毒器,进一步提供跨语言互操作安全和代码资产保护等支持。
轻松并发:并发和异步编程能够有效提高处理器利用率,并在交互式应用中确保程序的响应速度,是应用开发中必不可少的能力。仓颉语言实现了轻量化用户态线程和并发对象库,让高效并发变得轻松。仓颉语言采用用户态线程模型,每个仓颉线程都是极其轻量级的执行实体,拥有独立的执行上下文但共享内存。
卓越性能:仓颉编译器及运行时从全栈对编译进行优化,包括编译器前端基于 CHIR(Cangjie HighLevel IR)高层编译优化(比如语义感知的循环优化、语义感知的后端协同优化等),基于后端的编译优化(比如:SLP 向量化、Intrinsic 优化、InlineCache、过程间指针优化、Barrier 优化等),基于运行时的优化(比如轻量锁、分布式标记、并发 Tracing 优化等),一系列的优化让仓颉充分发挥处理器能力,为应用提供卓越的性能支持。

对于其中的每个特性,官方白皮书上都有详细的解释

语言概述与设计理念

仓颉语言的设计遵循"清晰第一、简洁为美、风格一致"的原则,强调代码的可读性和可维护性。作为一种静态强类型语言,仓颉在编译时进行严格的类型检查,能够在开发早期发现潜在的错误,从而提高代码质量。同时,仓颉支持类型推断,减少了冗余的类型声明,使代码更加简洁。

设计目标

高效执行: 通过多后端支持(CJNative和CJVM)实现接近原生代码的性能
开发效率: 提供丰富的语法糖和现代语言特性,减少样板代码
内存安全: 通过自动内存管理和运行时检查避免常见的内存错误
领域适应: 支持多范式编程和元编程能力,适应不同领域的开发需求
仓颉语言的命名源自中国古代传说中的文字创造者"仓颉",寓意着这种语言将成为开发者表达计算思想的优秀工具。

核心语言特性

多后端支持

仓颉语言的一个显著特点是其多后端架构设计:

  • CJNative后端:将代码编译为原生机器码,直接在操作系统层面运行,提供最佳性能
  • CJVM后端:将代码编译为字节码,基于虚拟机运行,提供更好的跨平台兼容性

这种多后端设计使开发者可以根据目标部署环境选择最适合的编译方式。例如,在性能敏感的场景下可以选择CJNative后端,而在需要快速迭代和跨平台部署的场景下则可以选择CJVM后端。

简洁高效的语法

仓颉语言提供了一系列简洁而富有表现力的语法特性:
插值字符串: 方便地在字符串中嵌入表达式

let name = "World"
println("Hello, ${name}!") // 输出:Hello, World!

主构造函数: 简化类的初始化代码

class Person(let name: String, var age: Int)

模式匹配: 强大的match表达式支持复杂条件分支

match value {
    case 1 => println("One")
    case 2..5 => println("Two to Five")
    case _ => println("Other")
}

Flow表达式: 简洁的控制流表达方式

let result = if x > 0 { "Positive" } else { "Non-positive" }

这些语法特性显著减少了样板代码,使开发者能够更专注于业务逻辑的实现。

多范式编程支持

仓颉语言融合了多种编程范式,为开发者提供了灵活的编程方式:
函数式编程特性:

  • 高阶函数和Lambda表达式
  • 不可变数据结构和纯函数支持
  • 代数数据类型和模式匹配

面向对象特性:

  • 类与接口的继承体系
  • 多态和封装属
  • 性访问控制(public/protected/private)

命令式编程特性:

  • 可变变量
  • 循环和控制结构
  • 全局函数定义

这种多范式支持使开发者可以根据问题域的特点选择最适合的编程风格,或者混合使用不同范式以获得最佳的表达能力。

类型系统与安全性

静态类型系统

仓颉语言的类型系统是其核心优势之一:

  • 强类型: 所有类型转换必须显式声明,避免隐式转换带来的意外行为
  • 类型推断:编译器能够自动推断变量类型,减少类型注解的冗余
  • 泛型支持: 提供类型参数化能力,实现类型安全的通用代码

类型系统的基础类型包括:

  • 整数类型:Int8/Int16/Int32/Int64/IntNative
  • 无符号整数:UInt8/UInt16/UInt32/UInt64/UIntNative
  • 浮点数:Float16/Float32/Float64
  • 布尔类型:Bool
  • 字符类型:Rune
  • 单元类型:Unit

内存安全机制

仓颉语言通过多种机制确保内存安全:

  • 自动内存管理: 采用垃圾回收机制,自动管理内存生命周期
  • 边界检查: 运行时检查数组访问是否越界
  • 溢出检测: 数值运算时检查是否溢出
  • 空安全: 通过Option类型显式处理可能为空的值

这些机制共同作用,有效防止了内存泄漏、野指针访问、缓冲区溢出等常见的内存安全问题。

异常处理

仓颉提供了结构化的异常处理机制:

try {
    // 可能抛出异常的代码
    let file = File.open("data.txt")
    let content = file.readAll()
    println(content)
} catch e: IOException {
    println("文件操作失败: ${e.message}")
} finally {
    // 资源清理代码
    file?.close()
}

异常分为两类:

  • Error: 表示系统级错误,通常不可恢复
  • Exception: 表示应用级异常,可以被捕获和处理

这种分类帮助开发者区分不同类型的错误情况,采取适当的处理策略。

并发编程模型

轻量级线程

仓颉采用M:N线程模型,提供用户态的轻量级线程(协程):

let future = spawn {
    // 在新线程中执行的代码
    computeHeavyTask()
}
let result = future.get() // 等待线程完成并获取结果

这种线程比操作系统线程更轻量,创建和切换开销小,适合高并发场景。

同步原语

仓颉提供多种同步机制来协调并发访问:
互斥锁:

let mutex = Mutex()
synchronized(mutex) {
    // 临界区代码
    sharedResource.update()
}

原子操作:

let counter = AtomicInt(0)
counter.increment() // 线程安全的原子操作

条件变量:
用于线程间的条件同步,实现更复杂的协调逻辑。

Future和Promise

仓颉提供了Future/Promise模型来处理异步计算:

func asyncTask(): Future<String> {
    let promise = Promise<String>()
    spawn {
        let result = longRunningComputation()
        promise.complete(result)
    }
    return promise.future
}

let future = asyncTask()
// 可以继续执行其他工作...
let result = future.get() // 需要时获取结果

这种模式使异步代码的编写更加直观和结构化。

元编程与领域特定语言

宏系统

仓颉提供了强大的宏系统,支持编译时代码生成和转换:

macro log(expr: Expr): Expr {
    return quote {
        println("[LOG] ${${expr}} = ${${expr}}")
    }
}

log(1 + 2) // 编译时展开为:println("[LOG] 1 + 2 = 3")

宏可以用于:

  • 生成样板代码

  • 实现领域特定语法

  • 进行编译时计算

  • 自定义代码检查

    领域特定语言支持

    仓颉的元编程能力使其非常适合实现嵌入式领域特定语言(EDSL):

    @Builder
    func htmlDocument() {
      html {
          head {
              title { "Example Page" }
          }
          body {
              h1 { "Welcome" }
              p { "This is an example." }
          }
      }
    }
    

    这种DSL可以保持领域语义的同时,享受完整的语言工具支持。

    生态系统与工具链

    标准库

    仓颉提供了丰富的标准库,涵盖:

  • 基础数据结构(Array、HashMap等)

  • 文件I/O和网络编程

  • 日期时间处理

  • 正则表达式

  • 加密解密

  • 并发工具

标准库遵循一致的API设计规范,提供高质量的实现。

包管理

CJPM(Cangjie Package Manager)是官方包管理工具,支持:

  • 依赖管理

  • 版本控制

  • 项目构建

  • 发布共享

    开发工具

    官方提供完善的开发工具链:

  • cjc:编译器

  • cjdb:调试器

  • cjfmt:代码格式化工具

  • cjlint:静态分析工具

  • IDE插件(如VSCode扩展)

这些工具帮助开发者提高生产力,保证代码质量。

应用场景与未来展望

适用场景

仓颉语言适用于多种应用场景:

  • 高性能服务器开发
  • 并发密集型应用
  • 系统编程
  • 数据处理和分析
  • 领域特定工具开发

优势总结

  • 性能与安全并重: 在保证高性能的同时提供内存安全保证
  • 开发效率高: 现代语法和丰富工具链提升开发速度
  • 适应性强: 多范式支持适应不同领域需求
  • 易于维护: 清晰的代码结构和强大的类型系统降低维护成本

7.3 发展前景
随着语言的不断成熟和生态系统的完善,仓颉有望在以下领域取得进展:

  • 云计算和分布式系统
  • 大数据处理
  • 嵌入式系统
  • 人工智能基础设施

结论

仓颉编程语言通过其创新的设计理念和丰富的特性集合,为现代软件开发提供了一个强大而灵活的工具。无论是其多范式编程支持、强大的类型系统,还是高效的并发模型和元编程能力,都使仓颉在众多编程语言中脱颖而出。随着语言生态的不断发展和社区的增长,仓颉有望成为未来软件开发的重要选择之一。
对于开发者而言,学习仓颉语言不仅可以掌握一种现代化的编程工具,更能理解如何将不同的编程范式和技术有机结合,创造出高效、安全且易于维护的软件系统。仓颉语言的出现,为编程语言领域带来了新的思考和可能性。


上面提到的这些特性和优点都是从官网介绍上总结来的,感觉像是在和 c做对比,一些现代的编程语言(被大众知道的比较晚),比如 go、Dart、kotlin 等,几乎都有这些特性和优点。。。。。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐