仓颉编程语言扩展库概述

仓颉编程语言扩展库(stdx)包含若干包,提供相关功能。

标准库为开发者提供了最通用的 API,而扩展库则专注于某一领域。如 compress 包提供压缩与解压缩能力,crypto 包提供加解密相关能力,net 包则专注于提供高效的网络协议解析和网络通信能力。

说明:

目前,官方提供的扩展库不随仓颉编译器、工具链一起发布,需要用户单独下载。

平台支持说明

扩展库提供的 API 支持在如下操作系统上运行:

注意:

部分 API 不支持在特定的操作系统运行,详情请参见对应 API 描述。

操作系统 CPU 架构 环境及其版本要求
Linux x86_64 glibc 2.22;Linux Kernel 4.12 或更高版本;系统安装 libstdc++ 6.0.24 或更高版本
Linux aarch64 glibc 2.27;Linux Kernel 4.15 或更高版本;系统安装 libstdc++ 6.0.24 或更高版本
Windows x86_64 Windows 10 或更高版本
macOS aarch64 macOS 12.0 或更高版本
OpenHarmony aarch64 OpenHarmony 5.1 或更高版本
OpenHarmony arm32 OpenHarmony 5.1 或更高版本
HarmonyOS aarch64 HarmonyOS 5.1 或更高版本
iOS aarch64 iOS 11 或更高版本(ast 库需要 iOS 12 或更高版本)
Android aarch64 Android API 26 或更高版本

使用指导

包依赖

导入库名 依赖包
import stdx.actors.* stdx.actors
import stdx.actors.macros.* stdx.actors.macros
import stdx.aspect_cj.* stdx.aspect_cj
import stdx.compress.zlib.* stdx.compress.zlib
import stdx.crypto.common.* stdx.crypto.common、stdx.encoding.base64
import stdx.crypto.crypto.* stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.crypto.digest.* stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.crypto.keys.* stdx.crypto.keys、stdx.crypto.x509、stdx.encoding.hex、stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.crypto.kit.* stdx.crypto.keys、stdx.crypto.x509、stdx.encoding.hex、stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.crypto.x509.* stdx.crypto.x509、stdx.encoding.hex、stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.effect.* stdx.effect
import stdx.encoding.hex.* stdx.encoding.hex
import stdx.encoding.base64.* stdx.encoding.base64
import stdx.encoding.json.* stdx.encoding.json、stdx.serialization.serialization
import stdx.encoding.json.stream.* stdx.encoding.json.stream
import stdx.encoding.url.* stdx.encoding.url
import stdx.log.* stdx.log
import stdx.logger.* stdx.logger
import stdx.serialization.serialization.* stdx.serialization.serialization
import stdx.syntax.* stdx.syntax
import stdx.fuzz.* stdx.fuzz
import stdx.net.http .* stdx.net.http、stdx.net.tls.common、stdx.logger、stdx.log、stdx.encoding.url、stdx.encoding.json.stream、stdx.crypto.x509、stdx.encoding.hex、stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.net.tls.* stdx.net.tls、stdx.net.tls.common、stdx.crypto.x509、stdx.encoding.hex、stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.net.tls.common.* stdx.net.tls.common、stdx.crypto.x509、stdx.encoding.hex、stdx.crypto.crypto、stdx.crypto.digest、stdx.crypto.common、stdx.encoding.base64
import stdx.unittest.data.* stdx.encoding.json、stdx.serialization.serialization

代码中导入上述包,用 cjc 命令去编译代码,需要严格按照上述包的依赖的顺序去链接。 如果是用 cjpm 则无需关注。

如果使用静态库,在导入 crypto 和 net 库时,由于需要依赖系统符号,所以 Windows 操作系统需要额外添加 -lcrypt32Linux 操作系统需要额外添加 -ldl。在导入 syntax 库时,Windows 操作系统需要额外添加 -lc++ -lunwindmacOS 操作系统需要额外添加 -lc++Linux 操作系统需要额外添加 -lstdc++ -lgcc_sAndroid 操作系统需要额外添加 -lc++ -lunwindiOS 操作系统需要额外添加 -lc++

cjc 使用命令示例

cjc 的介绍和编译请查看 cangjie 用户手册

import stdx.actors.*
import stdx.actors.macros.*
import stdx.aspect_cj.*
import stdx.compress.zlib.*
import stdx.crypto.crypto.*
import stdx.crypto.digest.*
import stdx.crypto.keys.*
import stdx.crypto.x509.*
import stdx.effect.*
import stdx.encoding.hex.*
import stdx.encoding.base64.*
import stdx.encoding.json.*
import stdx.encoding.url.*
import stdx.encoding.json.stream.*
import stdx.net.tls.*
import stdx.net.http.*
import stdx.log.*
import stdx.logger.*
import stdx.syntax.*
import stdx.serialization.serialization.*

main() {
    0
}

Linux 和 mac 的编译命令:

cjc main.cj -L $CANGJIE_STDX_PATH -lstdx.actors -lstdx.aspect_cj -lstdx.effect -lstdx.encoding.json -lstdx.serialization.serialization -lstdx.net.http -lstdx.net.tls -lstdx.net.tls.common -lstdx.logger -lstdx.log -lstdx.encoding.url -lstdx.encoding.json.stream -lstdx.crypto.kit -lstdx.crypto.keys -lstdx.crypto.x509 -lstdx.encoding.hex -lstdx.crypto.crypto -lstdx.crypto.digest -lstdx.crypto.common -lstdx.encoding.base64 -lstdx.compress.zlib -lstdx.compress -lstdx.syntax -lstdx.syntaxFFI -ldl --import-path $CANGJIE_STDX_PATH -o main.out

windows 编译命令:

cjc main.cj -L $CANGJIE_STDX_PATH -lstdx.actors -lstdx.aspect_cj -lstdx.effect -lstdx.encoding.json -lstdx.serialization.serialization -lstdx.net.http -lstdx.net.tls -lstdx.net.tls.common -lstdx.logger -lstdx.log -lstdx.encoding.url -lstdx.encoding.json.stream -lstdx.crypto.kit -lstdx.crypto.keys -lstdx.crypto.x509 -lstdx.encoding.hex -lstdx.crypto.crypto -lstdx.crypto.digest -lstdx.crypto.common -lstdx.encoding.base64 -lstdx.compress.zlib -lstdx.compress -lstdx.syntax -lstdx.syntaxFFI -lcrypt32 --import-path $CANGJIE_STDX_PATH -o main.out

CANGJIE_STDX_PATH 是设置的 stdx 路径。

例如在 linux 系统中设置:

export CANGJIE_STDX_PATH=/target/linux_x86_64_cjnative/dynamic/stdx

运行前 Linux 操作系统需要在 LD_LIBRARY_PATH 中设置扩展库的路径,Windows 操作系统需要在 PATH 中设置扩展库的路径,macOS 操作系统需要在 DYLD_LIBRARY_PATH 中设置扩展库的路径。

例如在 linux 系统中设置:

export LD_LIBRARY_PATH=/target/linux_x86_64_cjnative/dynamic/stdx:$LD_LIBRARY_PATH

cjpm 使用示例

cjpm 的介绍和使用请查看 cjpm 手册。

cjpm.toml 增加如下配置:

[target.x86_64-unknown-linux-gnu]
  [target.x86_64-unknown-linux-gnu.bin-dependencies]
    path-option = ["${CANGJIE_STDX_PATH}"]

上面配置中 x86_64-unknown-linux-gnu 表示的是系统架构信息,需要通过 cjc -v 获取,并替换成自己获取的系统架构信息。 CANGJIE_STDX_PATH 是设置的 stdx 路径。

注意:

在交叉编译的场景下,如果有自行开发宏包的需求,且需要依赖 stdx 实现宏包中的业务逻辑,那么除了目标运行平台以外,还需要配置本地开发平台的 stdx 路径。

包列表

stdx 含若干包,提供了丰富的扩展功能:

包名 功能
actors actors 包提供 actor 编程模型的基础能力。
actors.macros actors.macros 包提供把 class 变成 active object 的能力。
aspect_cj aspect_cj 包提供 Cangjie 中面向切面编程(Aspect Oriented Programming, AOP)相关的能力。
compress.zlib compress 包提供压缩解压功能。
crypto.common crypto.common 包提供了加解密相关接口。
crypto.crypto crypto 包提供安全加密能力。
crypto.digest digest 包提供常用的消息摘要算法。
crypto.keys keys 包提供非对称加密和签名算法。
crypto.kit crypto.kit 包提供了一套 CryptoKit 的默认实现,提供随机数生成器及解码 DER、PEM 的能力。
crypto.x509 x509 包提供处理数字证书功能。
effect stdx.effect 包是 Cangjie 中用于使用 Effect Handler 的用户级 API。这是一项实验性功能,需要配合支持该机制的 Cangjie 编译器使用。
encoding.base64 base 包提供字符串的 Base64 编码及解码。
encoding.hex hex 包提供字符串的 Hex 编码及解码。
encoding.json json 包用于对 json 数据的处理,实现 String, JsonValue, DataModel 之间的相互转换。
encoding.json.stream json.stream 包主要用于仓颉对象和 JSON 数据流之间的互相转换。
encoding.url url 包提供了 URL 相关的能力,包括解析 URL 的各个组件,对 URL 进行编解码,合并 URL 或路径等。 。
fuzz fuzz 包为开发者提供基于覆盖率反馈的仓颉 fuzz 引擎及对应的接口,开发者可以编写代码对 API 进行测试。
log log 包提供了日志记录相关的能力。
logger logger 包提供文本格式和 JSON 格式日志打印功能。
net.http http 包提供 HTTP/1.1,HTTP/2,WebSocket 协议的 server、client 端实现。
net.tls tls 包用于进行安全加密的网络通信,提供创建 TLS 服务器、基于协议进行 TLS 握手、收发加密数据、恢复 TLS 会话等能力。
net.tls.common tls.common 包提供了 TLS 相关的抽象接口,用于适配多种 TLS 实现。
serialization serialization 包提供了序列化和反序列化能力。
syntax syntax 包主要包含了仓颉源码的语法解析器和仓颉语法树节点,提供语法解析函数。
unittest.data unittest 模块提供了单元测试扩展能力。
string_intern string_intern 模块提供字符串内联缓存能力。