仓颉之编译和构建的奇妙旅程
1 概述
1.1 案例介绍
仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE工具链支持,为开发者打造友好开发体验和卓越程序性能。
案例结合代码体验,让大家更直观的了解仓颉语言中的编译和构建。
1.2 适用对象
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计40分钟。
1.4 案例流程
说明:
- 进入华为开发者空间,登录云主机;
- 使用CodeArts IDE for Cangjie编程和运行仓颉代码。
1.5 资源总览
资源名称 | 规格 | 单价(元) | 时长(分钟) |
---|---|---|---|
开发者空间 - 云主机 | 鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Ubuntu | 免费 | 40 |
仓颉之编译和构建的奇妙旅程 👈👈👈体验完整版案例,点击这里。
2 运行测试环境准备
2.1 开发者空间配置
面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。
领取云主机后可以直接进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。没有领取在开发者空间根据指引领取配置云主机即可,云主机配置参考1.5资源总览。
2.2 创建仓颉程序
点击桌面CodeArts IDE for Cangjie,打开编辑器,点击新建工程,保持默认配置,点击创建。
产物类型说明:
- executable,可执行文件;
- static,静态库,是一组预先编译好的目标文件的集合;
- dynamic,动态库,是一种在程序运行时才被加载到内存中的库文件,多个程序共享一个动态库副本,而不是像静态库那样每个程序都包含一份完整的副本。
2.3 运行仓颉工程
创建完成后,打开src/main.cj,参考下面代码简单修改后,点击编辑器右上角运行按钮直接运行,终端窗口可以看到打印内容。
package demo // 第一个仓颉程序 main(): Int64 { println("hello world") println("你好,仓颉!") return 0 }
(* 注意:后续替换main.cj文件代码时,package demo保留)
(* 仓颉注释语法:// 符号之后写单行注释,也可以在一对 /* 和 */ 符号之间写多行注释)
到这里,我们第一个仓颉程序就运行成功啦!后面案例中的示例代码都可以放到main.cj文件中进行执行,接下来我们继续探索仓颉语言。
3 仓颉之编译和构建
3.1 cjc使用
cjc是仓颉编程语言的编译命令,其提供了丰富的功能及对应的编译选项,本章将对基本使用方法进行介绍。关于编译选项详情,请查阅 cjc 编译选项章节。
cjc使用方式如下:
cjc [option] file...
具体代码操作如下:
Step1:在华为开发者空间云主机桌面新建hello.cj 文件,内容如下
main(): Int64 { println("hello Cangjie") println("你好,仓颉!") return 0 }
Step2:在华为开发者空间云主机桌面右键选择Open Terminal Here打开终端命令窗口。
Step3:在终端命令窗口输入命令:cjc hello.cj,编译文件,此时工作目录下会新增可执行文件main。
Step4:在终端命令窗口输入命令:./main,执行main文件。
3.2 cjpm介绍
CJPM(Cangjie Package Manager) 是仓颉语言的官方包管理工具,用于管理、维护仓颉项目的模块系统,并且提供更简易统一的编译入口,支持自定义编译命令。包管理器同时也提供基于仓颉语言原生的自定义构建机制,允许开发者在构建的不同阶段增加预处理和后处理流程,实现构建流程可灵活定制,能够满足开发者不同业务场景下的编译构建诉求。
cjpm基本使用方法:
通过 cjpm -h 即可查看主界面,由几个板块组成,从上到下分别是: 当前命令说明、使用示例(Usage)、支持的可用命令(Available subcommands)、支持的配置项(Available options)、更多提示内容。
具体操作如下:
在终端命令窗口输入命令:cjpm -h
cjpm init 用来初始化一个新的仓颉模块或者工作空间。初始化模块时会默认在当前文件夹创建 cjpm.toml 文件,并且新建 src 源码文件夹,在 src 下生成默认的 main.cj 文件。
具体操作如下:
cjpm build 用来构建当前仓颉项目,执行该命令前会先检查依赖项,检查通过后调用 cjc 进行构建。通过 cjpm build -V 命令可以打印所有的编译过程命令。
具体操作如下:
cjpm.toml配置文件说明:
配置文件 cjpm.toml 用来配置一些基础信息、依赖项、编译选项等内容,cjpm 主要通过这个文件进行解析执行。
配置文件代码如下所示:
[package] # 单模块配置字段,与 workspace 字段不能同时存在 cjc-version = "0.53.1" # 所需 `cjc` 的最低版本要求,必需 name = "demo" # 模块名及模块 root 包名,必需 description = "nothing here" # 描述信息,非必需 version = "1.0.0" # 模块版本信息,必需 compile-option = "" # 额外编译命令选项,非必需 link-option = "" # 链接器透传选项,可透传安全编译命令,非必需 output-type = "executable" # 编译输出产物类型,必需 src-dir = "" # 指定源码存放路径,非必需 target-dir = "" # 指定产物存放路径,非必需 package-configuration = {} # 单包配置选项,非必需 [workspace] # 工作空间管理字段,与 package 字段不能同时存在 members = [] # 工作空间成员模块列表,必需 build-members = [] # 工作空间编译模块列表,需要是成员模块列表的子集,非必需 test-members = [] # 工作空间测试模块列表,需要是编译模块列表的子集,非必需 compile-option = "" # 应用于所有工作空间成员模块的额外编译命令选项,非必需 link-option = "" # 应用于所有工作空间成员模块的链接器透传选项,非必需 target-dir = "" # 指定产物存放路径,非必需 [dependencies] # 源码依赖配置项,非必需 coo = { git = "xxx",branch = "dev" } # 导入 `git` 依赖 doo = { path = "./pro1" } # 导入源码依赖 [test-dependencies] # 测试阶段的依赖配置项,格式和 dependencies 相同,非必需 [script-dependencies] # 构建脚本的依赖配置项,格式和 dependencies 相同,非必需 [ffi.c] # 导入 C 语言的库依赖,非必需 clib1.path = "xxx" [profile] # 命令剖面配置项,非必需 build = {} # build 命令配置项 test = {} # test 命令配置项 customized-option = {} # 自定义透传选项 [target.x86_64-unknown-linux-gnu] # 后端和平台隔离配置项,非必需 compile-option = "value1" # 额外编译命令选项,适用于特定 target 的编译流程和指定该 target 作为交叉编译目标平台的编译流程,非必需 link-option = "value2" # 链接器透传选项,适用于特定 target 的编译流程和指定该 target 作为交叉编译目标平台的编译流程,非必需 [target.x86_64-w64-mingw32.dependencies] # 适用于对应 target 的源码依赖配置项,非必需 [target.x86_64-w64-mingw32.test-dependencies] # 适用于对应 target 的测试阶段依赖配置项,非必需 [target.x86_64-unknown-linux-gnu.bin-dependencies] # 仓颉二进制库依赖,适用于特定 target 的编译流程和指定该 target 作为交叉编译目标平台的编译流程,非必需 path-option = ["./test/pro0", "./test/pro1"] # 以文件目录形式配置二进制库依赖 [target.x86_64-unknown-linux-gnu.bin-dependencies.package-option] # 以单文件形式配置二进制库依赖 "pro0.xoo" = "./test/pro0/pro0.xoo.cjo" "pro0.yoo" = "./test/pro0/pro0.yoo.cjo" "pro1.zoo" = "./test/pro1/pro1.zoo.cjo"
3.3 条件编译
开发者可以通过预定义或自定义的条件完成条件编译;仓颉目前支持导入和声明的条件编译。
仓颉支持使用内置编译标记 @When 来完成条件编译,编译条件使用 [] 括起来,[] 内支持输入一组或多组编译条件。@When 可以作用于导入节点和除 package 外的声明节点。
内置编译条件变量:
仓颉提供了五个内置条件变量: os、 backend、 cjc_version、 debug 和 test。
os:
os表示目标平台的操作系统。os 支持 == 和 != 两种操作符。支持的操作系统有:Windows、Linux、macOS。
具体代码操作如下:
Step1:复制以下代码,替换main.cj文件中的代码。(保留package)
@When[os == "Linux"] func foo() { print("Linux, ") } @When[os == "Windows"] func foo() { print("Windows, ") } @When[os != "Windows"] func fee() { println("NOT Windows") } @When[os != "Linux"] func fee() { println("NOT Linux") } main() { foo() fee() }
Step2:点击编辑器右上角运行按钮直接运行,终端窗口可以看到打印内容。
如果在 Windows 环境下编译执行,会得到 Windows, NOT Linux 的信息;如果是在 Linux 环境下,则会得到 Linux, NOT Windows 的信息。
backend :
backend 是仓颉内置的条件。backend 条件支持 == 和 != 两种操作符。
支持的后端和处理器架构有:cjnative、cjnative-x86_64、cjnative-aarch64。
当使用的条件为 cjnative 时,仓颉编译器会自动获取当前运行环境的架构信息,并自动补全。
具体代码操作如下:
Step1:复制以下代码,替换main.cj文件中的代码。(保留package)
@When[backend == "cjnative-x86_64"] func foo() { print("cjnative-x86_64 backend, ") } @When[backend == "cjnative-aarch64"] func foo() { print("cjnative-aarch64 backend, ") } @When[backend != "cjnative-x86_64"] func fee() { println("NOT cjnative-x86_64 backend") } @When[backend != "cjnative-aarch64"] func fee() { println("NOT cjnative-aarch64 backend") } main() { foo() fee() }
Step2:点击编辑器右上角运行按钮直接运行,终端窗口可以看到打印内容。
cjc_version :
cjc_version 是仓颉内置的条件,开发者可以根据当前仓颉编译器的版本选择要编译的代码。cjc_version 条件支持 ==、!=、>、<、>=、<= 六种操作符,格式为 xx.xx.xx 支持每个 xx 支持 1-2 位数字,计算规则为补位 (补齐 2 位) 比较,例如:0.18.8 < 0.18.11, 0.18.8 == 0.18.08。
具体代码操作如下:
Step1:复制以下代码,替换main.cj文件中的代码。(保留package)
@When[cjc_version == "0.18.6"] func foo() { println("cjc_version equals 0.18.6") } @When[cjc_version != "0.18.6"] func foo() { println("cjc_version is NOT equal to 0.18.6") } @When[cjc_version > "0.18.6"] func fnn() { println("cjc_version is greater than 0.18.6") } @When[cjc_version <= "0.18.6"] func fnn() { println("cjc_version is less than or equal to 0.18.6") } @When[cjc_version < "0.18.6"] func fee() { println("cjc_version is less than 0.18.6") } @When[cjc_version >= "0.18.6"] func fee() { println("cjc_version is greater than or equal to 0.18.6") } main() { foo() fnn() fee() }
Step2:点击编辑器右上角运行按钮直接运行,终端窗口可以看到打印内容。
备注:根据 cjc 的版本,上面代码的执行输出结果会有不同。
debug :
debug 表示当前是否启用了调试模式即开启 -g 编译选项,可以用于在编译代码时进行调试和发布版本之间的切换。debug 条件仅支持逻辑非运算符(!)。
具体代码操作如下:
Step1:复制以下代码,替换main.cj文件中的代码。(保留package)
@When[debug] func foo() { println("debug") } @When[!debug] func foo() { println("NOT debug") } main() { foo() }
Step2:点击编辑器右上角运行按钮直接运行,终端窗口可以看到打印内容。
test :
test 表示当前是否启用了单元测试选项 --test。test 条件仅支持逻辑非运算符(!)。可以用于区分测试代码与普通代码。
具体代码操作如下:
Step1:复制以下代码,替换main.cj文件中的代码。(保留package)
@When[test] @Test class Tests { @TestCase public func case1(): Unit { @Expect("run", foo()) } } func foo() { "run" } @When[!test] main () { println(foo()) }
Step2:点击编辑器右上角运行按钮直接运行,终端窗口可以看到打印内容。
至此,仓颉之编译和构建的奇妙旅程内容已全部完成。
如果想了解更多仓颉编程语言知识可以访问:https://cangjie-lang.cn/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
仓颉之I/O 操作的交互奥秘
1 概述 1.1 案例介绍 仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE工具链支持,为开发者打造友好开发体验和卓越程序性能。 案例结合代码体验,让大家更直观的了解仓颉语言中的IO操作。 1.2 适用对象 个人开发者 高校学生 1.3 案例时间 本案例总时长预计40分钟。 1.4 案例流程 说明: 进入华为开发者空间,登录云主机; 使用CodeArts IDE for Cangjie编程和运行仓颉代码。 1.5 资源总览 资源名称 规格 单价(元) 时长(分钟) 开发者空间 - 云主机 鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Ubuntu 免费 免费 40 仓颉之I/O操作的交互奥秘👈👈👈体验完整版案例,点击这里。 2 运行测试环境准备 2.1 开发者空间配置 面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。 领取云主机后可以直接进入华为开发者空间工作台界面,...
- 下一篇
GreatSQL优化技巧:手动实现谓词下推
GreatSQL优化技巧:手动实现谓词下推 导语 最近总是听到用 AI 来优化 SQL 的言论,今天心血来潮试了一下,把表结构、统计信息、SQL语句、执行计划都告诉AI,AI给出了一大堆的建议,它会从索引,语句改写,参数调整各个方面给出优化策略,看似面面俱到,但是如果不懂优化理论,随便使用其给出的优化建议,可能的结果就是,一顿操作猛如虎,一看战绩零杠五。所以本人还是老老实实的总结优化技巧吧,这些案例技巧或许某天会成为 AI 的营养餐。 SQL 案例 SQL 案例语句:(实际业务场景太复杂,截取片段来说明本文主题) SELECT ta.*, tb.* FROM (SELECT * FROM (SELECT a.contactid, a.subs_number, a.log_time, ROW_NUMBER() OVER(PARTITION BY a.contactid, a.subs_number ORDER BY a.log_time DESC) rn, a.log_id FROM a WHERE a.contactid IS NOT NULL AND a.log_time >=...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 2048小游戏-低调大师作品
- CentOS8编译安装MySQL8.0.19