目录
本文收发于电子发烧友论坛:【HZ-T536开发板免费体验】2 - 交叉编译仓颉编程语言程序到开发板运行 - 北京合众恒跃科技有限公司 - 电子技术论坛 - 广受欢迎的专业电子论坛!
感谢电子发烧友和合众恒跃提供的试用机会。
引言
上一篇介绍了开箱的结果,接下来测试一下华为仓颉编程语言在开发板上运行的效果。最近对华为仓颉编程语言非常感兴趣,所以此次测试重点也是看看仓颉编程语言对嵌入式系统的支持情况。
仓颉编程语言简介
仓颉编程语言是华为自研的面向全场景智能的新一代编程语言,2019 年启动研发,2024 年 6 月正式发布首个公测版本,2025年7月公布了第一个正式版本1.0。以下是对它的详细介绍:
- 特点:
- 高效编程 :支持函数式、命令式和面向对象等多种编程范式,具备值类型、类和接口、泛型等特性。同时支持类型推断,拥有简明高效的语法以及语法糖和宏的能力,可提升开发效率。
- 安全可靠 :通过静态类型系统和自动内存管理,确保程序的类型安全和内存安全。同时提供数组下标越界检查、类型转换检查等运行时检查,并通过代码扫描工具等提供跨语言互操作安全和代码资产保护等支持。
- 轻松并发 :实现了轻量化用户态线程和并发对象库,线程的创建、调度和销毁等操作更加高效,且资源占用比系统线程更少。并发对象的方法是线程安全的,核心库还提供了无锁或者细粒度锁的算法实现,提升并发度。
- 卓越性能 :仓颉编译器及运行时从全栈对编译进行优化,包括编译器前端、后端以及运行时的优化。同时对运行时进行原生的轻量化设计,通过模块化分层设计和包的按需加载技术,减少资源占用。
- 应用场景:
- 鸿蒙应用场景 :凭借对现代语言特性的集成、全方位的编译优化与运行时实现,以及 IDE 工具链支持,为开发者缔造友好的开发体验和卓越的程序性能,便于开发者高效地完成鸿蒙 AI 原生应用的开发工作。
- 服务端 / 云化场景 :提供微服务应用开发框架,具备 IOC 容器、AOP 切面编程、ORM 和事务管理等能力,帮助开发者快速构建微服务应用。还可通过轻量级用户态线程以及高性能网络协议库,高效开发出高性能云服务应用。
交叉编译
虽然T536 MINI的能力很强,理论上可以本机编译,但是考虑到在开发板上编辑程序不方便,还是采用交叉编译的方式。前面我曾经在树莓派4上测试过仓颉的0.53版本,这次采用1.0版本,和先前的版本还是有些差别的。
工具链配置
先去仓颉的官方网站下载SDK软件包:下载中心-仓颉编程语言官网。
Linux的x86_64版本和aarch64版本都需要。x86_64的Linux软件包包括了x86_64下Linux和Windows所需要的开发包,但是没有包括aarch64的Linux所需要的文件,所以需要下载aarch64的Linux的开发包。
首先需要在x86_64的Ubuntu中安装AARCH64的编译器(我使用的是WSL2):
sudo apt install gcc-aarch64-linux-gnu
然后需要拷贝aarch64开发包中以下三个目录的文件到x86_64的Linux软件包的对应目录:
- cangjie/runtime/lib/linux_aarch64_llvm/
- cangjie/modules/linux_aarch64_llvm/
- cangjie/lib/linux_aarch64_llvm/
准备测试程序
我准备了一个多线程测试程序,测试程序如下:
import std.sync.*
import std.time.*
main(): Int64 {
// 启动 5 个仓颉线程,每个线程打印 3 次
for (i in 0..4) {
spawn {
for (j in 1..3) {
println("线程 ${i} 第 ${j} 次打印")
sleep(10 * Duration.millisecond)
}
}
}
// 主线程等待 100 ms,让子线程有机会执行
sleep(100 * Duration.millisecond)
println("主线程结束")
return 0
}
交叉编译Cangjie程序至少需要以下5个文件:
- Scrt1.o、crti.o和crtn.o文件在/usr/aarch64-linux-gnu/lib/目录下。
- crtbeginS.o和crtendS.o' '文件在/usr/lib/gcc-cross/aarch64-linux-gnu/11目录下( 路径有可能因为操作系统的不同而不同)。
此时需要使用--toolchain 或者-B 指定编译工具链中,二进制文件存放的路径。二进制文件包括:编译器、链接器、工具链等提供的 C 运行时目标文件(例如 crt0.o、 crti.o等)。在准备好编译工具链后,可以在将其存放在一个自定义路径,然后通过 --toolchain 向编译器传入该路径,即可让编译器调用到该路径下的二进制文件进行交叉编译。
可以对前面的hello.cj进行一下交叉编译:
cjc test.cj --target aarch64-unknown-linux-gnu -o test1 -B /usr/aarch64-linux-gnu/lib/ -B /usr/lib/gcc-cross/aarch64-linux-gnu/11 --static
编译完成后,会生成可执行文件main。 使用file命令检查一下确实生成了aarch64的文件。
test@ERAZE-UHYFLAFVU:/mnt/d/cangjie$ file test1
test1: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
编译过程中如果遇到下面的错误:/usr/bin/aarch64-linux-gnu-ld: cannot find -lstdc++: No such file or directory。请执行以下命令:
sudo ln -s /usr/aarch64-linux-gnu/lib/libstdc++.so.6 /usr/aarch64-linux-gnu/lib/libstdc++.so
程序运行
将程序拷贝到板子上运行,得到如下结果:
运行结果正确。和0.53版本比较,1.0版本的static选项比较好,分发程序变得很容易。
结束语
在开发板上执行仓颉语言程序还挺顺利。后面将测试更复杂的应用。