开发环境:DebianGNU/Linux11(bullseye)
编译工具:cjc(CangjieCompiler:0.51.4)
让我们从经典的HelloWorld程序开始,这是学习任何新语言的第一步。在仓颉中,编写一个HelloWorld程序非常简单:
//thefirstcangjieprogrammain(){println("Hello,World!")}保存并编译,编译后执行程序:
#cjc./hello.cj-ohello#./helloHello,World!代码解读点评:main方法比其他语言更加简洁,感觉已经做到最简了。
仓颉目前的基本数据类型,包括:整数类型、浮点类型、布尔类型、字符类型、字符串类型、Unit类型、元组类型、区间类型、Nothing类型。
varx=100i8//xis100withtypeInt8vary=0x10u64//yis16withtypeUInt64varz=0o432i32//zis282withtypeInt32i8为Int8的简写,u64代表UInt64,i32代表Int32,其它类推。
点评:这种整数类型定义更像GO的语法
浮点类型包括Float16、Float32和Float64
leta:Float32=3.14letb:Float32=2e3letc:Float32=2.4e-1点评:跟Go一样,有点感叹仓颉是集各家语言之优点。
布尔类型使用Bool表示,用来表示逻辑中的真和假。布尔类型只有两个字面量:true和false。
leta:Bool=trueletb:Bool=false字符类型字符类型使用Char表示,可以表示Unicode字符集中的所有字符。
leta:Char='a'letnewLine:Char='\n'main(){lethe:Char='\u{4f60}'letllo:Char='\u{597d}'print(he)print(llo)}字符串类型字符串类型使用String表示,用于表达文本数据,由一串Unicode字符组合而成。支持字符串字面量跨越多行。
lets2="HelloCangjieLang"lets2="""Hello,CangjieLang"""点评:支持多行文本,也很像GO
元组(Tuple)可以将多个不同的类型组合在一起,成为一个新的类型。元组类型使用(T1,T2,...,TN)表示,其中T1到TN可以是任意类型,不同类型间使用逗号(,)连接。
main(){varpi=(3.14,"PI")println(pi[0])println(pi[1])}编译并执行上述代码,输出结果为:
3.140000PI点评:哈哈,元组这不是python的结构么,跟java的枚举很像,但java语法太啰唆,这种元组结构有点小清新。
区间类型用于表示拥有固定步长的序列,区间类型是一个泛型,使用Range表示。区间字面量有两种形式:“左闭右开”区间“和“左闭右闭”区间,格式分别为:start..end:step,start..=end:step。
letn=10letr1=0..10:1//r1contains0,1,2,3,4,5,6,7,8,9letr2=0..=n:1//r2contains0,1,2,3,4,5,6,7,8,9,10点评:区间类型放在泛型中,也许有它的用武之地吧
Nothing是一种特殊的类型,它不包含任何值,并且Nothing类型是所有类型的子类型。break、continue、return和throw表达式的类型是Nothing,程序执行到这些表达式时,它们之后的代码将不会被执行。其中break、continue只能在循环体中使用,return只能在函数体中使用。
点评:官方对这种结构,描述得不是很清楚,只是强调目前编译器还不允许在使用类型的地方显式地使用Nothing类型,慢慢学习吧。
模式匹配使代码更加简洁和易读。以下是一个使用模式匹配的示例:
main(){letx=0match(x){case1=>letr1="x=1"print(r1)case0=>letr2="x=0"//Matched.print(r2)case_=>letr3="x!=1andx!=0"print(r3)}}编译并执行上述代码,输出结果为:
x=0点评:感觉是对casewhen结构的优化和灵活化
仓颉支持高阶函数,使得函数可以作为参数传递和返回值,甚至变量类型。
示例:函数名为printAdd,其类型是((Int64,Int64)->Int64,Int64,Int64)->Unit,表示该函数有三个参数,参数类型分别为函数类型(Int64,Int64)->Int64和两个Int64,返回类型为Unit。
funcprintAdd(add:(Int64,Int64)->Int64,a:Int64,b:Int64):Unit{println(add(a,b))}函数类型作为返回类型如下示例中,函数名为returnAdd,其类型是()->(Int64,Int64)->Int64,表示该函数无参数,返回类型为函数类型(Int64,Int64)->Int64。注意,->是右结合的。
funcadd(a:Int64,b:Int64):Int64{a+b}funcreturnAdd():(Int64,Int64)->Int64{add}main(){vara=returnAdd()println(a(1,2))}函数类型作为变量类型函数名本身也是表达式,它的类型为对应的函数类型。
funcadd(p1:Int64,p2:Int64):Int64{p1+p2}letf:(Int64,Int64)->Int64=add点评:学习javascript函数的灵活式,因为灵活性才有无限多可能呀。
当开发者希望并发执行某一段代码时,只需创建一个仓颉线程即可。要创建一个新的仓颉线程,可以使用关键字spawn并传递一个无形参的lambda表达式,该lambda表达式即为在新线程中执行的代码。
fromstdimportsync.*fromstdimporttime.*main():Int64{spawn{=>println("Newthreadbeforesleeping")sleep(100*Duration.millisecond)//sleepfor100ms.println("Newthreadaftersleeping")}println("Mainthread")return0}注意:在上面的例子中,新线程会在主线程结束时一起停止,无论这个新线程是否已完成运行。上方示例的输出每次可能略有不同,有可能会输出类似如下的内容:
NewthreadbeforesleepingMainthread点评:比java创建线程语法简洁多了,是否能做到GO语言的并发性能,拭目以待吧。
仓颉语言通过其高效编译器优化和并行计算能力,在运行速度上与其他主流编程语言相比具有明显优势。以下是与常见编程语言的运行速度对比:
华为仓颉编程语言作为一款新兴的高性能编程语言,在语法设计、性能优化、安全性和兼容性方面都展现了其独特的优势。虽然目前在生态系统和社区支持方面还有待完善,但随着技术的发展和社区的壮大,仓颉有望在未来成为主流编程语言之一。最后希望仓颉越来越好,祝愿华为越来越强!