开头

在 AI 爆发式增长的这两年,“用什么语言写 AI”变成了一个比“用什么框架训练模型”更底层的问题。Python 牢牢占据算法生态,C++/CUDA 霸占高性能算子层,Rust 则在可靠性和性能之间找平衡。但问题是:这些语言都不是为 AI 设计的——确切地说,它们被 AI 时代直接“征用”了,而不是天生适配。

紫金会议工业论坛上,仓颉语言团队围绕“AI 原生语言设计”做了一次完整的思路拆解。看完视频回顾后,我觉得这不止是一次新语言发布会,更像是一次对“编程语言和 AI 之间应该是什么关系”的深度思考。

本文基于该论坛演讲内容,结合仓颉开源以来的公开资料,整理一份 AI 原生语言与仓颉 AI 亲和化设计的技术解析。内容覆盖 AI 原生语言的概念、仓颉的核心设计取向、与传统语言的对比、环境准备、代码示例、常见误区和工程落地建议。无论你是做 AI 应用开发、框架设计,还是单纯关注编程语言演进,这篇内容都值得往下读。

1. AI 原生语言:到底在讨论什么

1.1 什么是“AI 原生语言”

先解决一个容易混淆的问题:“AI 原生语言”不是“能调用 AI 接口的语言”,也不是“写 Prompt 的语言”。

按照这次论坛分享里的定义,AI 原生语言需要满足三个层次的要求:

第一层, 开发效率上适配 AI 工作流 。现在的 AI 开发流程高度依赖 Jupyter Notebook、Python 脚本、快速原型验证,语言本身需要支持交互式开发、动态调试、灵活的数据结构,让开发者能用最少的代码完成“加载数据 -> 构建模型 -> 训练 -> 评估”的闭环。

第二层, 语言特性上支持 AI 计算表达 。AI 算法底层是大量矩阵运算和张量变换,语言层面如果有内建的张量类型、自动微分、向量化原语,就能比“用 for 循环手写矩阵乘法”高效得多。

第三层, 运行时和编译策略上为 AI 负载优化 。模型推理、数据处理面临的是高吞吐、低延迟、异构硬件(CPU/GPU/NPU)调度问题。语言必须能在编译期做大量优化,同时保持运行时的高性能。

简单说: AI 原生语言是从语法、语义、运行时三个维度都为 AI 开发设计过的语言 ,而不是“AI 火了,我们给某语言加个 AI 库”。

1.2 为什么现有语言不够“AI 原生”

理解了定义,就能明白为什么好用的 AI 语言似乎早已存在,却还要专门讨论这个问题。

Python 的问题是性能墙 。Python 的迭代效率和生态无人能敌,但它的 GIL(全局解释器锁)、动态类型、逐行解释机制决定了它无法在 CPU/GPU 密集型任务中达到原生性能。所以业界只能用 Cython、NumPy 向量化、C++ 扩展、CUDA 算子来“补”,复杂度层层叠加。

C++/CUDA 的问题是开发效率墙 。写一个高性能算子,开发者需要管理内存生命周期、手动处理并发、做底层性能调优,开发周期长,入门门槛高。即便强如 PyTorch,底层算子也依赖大量 C++ 模板元编程,普通开发者很难参与底层优化。

Rust 的问题是表达力与学习曲线 。Rust 的所有权模型在系统级编程里非常优雅,但借用在 AI 这种“频繁共享张量数据”的场景里,很多时候要让位于运行时引用计数(Rc/Arc)和内部可变性。AI 开发者要跨过所有权、生命周期、泛型 trait 三道坎,才能真正写起来顺手。

这三堵墙恰好对应了 AI 原生语言要解决的问题: 既要 Python 的开发体验,又要 C++ 的性能,还要现代语言的安全表达力

1.3 仓颉语言的定位:AI 亲和化

仓颉(Cangjie)是华为推出的编程语言,2024 年 6 月宣布开源,2024 年 9 月在自有版本发布后逐步开放社区版本。官方定位是“面向万物互联和 AI 时代的编程语言”。

在这次紫金论坛演讲里,仓颉团队给出了一个更具体的描述: 做 AI 亲和化设计 ,核心目标是“让 AI 开发者在仓颉里写代码,感觉比 Python 更顺手,跑起来比 C++ 更省心”。

这个定位的关键词是“亲和化”——不追求替代 Python,而是做更贴近 AI 开发者习惯的原生能力。它体现在四个方面:

  1. 语言层面内建对张量、向量、矩阵计算的支持。
  2. 多范式语法:既能写动态风格的快速原型,也支持静态高性能代码。
  3. 编译期做更多的自动优化,降低手工调优成本。
  4. 与 Python 生态互操作,继承现有 AI 资产。

接下来,我们从技术点逐一拆解。

2. 仓颉 AI 亲和化的核心设计思路

2.1 多范式:要 Python 的灵活,也要 C++ 的可靠

仓颉不是“又一个 Python”,也不是“又一个 Rust”。从目前公开的资料来看,它采用了多范式设计——面向对象、函数式、命令式、响应式都可以写。

在 AI 场景里,多范式的意义很明显:

  • 快速原型阶段 :可以使用类似 Python 的动态风格,定义变量时不强制标注类型,用 let var 快速声明。
  • 正式训练/推理阶段 :可以使用静态类型和不可变数据结构,让编译器做更多检查,避免运行时类型错误。
  • 算子开发阶段 :可以使用命令式写循环,控制内存布局,逼近 C++ 性能。

这种“渐进类型”思路在 TypeScript 上验证过,放到 AI 语言里其实更合适——AI 项目的不同阶段,对类型严格性的要求完全不同。

2.2 管道式数据流:更接近现代 AI 代码习惯

AI 代码的典型风格是“把数据从一个处理步骤流向下一个步骤”。比如数据清洗、特征变换、模型预测、后处理。传统写法是函数嵌套,读起来要从里往外反着读。

仓颉的管道操作符设计改变了这种体验。官方示例里大量使用管道风格,比如下面这样的逻辑示意:

// 概念示意:管道操作符在 AI 数据处理中的使用
let result = dataset
    .filter(|x| x.is_valid())
    .map(|x| x.normalized())
    .batch(32)
    .to_tensor()

这种写法在 Python 里需要借助 pandas 的链式调用,在 Scala/Spark 里也有类似思路。仓颉把它变成语言级能力,好处是:一是有利于编译器做编译期优化,二是代码阅读顺序和数据处理顺序一致,三是减少中间变量命名负担。

2.3 内建张量类型与 AI 计算基础原语

这是仓颉 AI 亲和化里最重要的设计之一。

传统语言做 AI 计算,要么依赖第三方库(NumPy、TensorFlow、PyTorch),要么自己维护一套张量库。仓颉在语言层面就规划了张量类型,包括多维数组、形状操作、切片、广播、矩阵运算等基础能力。

这个设计带来的工程价值是巨大的:

  • 语言内建类型享有编译器特权,编译器可以针对张量操作生成高效代码。
  • 张量类型可以天然映射到不同硬件后端(CPU、GPU、NPU)。
  • 开发者不需要再引入一层“张量库 API”,语言本身就是计算接口。

当然,从开源社区的版本来看,张量 API 仍然在完善中,不同版本的语法可能有差异。但大方向是明确的: AI 计算会成为语言的一等公民

2.4 自动微分与 AI 编译优化

AI 训练的底层能力是自动微分(Autograd)。PyTorch 使用运行时记录计算图,TensorFlow 使用静态图,JAX 使用函数变换。仓颉作为新语言,有机会在编译期就把自动微分做进去。

从论坛分享的内容来看,仓颉团队在编译器层面探索自动微分能力,目标是在编译期生成求导代码,而不是像 PyTorch 一样在运行时动态构建计算图。这样做的好处是:

  1. 训练时的额外开销更小。
  2. 更容易做算子融合和内存复用优化。
  3. 支持更复杂的数据流控制(如循环、条件分支)的求导。

同时,编译器层面的优化也让“Python 风格写代码、C++ 性能运行”成为可能。开发者不需要掌握 CUDA 或汇编优化技巧,只需要描述清楚计算逻辑,编译器负责后端代码生成。

2.5 多语言互操作:不抛弃 Python 生态

一个现实问题是:即使仓颉再好,AI 社区已有的模型、工具、库、预训练权重都建立在 Python 生态上。轻易“推翻重写”是不现实,也不聪明的。

仓颉的设计思路是 互操作 ,而不是隔离。从公开资料来看,仓颉支持与 C 语言互操作,也规划了 Python 互操作层。这意味着:

  • 你可以在仓颉里调用成熟的 Python AI 库(如 HuggingFace Transformers、NumPy、PyTorch)。
  • 你也可以把性能敏感的算子用仓颉实现,然后提供给 Python 调用。
  • 存量 Python 代码不是包袱,而是仓颉生态的起点。

这种思路对工程团队非常重要—— 选型仓颉不意味着放弃现有资产 ,而是可以渐进式迁移。

2.6 结构化并发与高并发任务处理

AI 应用不只是训练模型,还包括数据服务、推理服务、多路请求并发等工程问题。

仓颉在语言层面内建了结构化并发能力,类似 Kotlin 协程和 Swift 的 async/await,但更强调“结构化”——并发任务有明确的创建、执行、结束边界,避免了传统线程池带来的资源泄漏和难以取消的问题。

在 AI 推理服务里,一个请求可能需要同时调用多个模型、多个后处理流程,结构化并发可以让代码更简洁、资源利用更可控。

3. 环境准备与版本说明

如果你读完前面几个设计点,想上手体验一下仓颉,需要先了解当前的开源进展。

3.1 开源状态与版本选择

仓颉语言已开放社区版本,代码托管在 Gitee 和 GitHub 等平台。开源版本会持续迭代,不同版本的语法、标准库、编译器特性会有变化。

需要注意: 具体版本号请以官方仓库发布信息为准 ,因为编程语言项目迭代非常快,本文不写死某个具体版本,而是以设计思路和通用示例为主。

3.2 安装前的基本要求

从社区版发布情况来看,通常需要以下环境:

操作系统:Linux(推荐 Ubuntu 20.04 及以上)、macOS、Windows
CPU 架构:x86_64 / aarch64
内存:建议 8GB 以上(编译大型项目需要更多)
硬盘:至少 5GB 剩余空间

安装包一般包含编译器、标准库、包管理器工具。具体下载方式请前往官方发布仓库查看,环境变量和 PATH 配置方式和大多数编译器类似。

3.3 IDE 支持

目前仓颉在 IDE 插件方面还在完善,主流编辑器(VS Code、JetBrains 系)会逐步覆盖。日常写示例代码可以直接使用命令行编译运行,也可以关注官方插件市场的更新。

温馨提示:新语言迭代速度快,建议始终参考当前版本文档,不要直接照搬旧版本的 API。

4. 代码示例与实战演示

在没有安装环境的情况下,我们先从一个概念层面理解仓颉的语法风格,再给出环境就绪后的运行方式。

4.1 Hello AI:第一个仓颉程序

仓颉的语法风格接近 Swift / TypeScript / Rust 的融合体。先看一个最基础的“Hello World”:

// 文件名:hello.cj
main() {
    println("Hello, Cangjie AI!")
}

如果你熟悉 Python 或 TypeScript,这个代码几乎不需要解释。 main() 是程序入口, println 输出一行文本。

编译运行的方式类似:

cjc hello.cj -o hello
./hello

这里的 cjc 是仓颉编译器命令, -o hello 指定输出文件名。不同版本命令可能略有差异,使用时先执行 cjc --help 查看当前版本支持的参数。

4.2 变量、类型与函数:渐进类型的风格

仓颉支持类型推导,你可以像 Python 一样写一份简单的前馈网络训练示意代码,而不需要手写大量类型标注:

// 文件名:fc_demo.cj
// 概念示例:简单全连接层的前向计算
import std.math.*

func sigmoid(x: Float64): Float64 {
    return 1.0 / (1.0 + exp(-x))
}

func forward(inputs: Array<Float64>, weights: Array<Float64>, bias: Float64): Float64 {
    var sum = bias
    for (i in 0..inputs.size) {
        sum += inputs[i] * weights[i]
    }
    return sigmoid(sum)
}

main() {
    let input = [0.5, 0.3, 0.8]
    let weight = [0.2, -0.1, 0.5]
    let b: Float64 = 0.0
    let output = forward(input, weight, b)
    println("Output: ${output}")
}

关键点解释:

  • func 关键字声明函数。
  • : Float64 表示返回类型。
  • let 声明不可变绑定, var 声明可变变量。
  • ${output} 是字符串模板的写法。

这个代码虽然只是数组乘法,但已经能看出仓颉的渐进类型风格——你可以在不需要的地方省略类型标注,在关键接口处显式标出类型。

4.3 使用张量 API 完成矩阵计算

仓颉 AI 亲和化的一个落点是张量 API。以下代码是张量计算概念的示意,展示如何用仓颉风格完成矩阵乘法:

// 文件名:matmul_demo.cj
// 概念示例:使用内建张量类型做矩阵乘法
import std.tensor.*

main() {
    // 假设 tensor 模块提供了二维张量类型
    let a = Tensor<Float64>::from([[1.0, 2.0], [3.0, 4.0]])
    let b = Tensor<Float64>::from([[5.0, 6.0], [7.0, 8.0]])

    let c = a.matmul(b)

    println("Matrix C:")
    c.print()
}

说明:这里展示的是设计思路,具体 API 名称、导入路径、构造方式会随版本迭代。实际写代码时,请以当前版本的标准库文档为准。

但设计思想是清楚的: Tensor 作为语言内建类型,开发者不需要从零引入第三方张量库 ,编译器可以直接针对 matmul 生成优化代码。

4.4 Python 互操作:调用现有 AI 生态

对于存量 Python 代码,仓颉规划了互操作层。假设你在仓颉中需要调用一个 Python 函数,思路大致如下:

// 概念示例:通过互操作层调用 Python 函数
import pyinterop.*

main() {
    let np = pyimport("numpy")
    let arr = np.arange(10)
    let doubled = arr * 2
    println(doubled)
}

这种“在仓颉里用 Python 库”的体验,是 AI 亲和化设计的重要价值点。它让 AI 团队可以先用 Python 快速验证,再把热点路径逐步迁移到仓颉。

需要注意,具体模块名和 API 仍在演进中,上例只是用来说明设计理念。实际使用时请查看官方互操作文档。

4.5 运行与验证思路

如果你已经安装好仓颉环境,建议按照下面的顺序做首次验证:

# 1. 查看编译器版本
cjc --version

# 2. 编译并运行 Hello 程序
cjc hello.cj -o hello
./hello

# 3. 编译运行张量示例
cjc matmul_demo.cj -o matmul_demo
./matmul_demo

预期输出第一行是 Hello, Cangjie AI! ,后续张量矩阵会以多维数组形式打印。如果编译失败,优先检查版本匹配和标准库导入路径。

5. 从多语言对比看 AI 开发体验变化

为了让仓颉的设计价值更直观,我们可以做一个多语言对照表,展示在不同 AI 开发任务中的体验差异。

任务 Python C++ Rust 仓颉(设计目标)
快速原型 优秀 中等 优秀
类型安全 中等 强(渐进式)
张量计算 依赖 NumPy 依赖库 依赖库 内建
自动微分 依赖框架 依赖框架 依赖框架 编译期探索
手动内存管理 不需要 需要 不需要 不需要
与 C 语言互操作 可以 原生 优秀 支持
与 Python 互操作 原生 可以 可以 规划支持
高并发 较弱 优秀 结构化并发
学习曲线 平缓 陡峭 陡峭 中等

从这个对比可以看出,仓颉的目标不是在某一个维度上做到极致,而是在 AI 开发的多个维度上取一个“综合最优解”。它想把 Python 的开发速度、C++ 的性能、现代语言的安全表达力,统一在同一种语言体验里。

当然,目标归目标,是否兑现还要看持续迭代。但从语言设计层面看,方向是合理且值得关注的。

6. 常见问题与排查思路

新语言在实际使用中,最常见的问题集中在编译器版本、包管理、互操作和性能几个方向。

问题现象 常见原因 解决思路
编译报错:找不到标准库模块 安装的环境变量或库路径未正确配置 检查 CANGJIE_HOME 或安装目录下的 lib 路径配置
API 与教程不一致 语言版本迭代,旧 API 废弃 查看当前版本文档或 release notes,更新代码
Python 互操作调用失败 Python 版本、解释器路径、动态库不匹配 确认互操作层支持的 Python 版本范围,统一解释器路径
张量 API 不识别 版本未包含该特性或导入路径错误 查阅当前版本标准库索引,确认模块名
编译速度慢 大型项目首次构建或优化级别高 使用增量构建,先关闭深度优化,保证功能正确
包下载失败 网络原因或源地址变更 查看官方配置的镜像源,切换可用仓库地址

如果你遇到的是上述表格中没有的问题,推荐排查路径是:

  1. 先查编译器版本: cjc --version
  2. 再查标准库文档,确认使用的 API 在当前版本存在。
  3. 复现最小化示例,去掉无关代码,定位是语法问题还是逻辑问题。
  4. 到官方社区或仓库 issues 搜索关键词。
  5. 提问时附上编译器版本、完整代码、报错日志。

在新语言生态里, “版本不匹配”是绝大多数问题的根源 ,这方面的踩坑成本要提前做好心理准备。

7. AI 原生语言最佳实践与工程落地建议

7.1 不要“All in”仓颉,而是“渐进式引入”

对大多数团队来说,仓颉目前最合理的使用策略不是全面替换现有系统,而是:

  • 选取 Python 生态不足、性能瓶颈明显的场景做试点。
  • 先将纯计算模块迁移到仓颉,保留 Python 侧的数据处理和模型调用。
  • 用互操作层验证两个语言之间的通信效率和稳定性。
  • 等团队积累足够经验后,再考虑新项目直接用仓颉开发。

这种渐进式策略可以控制风险,避免“新语言替换导致业务停摆”的情况。

7.2 用仓颉写 AI 代码的性能基本思路

虽然仓颉编译器做了大量优化,但“优化”不等于“不需要注意性能”。在 AI 代码中仍然要遵循基本规律:

  • 优先使用内建张量 API,而不是手写多重嵌套循环。
  • 避免在热点路径上创建大量临时对象。
  • 对训练和推理服务分别做性能剖析,找到真正的瓶颈。
  • 多利用编译器的优化选项,在发布版本开启深度优化。

7.3 类型标注策略:接口严格,内部灵活

仓颉的渐进类型是优势,但要用出价值需要配合团队规范。建议:

  • 对外 API、库接口、边界模块使用完整类型标注。
  • 内部算法实现、临时脚本可以依赖类型推导。
  • 在训练循环、数据处理热点路径尽量使用不可变数据,减少副作用。

这样既保留了开发效率,又能在关键位置提供编译期保障。

7.4 安全与权限边界

任何新语言集成到生产环境,都要遵守系统工程的基本安全要求:

  • Python 互操作层接到外部输入时,需要做好参数校验和数据清洗。
  • 不要在互操作调用中直接拼接命令或执行未信任代码。
  • 模型推理服务涉及用户数据时,遵循最小权限原则,避免越权访问。
  • 在测试环境充分验证后,再发布到生产。

尤其要注意:AI 应用往往要处理大量用户数据,数据脱敏、访问控制、日志脱敏这些基础安全能力不能因为“用了新语言”就被忽略。

7.5 关注生态信号,而不是炒作

作为一个 2024 年前后才逐步开源的语言,仓颉生态还需要时间成长。团队在选型时,建议关注以下信号:

  • 官方文档和标准库的更新频率。
  • 社区贡献者的数量和活跃度。
  • 真实企业的落地案例数量。
  • 编译器性能优化的基准测试数据。
  • 第三方库、工具链的覆盖度。

如果这些信号持续朝好的方向发展,那么仓颉的前景值得期待;如果停滞不前,也需要理性评估风险。

8. 从这次论坛视频回顾中,我们可以学到什么

回到“紫金会议工业论坛”的这场分享本身,我可以提炼出几个关键词: 定位、取舍、生态

仓颉团队没有把仓颉包装成“万能编程语言”,而是明确聚焦“AI 亲和化”。这个定位决定了它不会去和 Java 抢企业级后端市场,也不会和 C 抢嵌入式底层,而是把核心资源投入到 AI 开发者最关心的几个方向——张量计算、自动微分、Python 互操作、编译期优化。

这种 聚焦策略 恰恰是很多新语言失败的反面教材。新语言最容易犯的错是“什么都要做”,结果每个方向都没打磨到可用状态。仓颉如果能坚持“AI 亲和化”这个定位,把 AI 开发这条主链路体验做到极致,在 AI 基础设施层会有一席之地。

从工程视角看,语言本身只是工具,真正推动 AI 应用落地的是编译器、标准库、工具链、社区和案例的完整闭环。仓颉目前还处在“工具链持续完善”的阶段,距离“大规模生产验证”还有距离。但它的设计思路,无论最终这个语言能走多远,都已经给编程语言社区带来了一些有价值的参考方向。

9. 下一步学习建议

如果你对 AI 原生语言、仓颉的 AI 亲和化探索产生了兴趣,可以沿着下面的路线继续深入:

先读官方语言文档,把 let / var / func / struct / match 这些基础语法过一遍。接着写几个不依赖 AI 的小工具,比如文件处理、命令行计算器、简单的并发任务。然后再尝试张量 API 和 Python 互操作,做一个小型 AI 推理示例。

我个人最推荐的一个练手项目是: 用 Python 训练一个简单的分类模型,导出权重,然后用仓颉写推理代码加载权重并完成前向计算 。这个过程会逼着你理解张量 API、文件 I/O、数值计算、与 Python 生态的数据交换方式,比单纯抄教程有效得多。

如果这个项目能跑通,你基本上就算迈过了仓颉 AI 开发的第一道门槛。

说到底,AI 原生语言不是一次“语言替换”,而是一次“语言与 AI 工作负载之间关系的重新设计”。仓颉能不能成为那个答案,时间会给出结论。但在这个过程中,提前理解它的设计逻辑,对每一个做 AI 基础设施或应用开发的工程师都是有价值的事情。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐