Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

仓颉编程语言扩展库概述

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

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

说明:

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

平台支持说明

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

注意:

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

操作系统CPU 架构环境及其版本要求
Linuxx86_64glibc 2.22;Linux Kernel 4.12 或更高版本;系统安装 libstdc++ 6.0.24 或更高版本
Linuxaarch64glibc 2.27;Linux Kernel 4.15 或更高版本;系统安装 libstdc++ 6.0.24 或更高版本
Windowsx86_64Windows 10 或更高版本
macOSaarch64macOS 12.0 或更高版本
OpenHarmonyaarch64OpenHarmony 5.1 或更高版本
OpenHarmonyarm32OpenHarmony 5.1 或更高版本
HarmonyOSaarch64HarmonyOS 5.1 或更高版本
iOSaarch64iOS 11 或更高版本(ast 库需要 iOS 12 或更高版本)
Androidaarch64Android API 26 或更高版本

使用指导

仓颉编程语言扩展库 stdx 二进制包包含静态(static)和 动态 (dynamic) 两部分,请按需引用。

二进制产物结构

二进制包解压出来的目录包含 dynamic 和 static 两个目录:

dynamic/stdx 是动态产物,包含动态文件、cjo、bc 文件。

static/stdx 是静态产物,包含静态文件、cjo、bc 文件。

使用 Openssl 静态库链接

假设存放 Openssl 静态库的目录为 STATIC_OPENSSL_DIR,则命令如下。

# GNU ld64
cjc -L $STATIC_OPENSSL_DIR --link-option "-Bstatic" --link-option "--whole-archive" -lssl -lcrypto --link-option "--no-whole-archive" --link-option "-Bdynamic" main.cj

# Apple ld64
cjc -L $STATIC_OPENSSL_DIR --link-option "-force_load" --link-option "$STATIC_OPENSSL_DIR/libssl.a" --link-option "-force_load" --link-option "$STATIC_OPENSSL_DIR/libcrypto.a" main.cj

包依赖

导入库名依赖包
import stdx.actors.*stdx.actors
import stdx.actors.macros.*stdx.actors.macros
import stdx.aspectCJ.*stdx.aspectCJ
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.fuzz.*stdx.fuzz.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

cjc 使用命令示例

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

import stdx.actors.*
import stdx.actors.macros.*
import stdx.aspectCJ.*
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.aspectCJ -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.aspectCJ -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 含若干包,提供了丰富的扩展功能:

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