MatIEC Stage4源码解析:从AST到C代码的PLC编译器后端实现
MatIEC 这个开源项目估计玩 PLC 上位机开发或者做工业编译器的人多少都有印象。它比那些只能出汇编的教学编译器务实得多整个架构直接照搬了经典的多阶段编译流程词法、语法、语义一层层剥下去最后在 Stage4 这个模块里把抽象语法树AST翻译成可执行的 C 代码再借助通用的 C 编译器落到具体芯片上。如果你正准备啃 MatIEC 的源码或者打算自己写一个把 IEC 61131-3 语言转到 C 的转换器Stage4 一定是绕不开的主战场。这篇内容不聊理论直接拆 Stage4 的活儿到底怎么干的、有哪些坑、怎么调试希望能帮你少走弯路。1. Stage4 在整个 MatIEC 编译流水线中的位置1.1 一条流水线为什么偏偏要拆出 Stage4MatIEC 的编译流程和 GCC 的经典三段式很像预处理和词法分析负责把源代码拆成 token语法分析根据 IEC 61131-3 文法把 token 组装成抽象语法树语义分析在树上做类型检查和作用域解析。前三个阶段得到的是一个“合法且自洽”的程序表示但离真正能运行的目标代码还隔着一条鸿沟。Stage4 就是填这条鸿沟的。它的输入是已经完成语义检查的 AST输出是目标代码。在 MatIEC 里目标代码默认是 C 语言而非汇编、字节码或二进制。把 AST 转成 C 的做法看起来有点绕但非常聪明PLC 要跑的平台千差万别从裸机单片机到带操作系统的工控机都有MatIEC 不可能为每种芯片单独写后端。它选择生成 C 代码等于把所有指令选择、寄存器分配、指令调度问题全部下放给 C 编译器自己只需要关心“语义怎么翻译成 C 语句”这一件事。所以 Stage4 的本质是一个源语言到源语言source-to-source的翻译器而不是传统意义上的代码生成器。这也是为什么 MatIEC 的代码能在一个月内从零写出可以运行的原因——后端不碰硬件难度瞬间降了一个量级。我在啃源码的时候最大的体会是先别急着打开 Stage4 的文件先把前面几个 Stage 的数据结构理清楚。因为 Stage4 几乎所有工作都是在 AST 的节点类型上做模式匹配。如果你不清楚某个节点在语义阶段是怎么被填充的翻译逻辑就会像在读天书。1.2 进入 Stage4 时AST 长什么样MatIEC 的 AST 节点是典型的 C 结构体加枚举类型组合核心的节点类型大概几十种覆盖了 IEC 61131-3 的三大文本语言指令表 IL、结构化文本 ST、以及声明部分的变量定义和功能块实例。需要特别注意的是MatIEC 在进入 Stage4 之前并没有像很多现代编译器那样做非常复杂的 AST 改写。它保留了原始程序里的绝大部分结构。比如 ST 语言的IF...THEN...ELSIF...ELSE在 AST 里就是一个分层的“条件语句”节点IL 语言因为本身是累加器模型AST 里也会保留那种“当前结果寄存器”的语义而不是在执行前统一转成三地址码。这一点直接决定了 Stage4 的输出风格。MatIEC 生成 C 代码时不是把每种高级结构都降级成统一的中间循环或分支而是尽量一一对应地翻译ST 的IF翻译成 C 的ifFOR翻译成 C 的forIL 的LD指令翻译成对虚拟累加器变量的赋值。这种“直译式”策略的好处是输出的 C 代码可读性很高坏处是有些混合语言场景会带来微妙的问题比如 IL 和 ST 混合编写时作用域内的临时变量名称管理就会变得更复杂。所以在你开始写 Stage4 的任何输出逻辑前建议先用调试模式把 AST dump 出来仔细看看内存结构。我自己习惯的做法是在 Stage3 结束后打断点手动遍历几个典型的 AST 节点确认变量声明、表达式、语句的挂载方式。这一步能省掉后面两天的排查时间。2. 从 AST 到目标代码的转换思路2.1 为什么不是直接在语法树里改输出有些初学者会问既然 AST 都已经把所有信息都包含了为什么不在语法树上挂一些函数指针直接“打印”出 C 代码而要单独写一个完整的遍历器答案是职责分离。语法树是一个“静态”的数据结构它描述程序长什么样但不负责描述程序该怎么执行。Stage4 要做的是执行语义层面的事情变量去重、类型提升、临时变量生成、标签编号、作用域切换、多层嵌套表达式展开、函数调用栈接口的生成。这些逻辑如果混在 AST 构建代码里整个项目会变成一锅粥。你要是维护过那种“一边建树一边输出”的代码就知道改一个功能要牵连三四处调试的时候根本下不了手。Stage4 使用的模式是经典的 Visitor 模式。它会定义一个遍历基类里面有一堆visitXXX函数每个函数对应一个 AST 节点类型同时维护一个输出缓冲区。遍历时带着当前作用域上下文、当前函数信息、临时变量计数器这些“状态”每访问一个节点就往缓冲区里写对应的 C 代码。这套模式的好处在于你可以通过继承或参数配置来改变输出风格。比如需要生成不同平台的 C 方言可以派生出一个新的 visitor只覆盖少数节点函数其他逻辑复用。实际项目里有很多人把 Layer 4 做成可扩展的 visitor 集群就是基于这个原因。2.2 生成 C 代码时的关键映射关系想要看懂 Stage4 的代码最重要的就是理解一张“语义映射表”。我把它整理成表格记在笔记里反复对照IEC 61131-3 元素Stage4 输出的 C 元素备注PROGRAM / FUNCTION_BLOCKC 函数或结构体数组每个功能块实例对应一份数据函数放在“组函数”中VAR_INPUT / VAR_OUTPUT结构体成员变量通过实例结构体访问比如FB1__I0LD 指令对累加器变量赋值如__tmp __S0;ST 指令将累加器导出到变量如__Q0 __tmp;ST 的条件语句C 的if / else if / else嵌套关系直接对应ST 的循环语句C 的for / while注意循环边界差异IEC 默认不检查变量修改功能块调用函数调用 实例数据 pointer 传递涉及多实例展开问题类型名统一映射到 C typedef如 BOOL 映射为__BOOL数组映射为 C 数组下标从 0 开始还是从 1 开始要加偏移这张表看着简单但真正做起来每一个映射都有细节。比如LD指令在 IL 语义里是把操作数放入“当前结果寄存器”。Stage4 为这个寄存器专门生成一个局部变量名字可以自己定关键是保证嵌套表达式求值时不会被其他临时变量撞名。再看 ST 和 IL 混合的情况。一个功能块里如果主体是 ST但中间夹杂了几段 ILStage4 会将这两段统一放到同一个函数体里并各自维护自己的临时寄存器变量。如果两段代码互相访问对方的变量必须通过变量表做唯一命名不能直接沿用 IL 的短名字。2.3 作用域、变量表和名称修饰这是 Stage4 中最容易出问题的地方也是很多人读源码时最头疼的。IEC 61131-3 允许在程序组织单元POUs里定义局部变量也在全局变量列表中定义全局变量还允许功能块实例互相嵌套。如果 Stage4 直接把这些变量名照搬到 C 代码里命名冲突一定无法避免。比如你在两个功能块里都定义了一个局部变量counter映射成 C 之后如果都叫counterC 编译阶段立刻重定义报错。Stage4 的解决办法是搞层级名称修饰name mangling。在进入一个 POU 时它会维护一个作用域堆栈。遇到变量声明节点就把当前作用域前缀加上变量原名生成一个在 C 层面唯一的名称。比如功能块FB_A里的局部变量counter可能被转成FB_A__counter如果FB_A是全局实例还可能加上全局前缀GLOBAL__FB_A__counter。总之就是通过各种分隔符保证唯一性。我在实际项目里就踩过一次坑把默认的分隔符从单下划线改成双下划线之后所有外部变量引用全部找不到名字了。原因是 Stage4 不仅要在声明时使用修饰后的名字还要在引用变量的任何 AST 节点中一遍又一遍地进行相同规则的拼装。拼装逻辑分散在 visitor 的各个函数里改一处忘一处最后编译出的 C 文件看起来变量名都对实际却无法通过 C 编译器。如果你也想自定义命名规则建议把“名称拼装”抽成一个独立函数而不是在各 visit 函数中重复写字符串拼接。否则不仅代码冗余而且排查起来特别痛苦。这也是我后来重构代码时最坚定的决策之一。3. 核心流程与关键实现细节3.1 遍历策略先声明后语句写 Stage4 的第一步不是直接遍历语句而是把所有声明先搬出来。为什么因为 C 语言要求“先声明后使用”。IEC 61131-3 的声明区和执行区是分开的在同一个 POU 里先是 VAR 段后是语句段所以 Stage4 只要按照原始顺序处理完全能保证声明在前。但如果你遇到的是那种扩展语法允许在语句中插入声明就必须做两遍遍历。我的实现里通常会维护三个缓冲区declare_buffer、temp_buffer、code_buffer。第一遍遍历负责收集所有声明和全局变量初始值写入declare_buffer第二遍才真正翻译语句输出到code_buffer。最后把declare_buffertemp_buffercode_buffer按顺序拼接成函数体。这样处理还有一个好处需要在声明区生成额外临时变量比如 IL 累加器、条件表达式临时变量时可以随时向temp_buffer追加不会污染主代码顺序。变量声明本身也值得细抠。IEC 的BOOL类型在 C 里不能直接用bool因为不是所有 C 编译器都支持 C99工业上有些老工具链还停留在 C89。MatIEC 的做法是引入一组自定义类型名比如__BOOL然后在生成文件里加上 typedef 定义。这也解释了为什么 Stage4 输出文件开头总有一大堆类型声明——这部分内容不是从 AST 里来的是模板预置的。3.2 表达式求值的三段式输出表达式是 Stage4 里最容易写错的点。举例ST 语句A : B C * 2;AST 会以赋值节点为根左边是 A 的变量引用右边是一个二元运算符节点。Stage4 的遍历会先递归访问右子树得到C * 2的计算结果再与B相加最后把结果写到 A。问题是在生成 C 代码时如果直接输出A B C * 2;是没问题的因为 C 语言的操作符优先级和 IEC 61131-3 基本一致。但如果不一致比如 IEC 里AND和OR的优先级关系与 C 的||不同就要在生成二元表达式时根据运算符优先级自动加括号。我们实际写 Stage4 时会为每个运算符分配一个预设优先级遍历表达式树时比较已知父节点和当前节点的优先级。当前节点的优先级低于父节点时输出左右括号。这套逻辑写起来不复杂但很啰嗦容易漏。漏掉的典型表现是生成的 C 文件语法没问题运行结果却不对且只在某些特定表达式组合下出现很难排查。另外一点IEC 61131-3 的表达式允许短路求值吗标准里其实没有严格规定但大多数实现都会做短路。如果你要模拟这一点不能把逻辑运算简单翻译成 C 的、||因为 C 语言本身就是短路的直接翻译即可。但如果你采用自己实现的布尔运算函数比如调一个__AND就必须显式处理短路语义否则程序行为和期望不一致。3.3 跳转与分支从 IL 标签到 C 代码IL 语言支持跳转指令比如JMPC label。AST 里会有一个跳转节点并带一个标签名。Stage4 需要做两件事一是为每个标签生成唯一编号二是确定跳转的目标代码在输出文件中的位置。这里最实用的策略是把“标签”映射为一个 C 的goto标签。比如 IL 代码LD I0 JMPC NEXT ST Q0 NEXT: NOP可以翻译成__tmp IEC__I0; if (__tmp) goto NEXT; IEC__Q0 __tmp; NEXT: ;注意goto NEXT之后的ST Q0只有在不跳转时才会执行C 代码逻辑保持一致。但有一个细节IL 里标签可以指向任意指令且这些指令可能在同一个功能块内跨区段。如果标签出现在声明区之后、语句区之前第二阶段遍历还没开始就直接变成跳转目标了。解决方法是两遍标签处理。第一阶段先扫 AST把所有标签节点收集起来并生成 C 层的标签名第二阶段输出语句时遇到跳转就输出goto遇到标签定义就输出一行带冒号的标签。如果标签没有对应定义某些 PLC 程序允许悬空标签需要主动修复或跳过因为 C 语言不允许未定义的标签。这个坑我印象很深某个从第三方 IDE 导出的工程里几个标签只跳不定义Stage4 生成的 C 代码在编译阶段报错“label undefined”。排查了很久才发现不是我们的后端逻辑问题而是入口程序漏掉了对无效跳转的清理。3.4 功能块实例与多实例展开IEC 61131-3 的功能块是可以实例化多次的。比如你定义了一个功能块PID在主程序里声明了PID_A和PID_B两个实例那么PID_A和PID_B各自保留独立的输入输出和内部状态变量。Stage4 处理这个问题的方式非常直接为每个功能块生成一个结构体类型该结构体包含所有变量输入、输出、局部变量、内部状态然后为每个实例生成一个对应的结构体变量。举个例子功能块PID有一个内部变量kp实例PID_A在 Stage4 输出的 C 代码里可能变成typedef struct { __REAL __kp; __REAL __Ts; __REAL __out; } PID; PID PID_A; PID PID_B;每次调用PID_A的功能时就把PID_A作为参数传给生成的功能函数。这里最关键的问题是功能块内部对变量的引用也要统一替换成PID_A-变量名的带实例前缀形式。不能直接在函数里写成__kp 1;那样改的只是形参副本不是实例的数据。我见过不少半成品 Stage4 实现在单实例场景下工作正常一遇到双实例就全乱。原因就是忘了变量引用节点在语义上已经绑定到了某个具体实例Stage4 需要把实例信息带到整个 Function Block 的遍历过程中而不是只在函数入口传一次参数。所以在设计 visitor 的状态时最好用一个专门的结构体保存“当前功能块节点指针”和“当前实例名称前缀”每次递归进入子节点时完整传递。4. 常见问题与排查技巧实录4.1 经典崩溃变量表未初始化Stage4 跑崩溃最常见的原因之一是对 AST 里变量引用节点的处理依赖了一张“符号表”而符号表在进入某个 POU 时没有被填充或没被重置。症状是编译小项目正常编译大型项目随机崩溃或输出空指针。排查方法很直接在 visitor 的变量引用处理函数入口加断言确认符号表里存在对应条目如果断言失败就回看语义分析阶段是否漏掉了全局变量表的合并。这个问题我也帮别人查过几回通常不是 Stage4 的锅而是前面的 Stage 在跨 POU 处理时没有把外部变量合并进当前作用域表。Stage4 只是替整个编译过程背了黑锅。4.2 类型不匹配与隐式转换IEC 61131-3 是强类型语言不同类型不能直接赋值。但在 AST 里如果语义分析阶段已经做了类型转换会插入一个显式转换节点如果没做Stage4 盲目地把 A 的类型的变量赋给了 B 类型的变量生成的 C 代码可能编译通过因为 C 允许隐式转换但数值行为完全错误。常见场景是INT和REAL混合运算。IEC 标准要求先把INT转换成REAL再做浮点运算。如果你发现生成的 C 代码里整数除法和浮点除法结果不一致优先检查类型转换节点是否被跳过。调试时可以临时把 C 编译器告警调到最严格一旦出现隐式转换告警反推 AST 里是否缺少对应节点。4.3 调试 Stage4 的三种有效手段AST dump 对比。写一个小的 dump 函数把 AST 节点类型、子节点数、变量名、常量值按树形打印出来。单独跑一个测试 PLC 程序把 dump 结果和 Stage4 输出对照能快速确认问题出在解释阶段还是翻译阶段。输出最小化。不要一上来就用一个几百行的 PLC 工程测试。先构造一个只包含一个赋值语句的最小程序比如A : B 1;然后逐步加功能加入第二个变量、加入乘法、加入 IF、加入 FOR。每加一步就重新生成 C 代码并编译运行验证很快就能定位是哪个结构触发了问题。这个办法我在定位跳转标签 bug 时帮了大忙。C 源码级别插桩。在 Stage4 输出的 C 代码里手动加打印语句打印关键变量的值对比期望结果。虽然绕但当你不知道“AST 里的执行顺序”和“C 代码的真实执行顺序”是不是一致时这招最直接。我试过很多次都是逻辑理解错了不是代码生成错了。5. 读完代码之后我留下的几个扩展思路如果只是想把 PLC 程序转成 C 跑起来Stage4 的默认实现已经够用。但如果你跟我一样需要把 MatIEC 集成到自己的工具链里有几个扩展方向特别值得做输出代码的可配置性。默认输出风格是固定模板。但工业项目经常需要把生成代码嵌入到已有框架中比如要求所有功能块函数都带统一的错误处理入口或者要求变量名符合特定命名规范。我建议把输出缓冲区、类型定义区、头文件引入区做成可插拔模板而不是硬编码在 visit 函数里。多目标支持。既然输出是 C只要再套一层架构就可以了你可以让 Stage4 先产出平台无关的标准 C再通过独立的“平台适配层”做位域定义、中断注册、总线接口映射。这样 Stage4 本身不需要动就能覆盖单片机、实时系统、软 PLC 等不同运行环境。增量编译。传统的 Stage4 每次处理一个完整工程遇到大型程序时效率低。可以借鉴增量编译的思路缓存 AST 和已经生成的 C 代码只对变更的 POU 重新执行翻译。不过这需要构建一个稳定的中间存储格式目前 MatIEC 原生并没有做这件事属于自己动手的进阶玩法。说实话我自己刚接触 Stage4 时也被那一堆 visitor 函数搞得很懵总觉得绕。但当你真的动手改过一次、调试过一轮之后就会意识到这套“AST 到 C 的直译”机制其实非常稳定几乎不会有歧义。唯一的代价就是代码量大、函数碎读起来要有耐心。如果你正准备拿它做毕业设计或者商业项目底层我的建议是先把所有变量命名规则整理成文档然后把 AST dump 工具写好再开始动代码。这两步做到了后面所有调试都会轻松很多。

相关新闻

8GB内存无GPU笔记本部署Llama2多模态模型实现离线图片识别全攻略

8GB内存无GPU笔记本部署Llama2多模态模型实现离线图片识别全攻略

"8GB内存的办公笔记本,集成显卡,还想跑大模型?跑完还想让它识别图片内容?"——这是我最近被问到最多的问题,也是我花了一周时间完整走通的一条路。坦白讲,以前我也觉得大模型是显卡发烧友的玩具&…

2026/10/17 7:37:11 阅读更多 →
激光雷达+Unity3D:互动投影捕鱼游戏完整实现方案

激光雷达+Unity3D:互动投影捕鱼游戏完整实现方案

简介:这是一份面向互动投影开发者的Unity3D捕鱼游戏案例包,基于激光雷达技术实现肢体交互,画面清晰流畅,适合在商场、展馆、游乐场等互动场景中进行功能演示与效果测试。压缩包体量约26.64MB,整体轻量便捷,…

2026/10/17 7:36:11 阅读更多 →
JavaScript严格模式全解:从ES5到ES2020的规则、坑与最佳实践

JavaScript严格模式全解:从ES5到ES2020的规则、坑与最佳实践

JavaScript的严格模式,我在项目里用了五年多,今天想踏踏实实把这件事讲透。很多同学一听到"严格模式"就觉得是ES5时代的老古董,跟ES2020有什么关系?实际上,如果你现在写的是ES Module、Class或现代构建工具链…

2026/10/17 7:36:11 阅读更多 →

最新新闻

企业级多模态RAG知识库搭建实战:从0到1全流程复盘

企业级多模态RAG知识库搭建实战:从0到1全流程复盘

做企业级 RAG 知识库这件事,我一开始是真没当回事。直到接了一个装修公司项目,才发现自己太天真。这个项目不是网上那种“拿十几个PDF跑个问答Demo”的玩具,而是要把这家装修公司过去十几年积攒的图纸、合同、报价单、工地照片、客户聊天记录…

2026/10/17 8:21:20 阅读更多 →
AI品牌力建设指南:从种草提效到心智占领的系统路径

AI品牌力建设指南:从种草提效到心智占领的系统路径

想清楚一个问题:很多品牌都在讲“用AI做内容”,但真正把AI做成一套可复用的品牌增长系统的,并不多。我做营销技术咨询这几年,接触过不少品牌方的市场负责人,大家普遍的状态是——买了AI会员、尝试过生成热点文案、用数…

2026/10/17 8:21:20 阅读更多 →
Agentic RAG实践:查询路由与Web兜底设计,解决RAG上线三大坑

Agentic RAG实践:查询路由与Web兜底设计,解决RAG上线三大坑

如果你的RAG系统上线之后,用户问一句"你好",向量检索也能认认真真去知识库里找有没有"你好"的答案,那说明你正处在大多数RAG项目从Demo走向生产的第一道坎上。我之前给某公司的客服知识库做过一套问答系统,初…

2026/10/17 8:21:20 阅读更多 →
vLLM高并发推理引擎:PagedAttention与连续批处理实战指南

vLLM高并发推理引擎:PagedAttention与连续批处理实战指南

每当看到群里有人问“为什么我本地起的LLM服务一遇到并发就报错”,我就知道对方多半还没有接触过vLLM这类高吞吐推理引擎。单个请求跑起来很顺畅,模型回答质量也没问题,但只要并发一上来,显存占用就像被倒进了无底洞,速…

2026/10/17 8:21:20 阅读更多 →
GEO实战:让DeepSeek、Kimi等国产大模型主动引用你的内容

GEO实战:让DeepSeek、Kimi等国产大模型主动引用你的内容

1. 先别急着问“怎么做”,得先搞懂AI凭什么推荐你的内容1.1 为什么传统的SEO经验突然失灵了这几年做内容运营的朋友应该有一个共同的感受:在搜索框上那一套“霸屏”打法,放到AI问答里全都不太对劲。我以前给某个知识类站点做优化的时候&#…

2026/10/17 8:21:20 阅读更多 →
ADS-B Python环境搭建:从RTL-SDR驱动到航班数据解码

ADS-B Python环境搭建:从RTL-SDR驱动到航班数据解码

简介:这是一套面向Python开发者与航空数据爱好者的基础ADS-B消息处理工具库,适用于需要解析、模拟或调试ADS-B(自动相关监视)原始报文的初学者与中级实践者。资源提供完整的开源Python软件包,支持快速安装与即用式调用…

2026/10/17 8:20:20 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →