标准库网络密码学并发编程【免费下载链接】cangjie_stdx仓颉编程语言提供了 stdx 模块该模块提供了网络、安全等领域的通用能力。项目地址https://gitcode.com/Cangjie/cangjie_stdx点击查看免费下载本文围绕 cangjie_stdx 仓库中的stdx.chir包Cangjie High-level IR简称 CHIR展开完整梳理其 API 体系Type类型节点、CustomTypeDef类型定义、Package包模型、Value/Expression双层 IR 节点、CHIRBuilder构建器、CHIRVisitor/TypeVisitor访问器以及基于 FlatBuffers 的包序列化能力。读完本文后你将能够用stdx.chir在仓颉Cangjie代码中直接构建、遍历和序列化一份包级 IR理解其类型系统、控制流节点、溢出策略与调试位置的设计并结合 源码实现 掌握关键调用关系。注意官方文档明确标注该包当前处于开发阶段尚不具备完整功能见 doc/libs_stdx/chir/chir_package_overview.md。以下 API 说明均以当前仓库快照为准使用时应关注后续版本的演进。一、CHIR 包定位与源码组织CHIR 包提供的是包级高级中间表示IR它不是表达式级的 AST那是stdx.syntax的职责而是以基本块SSA 风格为执行单元、带完整类型系统与调用上下文的声明式 IR主要面向编译器前端/插件等需要程序化改写 IR 的场景。仓库中 CHIR 的全部实现位于src/stdx/chir/目录核心文件分工如下源码文件职责package.cjPackage、AccessLevel的定义与包级增删查接口type.cjType密封基类及其全部类型子类约 2300 行custom_type_def.cjCustomTypeDef系类/接口/结构体/枚举/扩展定义与成员value.cjValue系Block、BlockGroup、Function、GlobalVar、字面量、LocalVar、Parameter等expression.cjExpression系全部运算、分配、调用、转换、终止器节点约 4000 行chir_builder.cjCHIRBuilder、InsertPositionir_visitor.cjCHIRVisitor、IRActionModetype_visitor.cjTypeVisitor、TypeActionModeserialize.cj / deserialize.cjPackage的二进制序列化/反序列化FlatBuffersdebug_location.cjPosition、DebugLocationannotation.cjCustomAnnoInstance自定义注解实例chir_exception.cj检查型异常CHIRException官方 API 参考文档位于 类列表、枚举 与 结构体。从源码结构看CHIR 采用“类型Type与值Value分离、表达式Expression继承自 Value”的分层模型所有顶层节点均继承自内部基类Base见 base.cj它统一持有属性位AttributeInfo、CHIR 内部注解CHIRAnnoBase与调试位置DebugLocation这是后面理解isPublic()、isImported()等查询方法一致性的关键。二、Package 包模型与访问级别Package是整个 CHIR 图的根节点package.cj构造方式为Package(name: String, accessLevel: AccessLevel)它聚合了本包内的类型定义类/接口classDefs、结构体structDefs、枚举enumDefs、扩展extendDefs以及合并视图allCustomTypeDefs函数functions与全局变量globalVars包初始化函数packageInitFunc与字面量初始化函数packageLiteralInitFunc均为?Function。一个重要的设计点是**“导入定义与本地定义共存于同一列表”**源码注释明确说明 imported 定义同样存于classDefs等列表中仅以Imported属性区分因此Package同时提供classDefs本地与importedClassDefs导入两套属性枚举/扩展/结构体同理。从filterClassDefs(imported:)等私有方法的实现看过滤依据是def.isImported()属性位。访问级别 AccessLevelAccessLevel是三元枚举Internal本包及子包可见、Protected同 Module 下的包可见、Public所有包可见并派生ToString与Equatable。官方文档给出的可运行示例原文档示例完整保留import stdx.chir.* main() { let pkg Package(p, AccessLevel.Internal) println(pkg.accessLevel.toString()) }运行结果为internalProtected与Public分别输出protected、public。相等性比较满足变体自身相等、彼此不等import stdx.chir.* main() { println(op_eq_AccessLevel same: ${AccessLevel.Public AccessLevel.Public}) println(op_eq_AccessLevel diff: ${AccessLevel.Public AccessLevel.Internal}) }运行结果op_eq_AccessLevel same: true op_eq_AccessLevel diff: false构建与查询接口Package的“查询 构建”双接口是插件式开发的主要入口查询name、accessLevel、globalVars、functions、allCustomTypeDefs、packageInitFunc、packageLiteralInitFunc以及按签名检索的getSpecifiedFunction(mangledName)、getSpecifiedClassDef(packageName, srcCodeName)、getSpecifiedEnumDef、getSpecifiedStructDef均返回?可选值。构建addClass(identifier, srcCodeName, isClass, genericTypeParams!)、addEnum(identifier, srcCodeName, isExhaustive, genericTypeParams!)、addStruct(...)、addExtend(identifier, extendedType, genericTypeParams!)、addFunction(ty: FuncType, identifier, srcCodeName, packageName)、addGlobalVar(ty, identifier, srcCodeName, packageName)以及对应的addImportedClass、addImportedEnum、addImportedStruct、addImportedExtend。从 package.cj 的addFunction/addGlobalVar实现可以看到两条值得注意的约定传入的identifier是全局唯一符号名内部会拼接GLOBAL_SYMBOL_PREFIX前缀存储srcCodeName则是源码中写出的名字通过包 API 新建的函数/全局变量会被打上Attribute.PluginAdded属性位即“从源码结构看”CHIR 能够区分 IR 节点来自源码导入还是插件新增addFunction还会按FuncType.paramTypes自动预填参数节点appendParameter。此外dump()会打印包的字符串表示toString()输出包含包名、访问级别、全部自定义类型定义、全局变量与函数的文本便于调试。三、类型系统Type 节点体系Type是所有类型的密封抽象基类type.cj并暴露一组isXxx()判断方法用于类型判别例如isBoolType()、isIntType()、isFloatType()、isRefType()、isRawArrayType()、isVArrayType()、isClassLikeType()、isEnumType()、isStructType()、isFuncType()、isGenericType()、isTupleType()、isThisType()、isBoxType()、isNothingType()、isUnitType()、isCStringType()、isCPointerType()等约 40 个谓词均可在 type.cj 中逐一确认。类型节点的完整子类列表与官方文档一致类别类型节点说明内置标量BoolType、IntType、FloatType、RuneType、UnitType、NothingType继承BuiltinType/NumericType如IntType.getInt32()、IntType.getInt64()引用/指针RefTypeT、CPointerType、CStringType仓颉引用与 C 互操作类型装箱BoxType装箱类型数组RawArrayType、VArrayType原始数组与定长 VArray自定义类型实例化ClassLikeType、StructType、EnumType继承CustomType绑定CustomTypeDef与类型参数函数/泛型FuncType、GenericType函数类型参数类型返回类型与泛型形参其他TupleType、ThisType元组类型与This类型每个类型节点均派生Equatable可用于等值比较Type.typeArgs返回其类型参数数组这正是TypeVisitor递归遍历的依据见第七节。自定义类型定义CustomTypeDef 系与“类型实例”相对的“类型定义”由CustomTypeDef抽象基类统管子类为ClassLikeDef类/接口、StructDef、EnumDef、ExtendDef。CustomTypeDef提供统一的查询接口customAnnoInstances自定义注解实例、methods方法列表、staticVars静态变量等与构建接口从 custom_type_def.cj 可见其语义// appendMethod把方法追加进定义并回写方法的声明父节点 public func appendMethod(method: Function): Unit { _methods.add(method) method._declaredParent this } // appendStaticVar追加静态变量时自动置位 Static 属性 public func appendStaticVar(staticVar: GlobalVar): Unit { staticVar.setStatic(true) _staticVars.add(staticVar) staticVar._declaredParent this }成员变量由MemberVar描述custom_type_def.cj携带名称、类型、注解、属性位与调试位置并可持有initializerFunc。EnumDef额外提供EnumCtorInfo描述枚举变体/构造器名称、FuncType、注解实例。包级创建示例来自官方 结构体文档import stdx.chir.* main() { let pkg Package(p, AccessLevel.Public) let st pkg.addStruct(S_m, S) let mv st.appendInstanceMemberVar(x, IntType.getInt32()) let p mv.location.start println(p.line) // 输出 0无源码位置时为无效占位 }四、值Value与表达式ExpressionIR 节点体系CHIR 的节点继承关系为Value密封基类→GlobalValueFunction、GlobalVar与LiteralValue各类字面量Expression也是Value的子类表示“会产生一个值”的语句级节点Block、BlockGroup、LocalVar、Parameter则直接继承Value。值与基本块Valuevalue.cj提供isBlock()、isFunction()、isLiteral()、isParameter()等判别方法与replaceWith(other)替换接口Block是基本块appendExpr(expr)追加表达式、insertExpr(expr, at)按位置插入、destroySelf()销毁自身BlockGroup是基本块组appendBlock()追加块、setEntryBlock(block)指定入口块典型场景是循环/函数体这类由多个基本块组成的结构Function继承GlobalValueinitBody()初始化函数体并暴露大量查询/设置方法如isAbstract()/setFinal()、isStaticMemberMethod()/isInstanceMemberMethod()、setNoInline()、setClassConstructor()、setOverride()、moveBodyTo(other)等GlobalVar提供isReadOnly()/setReadOnly()、setInitializer(initializer)局部变量LocalVar与函数参数Parameter同样继承Value。GlobalValue提供destroySelf()销毁函数或全局变量同时GlobalValue暴露的isCompilerAdd()、isConst()、isExternalLinkage()、isImported()、isInternal()/setInternal()、isPublic()/setPublic()、isStatic()等接口与AccessLevel共同构成 IR 级的访问控制。字面量LiteralValue的子类与官方文档一致BoolLiteral、IntLiteral带isSigned()、FloatLiteral、RuneLiteral、StringLiteral、NullLiteral、UnitLiteral。构造通常使用静态工厂如IntLiteral.get(IntType.getInt64(), 1)、BoolLiteral.get(false)示例见 枚举文档。表达式分类Expression是密封抽象基类提供getArgs()获取子表达式列表其下的中间抽象类把表达式按语义分组官方文档列出的完整分类为分配AllocateBase→Allocate内存分配、TryAllocate带异常处理RawArrayAllocateBase→RawArrayAllocate、TryRawArrayAllocate、RawArrayInitByValue、RawArrayLiteralInit运算BinaryExpressionBase→BinaryExpression、TryBinaryExpressionUnaryExpressionBase→UnaryExpression、TryUnaryExpression调用FuncCall密封基类下分ApplyBase→Apply/TryApply直接函数调用与InvokeBase→Invoke/TryInvoke虚方法调用携带callee、methodNameIntrinsicBase→Intrinsic/TryIntrinsic内建函数调用类型转换TypeCast密封基类→Box、UnboxToRef、UnboxToValue、StaticCast、CastToConcrete、CastToGeneric、InstanceOfNumericCastBase→NumericCast、TryNumericCast内存访问Load、Store、Field按数字索引路径、FieldByName按字段名路径、GetElementByName、GetElementRef、StoreElementByName、StoreElementRef并发与其他SpawnBase→Spawn/TrySpawnVArrayBuilder、VArrayExprTuple元组构造Lambda提供isCompileTimeValue、isLocalFunc、returnValueDebug调试标记、Constant字面量常量、GetException、GetRTTI、GetRTTIStatic、GetInstantiateValue。控制流部分由Block/BlockGroup与终止器表达式构成Branch条件分支 if-else携带条件与 true/false 两个目标块、GoTo无条件跳转、Exit函数退出、MultiBranchswitch-case 多分支携带 default 块、目标块列表与 case 值列表、RaiseException抛出异常。所有Try*前缀节点均携带normal/err两个后继块即“带异常处理”的 IR 语义。五、CHIRBuilder在基本块中按位置插入表达式CHIRBuilderchir_builder.cj是构建函数体的核心工具它绑定一个父Block与插入点下标创建表达式时先构造节点、再insertAndAdvance插入并推进插入点从而保证连续创建自动顺序排布。插入位置 InsertPositionpublic enum InsertPosition { | AtEnd(Block) | AtStart(Block) | Before(Expression) | After(Expression) | ... }CHIRBuilder提供两个构造函数init(parent: Block)默认插入到块尾init(position: InsertPosition)支持块首/块尾/某表达式前后。从 chir_builder.cj 的实现可以看到Before(expr)/After(expr)会先在expr.owner中定位表达式下标若表达式不在其所属块中则抛出CHIRException未知位置同样抛异常——这是CHIRException检查型异常的典型使用场景提示 IR 状态必须保持一致。创建方法Builder 的create*方法覆盖了文档列出的全部表达式类型代表性签名如下完整列表见 chir_builder.cjcreateAllocate(ty: Type): Allocate createApply(callee: Value, funcCallCtx: FuncCallContext): Apply createBinaryAdd(leftOp: Value, rightOp: Value, overflow: OverflowStrategy): BinaryExpression createBranch(condition: Value, trueTarget: Block, falseTarget: Block): Branch createGoTo(target: Block): GoTo createInvoke(retTy: Type, callContext: InvokeCallContext): Invoke createExit(): Exit createLoad(location: Value): Load createStore(val: Value, location: Value): Store createNumericCast(srcVal: Value, dstTy: Type, overflow: OverflowStrategy): NumericCast createTryApply(callee: Value, funcCallCtx: FuncCallContext, normal: Block, err: Block): TryApply createSpawn(retTy: Type, val: Value): Spawn createTuple(elements: ArrayValue): Tuple createLambda(ty: FuncType, mangledName: String, srcName: String, ...): Lambda注意算术类createBinaryAdd/Sub/Mul/Div/Mod/Exp/LShift/RShift均要求显式传入overflow溢出策略比较与逻辑运算则不需要。六、调用上下文与溢出策略调用上下文FuncCallContextexpression.cj持有args实参Value列表、instTypeArgs实例化类型参数与可选objType支持setArg、setInstTypeArg修改是createApply/createTryApply的必备参数InvokeCallContextexpression.cj虚调用专用持有caller调用者、funcCallCtx、method目标Function与可选的overflowStrategyFuncSigInfoaux_data_structure.cj函数签名视图由名称、FuncType与泛型形参构成用于签名级比较与查找。溢出策略 OverflowStrategyOverflowStrategy四元枚举决定算术表达式溢出时的行为官方 枚举文档 给出完整示例NA不适用默认策略无需特殊溢出处理Wrapping回绕溢出时数值回绕到类型范围另一端Throwing溢出时抛出异常终止运算Saturating溢出时钳位到类型极值。文档示例原文保留import stdx.chir.* main() { let expr BinaryExpression.create(BinaryExprKind.Add, IntLiteral.get(IntType.getInt64(), 1), IntLiteral.get(IntType.getInt64(), 2)) expr.overflow OverflowStrategy.Wrapping println(expr.overflow.toString()) }运行结果Wrapping运算类别枚举UnaryExprKindNeg取负-x、Not逻辑非!b、BitNot按位取反~xBinaryExprKind算术Add/Sub/Mul/Div/Mod/Exp、移位LShift/RShift、位运算BitAnd/BitOr/BitXor、比较LT/GT/LE/GE/Equal/NotEqual、逻辑And/Or。两者均派生ToString与Equatable与OverflowStrategy的用法一致。七、访问器CHIRVisitor 与 TypeVisitor函数体遍历 CHIRVisitorCHIRVisitor是抽象访问器ir_visitor.cj配套控制枚举IRActionModeContinue/Stop/Skip。walk提供Function、BlockGroup、Block三个入口对Function先取body可选对Block则逐表达式调用子类实现的open func action(ty: Expression): IRActionMode并按返回值推进——Stop终止全部遍历Skip仅跳过该表达式自身的嵌套块组。默认action返回Continue子类只需覆写action即可观察每个表达式节点这是一种典型的访问者 早退模式实现。类型树遍历 TypeVisitorTypeVisitortype_visitor.cj对Type及其typeArgs做深度优先遍历控制枚举TypeActionMode为大写三变体CONTINUE/SKIP/STOPpublic func walk(ty: Type): Unit { if (isStop) { return } match (action(ty)) { case CONTINUE for (arg in ty.typeArgs) { walk(arg) } case SKIP return case STOP isStop true return } }即CONTINUE递归类型参数、SKIP只不进入当前节点子树、STOP全局终止。两个访问器的action均为open方法配合上一节的isXxx()谓词即可完成类型/IR 树的分析与统计。八、调试位置与自定义注解Position 与 DebugLocationPosition是结构体debug_location.cj持有 1 起计的line/column无效占位时为 0isValid()要求二者均大于 0toString()输出紧凑的-line-column形式。DebugLocation表示源码区间start/end两个Position加filePathstd.fs.Path并提供isValid()与人类可读的toString()输出文件名的行/列区间含可选 scope 链。从源码看每个 CHIR 节点通过内部Base默认持有DebugLocation.invalid()因此手工构建的 IR 若无源码信息location.start.line输出为 0——与第六节结构体文档中的示例输出一致。CustomAnnoInstanceCustomAnnoInstanceannotation.cj表示用户自定义注解实例classSrcCodeName注解类源码名、argValues字符串化实参列表与DebugLocation定位。节点上的多条注解以ArrayCustomAnnoInstance形式暴露如CustomTypeDef.customAnnoInstances、MemberVar与EnumCtorInfo的customAnnoInstances属性。九、序列化serializePackage / deserializePackage / freeSerializedMemoryCHIR 提供三个顶层函数把内存中的包图转为可持久/可传输的二进制格式serialize.cj、deserialize.cj// 序列化返回 (指向首字节的指针, 总字节长度) public func serializePackage(pkg: Package): (CPointerUInt8, Int64) // 反序列化从二进制缓冲区重建 Package public func deserializePackage(root: CPointerUInt8, length: Int64): Package // 释放序列化产生的内存 public func freeSerializedMemory(): Unit从 serialize.cj 的实现可见序列化底层采用FlatBuffers文件import flatbuffers.*模块级持有fbBuilder Builder(0)serializePackage先reset()再经CHIRSerializerImpl执行initialize → dispatch → convertToMemoryData产物是CHIRFormat系列生成表如CHIRFormat_DebugLocation、CHIRFormat_Pos、CHIRFormat_PackageAccessLevel。反序列化侧deserialize.cj会把指针缓冲区读入ArrayUInt8再交给CHIRDeserializerImpl重建对空指针会直接抛出CHIRException。因此典型的使用流程是serializePackage→ 消费字节 →freeSerializedMemory()回收注意释放的是序列化构建器持有的内存。十、异常模型CHIRExceptionchir_exception.cj是 CHIR 唯一的公开异常类型继承std.Exception属于检查型异常语义为“CHIR 构建或 IR 状态不一致时抛出”。源码中可见其触发点包括CHIRBuilder的非法插入位置表达式不属于目标块、deserializePackage的空指针等。由于它是 checked 异常自定义 Builder/Visitor 插件时应对其做捕获处理。十一、API 总览下表汇总stdx.chir当前公开的全部 API与官方 概览文档 一致详细文档请查阅 类、枚举、结构体。类类名功能Allocate / AllocateBase内存分配表达式及其密封抽象基类Apply / ApplyBase / TryApply函数调用表达式及基类BinaryExpression / BinaryExpressionBase二元运算表达式及基类Block / BlockGroup基本块与基本块组BoolLiteral / FloatLiteral / IntLiteral / NullLiteral / RuneLiteral / StringLiteral / UnitLiteral各类字面量Box / BoxType / UnboxToRef / UnboxToValue装箱类型及装箱/拆箱转换Branch / Exit / GoTo / MultiBranch / RaiseException终止器表达式BoolType / BuiltinType / CPointerType / CStringType / FloatType / IntType / NumericType / NothingType / RuneType / UnitType内置类型节点CHIRBuilder / CHIRException / CHIRVisitor构建器、检查型异常、IR 访问器CastToConcrete / CastToGeneric / StaticCast / NumericCast / TryNumericCast类型转换表达式ClassLikeDef / ClassLikeType / CustomType / CustomTypeDef类/接口定义与实例化类型、自定义类型基类Constant / CustomAnnoInstance / Debug / DebugLocation常量、注解实例、调试标记与源码位置EnumCtorInfo / EnumDef / EnumType枚举构造器信息、枚举定义与枚举类型Expression / ExtendDef表达式密封基类、扩展定义Field / FieldByName / GetElementByName / GetElementRef / StoreElementByName / StoreElementRef聚合体元素访问/存储Function / FuncCall / FuncCallContext / FuncSigInfo / FuncType函数定义、调用基类、调用上下文、签名信息、函数类型GenericType / GlobalValue / GlobalVar / InstanceOf泛型形参、全局值基类、全局变量、类型检查Intrinsic / IntrinsicBase / Invoke / InvokeBase / InvokeCallContext内建调用、虚调用及上下文Lambda / Load / LocalVar / MemberVarLambda/局部函数、内存加载、局部变量、成员变量Package / ParameterCHIR 包、函数参数RawArrayAllocate / RawArrayAllocateBase / RawArrayInitByValue / RawArrayLiteralInit / RawArrayType原始数组分配/初始化/类型Spawn / SpawnBase / TrySpawn并发 Spawn 表达式及基类StaticCast / Store / StringLiteral 等见上表静态转换、内存存储StructDef / StructType / ThisType / Tuple / TupleType / Type结构体定义/类型、This、元组、类型密封基类TryAllocate / TryBinaryExpression / TryIntrinsic / TryInvoke / TryRawArrayAllocate / TryUnaryExpression带异常处理的各 Try* 表达式TypeCast / TypeVisitor类型转换密封基类、类型访问器UnaryExpression / UnaryExpressionBase一元运算表达式及基类VArrayBuilder / VArrayExpr / VArrayTypeVArray 构建器、字面量与定长类型Value所有 CHIR 值的密封抽象基类顶层函数函数名功能serializePackage(pkg: Package): (CPointerUInt8, Int64)将 Package 序列化为二进制数据deserializePackage(root: CPointerUInt8, length: Int64): Package从二进制数据反序列化 PackagefreeSerializedMemory()释放序列化产生的内存枚举枚举名功能AccessLevel包访问级别Internal/Protected/PublicBinaryExprKind/UnaryExprKind二元/一元运算符类别InsertPositionCHIRBuilder 插入位置AtEnd/AtStart/Before/AfterIRActionMode/TypeActionModeCHIRVisitor / TypeVisitor 遍历控制模式OverflowStrategy溢出处理策略NA/Wrapping/Throwing/Saturating结构体结构体名功能Position源码行列位置1 起计isValid()要求行、列均大于 0十二、小结与使用建议心智模型Package是根类型定义CustomTypeDef系 函数/全局变量GlobalValue系构成声明层函数体内是BlockGroup→Block→Expression的执行层Type与CustomType/CustomTypeDef构成独立的类型层。构建 IR 的标准路径Package(name, AccessLevel)→addFunction/addGlobalVar/addClass/...→initBody()后创建BlockGroup/Block→CHIRBuilder(parent: Block)顺序插入表达式与终止器。分析 IR 的标准路径覆写CHIRVisitor.action遍历表达式树覆写TypeVisitor.action遍历类型树用isXxx()谓词做节点判别按IRActionMode/TypeActionMode控制遍历深度。注意事项CHIRException是检查型异常freeSerializedMemory需与serializePackage配对理解手工构建的节点默认没有源码位置Position为 0该包仍处于开发阶段API 以当前仓库快照为准确认参见 doc/libs_stdx/chir/chir_package_overview.md 开头的开发阶段说明。赞分享标准库网络密码学并发编程【免费下载链接】cangjie_stdx仓颉编程语言提供了 stdx 模块该模块提供了网络、安全等领域的通用能力。项目地址https://gitcode.com/Cangjie/cangjie_stdx点击查看免费下载相关推荐cangjie_stdx 中 CHIR 包类体系详解类型系统、类型定义与表达式构建器cangjie_stdx 中 CHIR 包类体系详解类型系统、类型定义与表达式构建器 本文以 cangjie_stdx 仓库中 stdx.chir Cang标准库网络密码学并发编程Rustc 的 THIR 详解类型化高层中间表示Typed High-Level IR的构造、存储与调试Rustc 的 THIR 详解类型化高层中间表示Typed High Level IR的构造、存储与调试 导读 THIRTyped High Level编程语言编译器语言运行时标准库cangjie_stdx 中 stdx.chir 的 Position 结构体CHIR 源码定位机制详解cangjie_stdx 中 stdx.chir 的 Position 结构体CHIR 源码定位机制详解 在仓颉语言的 stdx 扩展库中 stdx.chi标准库网络密码学并发编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考