Cangjie:一门新的开源编译型语言,原生支持效应处理器和代数数据类型

2026-05-18 1 阅读 作者:Bruno Couriol
Dan Ghica教授“是华为爱丁堡研究中心编程语言实验室负责人,他最近介绍了仓颉语言”(CJ)。这是一门新的应用开发语言,具备代数数据类型和效应处理器(效果处理器)特性。这门已开源的语言被定位为Java、Kotlin或Swift的替代选择。目前中国已有80多所大学仓颉教授。 Ghica 表示,仓颉是一门通用型、高层次且表达高效巅峰的语言,设计目标是安全和。和任何新语言一样,CJ 吸收了前辈语言的经验,并在编程语言(PL)领域中提出了一个明确的要求。CJ 会编译为最初希望的机器代码,并提供多个桥梁,使其能够在 Linux、macOS、Windows、Android、iOS 和 HarmonyOS 上运行。其核心特性包括静态类型"、模式匹配、类型垃圾回收、代数数据(代数数据类型,ADT),以及诸如宏和注解之类的元编程"能力。下面是一个仓颉中模式匹配的示例: enum TimeUnit { | }年(UInt64) | Month(UInt64) } 枚举命令 { |设置时间单位(时间单位)|获取时间单位 |退出 } main() { let command = SetTimeUnit(Year(2022)) match (command) { case SetTimeUnit(Year(year)) => println("设置年份 ${year}") case SetTimeUnit(Month(month)) => println("设置月份 ${month}") case _ => () } } ,将仓颉带入主流学术领域方面的最重要特性,或许就是它对效应处理器的急剧支持。CJ对效应处理器的实现对异常机制做了泛化,并声称能够简化这样的动态绑定。CJ中的效应处理器引入了新的perform和resume关键字,标准的try/catch/finally代码块也变成了try/catch/handle/finally。 class FileNotFound <: Command { public FileNotFound(let filename: String) {} } func readFile(name: String): String { varactualName = name if !fileExists(name) {actualName = Perform FileNotFound(name) // (1): 控制跳转到(2) } return File(actualName).read() } main() { try { let str: String = readFile("foo.txt") println(str) } handle (e: FileNotFound, r: Reduction ) { resume r with "/etc/default.txt" // (2): 控制跳回(1),返回一个值 } } 效果处理器可用于很多场景,包括非确定性与回溯、调度、增量计算、依赖注入与配置(例如,读卡器效果)、mock,以及前面展示过异常的处理。下面是一个用于缓存与记忆化的CJ效果处理器示例: func withCache(fn: () -> Return): Return where Cmd <: Hashable & Equatable & Command { let cache = HashMap() try { fn() } handle (cmd: Cmd, next: Reduction) { let result = match (cache.get(cmd)) { case None => let result = Perform cmd cache.put(cmd, result) result case Some(cached) => cached }resume next with result } } Ghica 强调,CJ 的处理器处理器生支持动态绑定,从而允许代码使用调用后台交互。Ghica 举了一个日志库的例子",它会根据运行程序的设备定义的日志记录方式:设想一下,你正在为 Oniro 这样的框架编写一个库。这个库可能在笔记本电脑、手机、手表上运行,也可能在没有屏幕、没有硬盘、也没有控制台的 IoT 设备上运行。跨所有平台并不存在一种标准的日志记录方式。那么接下来你该怎么办?下,你就需要使用动态绑定。每当你的需要记录某些内容时,你需要通知上下文异常,说这里有日志需要处理,而上下文会知道要处理这些日志。但与此同时,又相反,因为你还需要能够返回原来的执行流程。你并不希望只是引发一个异常然后终止执行。你希望以一种由上下文控制的方式完成日志记录,然后继续恢复计算。例如,在桌面环境里,我可以直接把日志打印到控制台。但如果是在移动设备上,手机并没有控制台。决定,如果尝试日志记录,也许你会弹出某种提示框来显示日志,也可以把它通过电子邮件发送出去,或者干脆忽略掉。你可以进行任何处理,具体方式由上下文自行决定。对于日志来说,事情本质上就是这样。你只用三行代码就可以完成日志功能。现在试着用一门不具备效应处理器的语言做同样的事情,你会发现复杂度会高出很多。虽然已经有一些利用效应处理器的框架以第三方形式组件可用到仓颉中,但效应处理器目前仍被视为门语言中一个正在积极开发中的实验性部分。Ghica的演讲于4月在广场举行的OCX(Open Community Experience)2026上发表。OCX是Eclipse基金会的开源大会”,为开发者、研究人员、行业领袖和政策活动制定者提供了为期三天的交流。查看这则旗舰英文原文:Cangjie, a New Open-Source Compiled Language with本机效果处理程序和代数数据类型“