本节介绍仓颉编程语言的标识符和程序结构。
标识符
在仓颉编程语言中,开发者可以给一些程序元素命名,这些名字也被称为“标识符”,标识符分为普通标识符和原始标识符两类,它们分别遵从不同的命名规则。
普通标识符不能和仓颉关键字相同,可以取自以下两类字符序列:
由“XID_Start”字符开头,后接任意长度的“XID_Continue”字符
由一个“_”开头,后接至少一个“XID_Continue”字符
其中,“XID_Start”、“XID_Continue”定义见Unicode标准。仓颉使用Unicode标准15.0.0(https://www.unicode.org/reports/tr31/tr31-37.html)。
仓颉把所有标识符识别为Normalization Form C (NFC) 后的形式。两个标识符如果在NFC后相等,则认为是相同的标识符。
例如,以下每行字符串都是合法的普通标识符:
abc
_abc
abc_
a1b2c3
a_b_c
a1_b2_c3
仓颉
__こんにちは
以下每行字符串都是不合法的普通标识符:
ab&c // 使用了非法字符 “&”
3abc // 数字不能出现在头部
while // 不能使用仓颉关键字
原始标识符是在普通标识符或仓颉关键字的外面加上一对反引号,主要用于将仓颉关键字作为标识符的场景。
例如,以下每行字符串都是合法的原始标识符:
`abc`
`_abc`
`a1b2c3`
`if`
`while`
`à֮̅̕b`
以下每行字符串,由于反引号内的部分是不合法的普通标识符,所以它们整体也是不合法的原始标识符:
`ab&c`
`3abc`

程序结构
通常,我们都会在扩展名为.cj的文本文件中编写仓颉程序,这些程序和文件也被称为源代码和源文件,在程序开发的最后阶段,这些源代码将被编译为特定格式的二进制文件。
在仓颉程序的顶层作用域中,可以定义一系列的变量、函数和自定义类型(如struct、class、enum和interface等),其中的变量和函数分别被称为全局变量和全局函数。如果要将仓颉程序编译为可执行文件,则需要在顶层作用域中定义一个main函数作为程序入口,它可以有Array<String>类型的参数,也可以没有参数,它的返回值类型可以是整数类型或Unit类型。
注:定义main函数时,不需要写func修饰符。此外,如果需要获取程序启动时的命令行参数,可以声明和使用Array<String>类型参数。
例如在以下程序中,我们在顶层作用域定义了全局变量g和全局函数b,还有自定义类型C、D和E,以及作为程序入口的main函数。
let g = 2022
func b() {}
struct C {}
class D {}
enum E { F | G }
main() {
println(g)
}
在非顶层作用域中不能定义上述自定义类型,但可以定义变量和函数,称之为局部变量和局部函数。特别地,对于定义在自定义类型中的变量和函数,称之为成员变量和成员函数。
注:enum和interface中仅支持定义成员函数,不支持定义成员变量。
例如在以下程序中,我们在顶层作用域定义了全局函数a和自定义类型A,在函数a中定义了局部变量b和局部函数c,在自定义类型A中定义了成员变量b和成员函数c。
func a() {
let b = 2023
func c() {
println(b)
}
c()
}
class A {
let b = 2024
public func c() {
println(b)
}
}
main() {
a()
A().c()
}
运行以上程序,将输出:
2023
2024
本节示例可以在“program_structure_demo”应用下找到。
参考引用
- 免费开源书《跟老卫学仓颉编程语言开发》
- 免费开源书《跟老卫学HarmonyOS开发》
- HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)(视频)
- 仓颉编程从入门到实践(北京大学出版社)

随时随地看视频