初识仓颉语言

仓颉编程语言是一种面向全场景应用开发的通用编程语言,可以兼顾开发效率和运行性能,并提供良好的编程体验,主要具有如下特点:

语法简明高效

仓颉编程语言提供了一系列简明高效的语法,旨在减少冗余书写、提升开发效率,例如插值字符串主构造函数Flow 表达式match重导出等语法,让开发者可以用较少编码表达相关逻辑。

main() {
    let lang = "cangjie"
    "hello, ${lang}!" |> println // 插值字符串和 pipeline 表达式

    // Lamda 表达式
    let applyFunc = {
        v: Int64, f: (Int64) -> Int64 => f(v)
    }

    let double = {x: Int64 => x * 2}
    let square = {x: Int64 => x * x}

    // composition 表达式
    let doubleAfterSquare = square ~> double 

    applyFunc(5) {it => it + 3} |> println  // 尾随 lambda
    doubleAfterSquare(3) |> println   
}

多范式编程

仓颉编程语言支持函数式命令式面向对象等多范式编程,融合了高阶函数代数数据类型模式匹配泛型等函数式语言的先进特性,还有封装接口继承子类型多态等支持模块化开发的面向对象语言特性,以及值类型全局函数等简洁高效的命令式语言特性。开发者可以根据开发偏好或应用场景,选用不同的编程范式。

  • 含匹配值的 match 表达式:
main() {
    let x = 0
    match (x) {
        case 1 => let r1 = "x = 1"
                  print(r1)
        case 0 => let r2 = "x = 0" // Matched.
                  print(r2)
        case _ => let r3 = "x != 1 and x != 0"
                  print(r3)
    }
}
  • 没有匹配值的 match 表达式:
main() {
    let x = -1
    match {
        case x > 0 => print("x > 0")
        case x < 0 => print("x < 0") // Matched.
        case _ => print("x = 0")
    }
}

类型安全

仓颉编程语言是静态强类型语言,通过编译时类型检查尽早识别程序错误,降低运行时风险,也便于代码维护。同时,仓颉编译器提供了强大的类型推断能力,可以减少类型标注工作,提高开发效率。

内存安全

仓颉编程语言支持自动内存管理,并在运行时进行数组下标越界检查、溢出检查等,确保运行时内存安全。

@OverflowThrowing
main() {
let res: Int8 = Int8(100) + Int8(29)
// 100 + 29 在数学上等于 129,在 Int8 的表示范围上发生了上溢出,程序抛出异常
res |> println
}

高效并发

仓颉编程语言提供了用户态轻量化线程(原生协程),以及简单易用的并发编程机制,保证并发场景的高效开发和运行。

import std.sync.*
import std.time.*

main() {
spawn { =>
    println("New thread before sleeping")
    sleep(100 * Duration.millisecond) // sleep for 100ms.
    println("New thread after sleeping")
}
println("Main thread")
}

兼容语言生态

仓颉编程语言支持和 C 等主流编程语言的互操作,并采用便捷的声明式编程范式,可实现对其他语言库的高效复用和生态兼容。

// declare the function by `foreign` keyword, and omit `@C`
foreign func rand(): Int32
foreign func printf(fmt: CString, ...): Int32

main() {
// call this function by `unsafe` block
let r = unsafe { rand() }
println("random number ${r}")
unsafe {
    var fmt = LibC.mallocCString("Hello, No.%d\n")
    printf(fmt, 1)
    LibC.free(fmt)
}
}

领域易扩展

仓颉编程语言提供了基于词法宏的元编程能力,支持在编译时变换代码,此外,还提供了尾随 lambda属性操作符重载、部分关键字可省略等特性,开发者可由此深度定制程序的语法和语义,有利于内嵌式领域专用语言(Embedded Domain Specific Languages,EDSL)的构建。

通常 Memoize 的使用需要开发者手动实现存储和提取的功能。通过宏,可以自动化这一过程。宏的效果如下:

@Memoize[true]
func fib(n: Int64): Int64 {
    if (n == 0 || n == 1) {
        return n
    }
    return fib(n - 1) + fib(n - 2)
}

main() {
    let start = DateTime.now()
    let f35 = fib(35)
    let end = DateTime.now()
    println("fib(35): ${f35}")
    println("execution time: ${(end - start).toMicroseconds()} us")
}

助力 UI 开发

UI 开发是构建端侧应用的重要环节,基于仓颉编程语言的元编程和尾随 lambda 等特性,可以搭建声明式 UI 开发框架,提升 UI 开发效率和体验。

内置库功能丰富

仓颉编程语言提供了功能丰富的内置库,涉及数据结构常用算法数学计算正则匹配系统交互文件操作网络通信数据库访问日志打印解压缩编解码加解密序列化等功能。