cangjie_stdx 中的 stdx.chir:Cangjie High-level IR(CHIR)类型系统与中间表示详解
标准库网络密码学并发编程【免费下载链接】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),仅供参考

相关新闻

iOS 实时活动(Live Activity)开发指南

iOS 实时活动(Live Activity)开发指南

1. 引言实时活动(Live Activity)是 iOS 16.1 引入的一项功能,它允许应用在锁屏界面和灵动岛(Dynamic Island)上持续展示实时更新的信息,例如外卖配送进度、体育比赛比分、航班动态等。用户无需解锁手机或打…

2026/10/14 16:53:08 阅读更多 →
上海普陀区壁挂炉维修|LG壁挂炉维修|机身抖动共振异响预约检查|欧米到家服务热线

上海普陀区壁挂炉维修|LG壁挂炉维修|机身抖动共振异响预约检查|欧米到家服务热线

🔥 壁挂炉是家庭中冬季24小时不间断供暖与供热水的核心设备,一旦突发不点火、不加热、漏水异响或显示屏报错,全家取暖和热水往往立刻受影响。上海家庭使用的壁挂炉品牌繁多,电控逻辑和燃烧结构差异较大。本文系统梳理上海地区壁挂…

2026/10/14 16:53:08 阅读更多 →
Oracle 12c客户端静默安装实战:Linux无GUI环境标准化部署指南

Oracle 12c客户端静默安装实战:Linux无GUI环境标准化部署指南

1. 为什么必须掌握Oracle 12c客户端静默安装——一个被低估的运维基本功在某高校数据库实验室维护一套跨平台教学系统时,我遇到过这样一幕:三台新配的CentOS 7虚拟机需要统一部署Oracle 12c客户端,用于连接远程Oracle RAC集群。现场有位刚入职…

2026/10/14 16:53:08 阅读更多 →

最新新闻

东方财富行情数据接口抓取实战:从XHR响应到SQLite增量存储

东方财富行情数据接口抓取实战:从XHR响应到SQLite增量存储

做数据的人,十个里有八个都动过爬东方财富网的心思。这个系列第二篇,我不再抓静态页面,而是直接抓行情数据接口。上一篇跑通了最基础的页面解析,但那只是开胃菜:页面源码里看不到的几个关键字段——最新价、涨跌幅、成…

2026/10/14 17:37:01 阅读更多 →
B7-H3抗体:一种在肿瘤免疫治疗中兼具双重调控潜力的新兴靶点如何被研究?

B7-H3抗体:一种在肿瘤免疫治疗中兼具双重调控潜力的新兴靶点如何被研究?

B7-H3(又称CD276)是B7免疫共信号家族中的一种I型跨膜蛋白,在正常组织中表达有限,但在黑色素瘤、肺癌、前列腺癌等多种恶性肿瘤表面过表达。其确切功能机制尚存争议:早期研究支持其作为共刺激受体促进T细胞活化&#xf…

2026/10/14 17:37:01 阅读更多 →
Echarts折线图区域高亮交互实现指南

Echarts折线图区域高亮交互实现指南

1. 项目概述:让折线图真正“活”起来的交互细节Echarts 折线图区域鼠标事件高亮——这八个字背后,藏着一个被大量业务系统长期忽视却极其关键的用户体验断点。我做过不下二十个数据可视化项目,从某高校实验室的科研数据看板,到某公…

2026/10/14 17:37:01 阅读更多 →
压裂方案毕设头秃?这些 AI 工具可以这样搭着用 ✨

压裂方案毕设头秃?这些 AI 工具可以这样搭着用 ✨

先交代一下背景:我是石油工程方向的,毕业设计做的是某低渗透砂岩油藏水力压裂工艺方案设计。这类题目在工学 / 矿业类 / 石油工程专业里很典型——要读大量区块地质和压裂文献,要写开题报告和任务书,要做裂缝参数计算、施工参数优…

2026/10/14 17:37:01 阅读更多 →
Ubuntu上构建嵌入式LCD+触摸屏软件模拟器

Ubuntu上构建嵌入式LCD+触摸屏软件模拟器

1. 项目概述:为什么要在Ubuntu上跑开发板的LCD触摸屏模拟器?“Ubuntu——配置开发板lcd和触摸屏模拟器”这个标题乍看像一句操作指令,但背后藏着嵌入式开发中一个高频、高痛、却极少被系统梳理的实操场景:在通用PC环境里&#xff…

2026/10/14 17:37:01 阅读更多 →
IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

IntelliJ IDEA 的Qoder CN 插件报错“暂时无法同步代码库索引选择”怎么解决?完整排查与修复指南

摘要 本文针对在IDEA中使用Qoder CN时出现的报错,给出官方说明与实战解决步骤。官方指出需启用代码库索引:可点击“创建”手动启用,或切换“自动索引”。实战中,先登录Qoder CN且不要输入提示词,再进入设置—>Qode…

2026/10/14 17:36:00 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →