本帖最后由 〞剑舞长空 于 2025-3-31 07:49 编辑
又闲的没事干了,跑过来干了一通支持库。
流程:
- 使用 clang 对头文件进行解析,生成的AST语法树导出到JSON。
- 由大语言模型对数据解析,可以是已经开源的支持库。
- 根据JSON生成基本可用的模板
- 接口的实现我是也丢给了模型
- 接口繁多的情况大家各有见解,自己填充实现或者AI写核心接口 其他复制粘贴也不是不可以是吧~
可查看学习一番。明确一点这个库不可用 ,因为我测试过了(也有可能是我没用对),虽然不会崩溃
其中有部分问题,
接口的实现在易语言中体现不太合适:
比如 AddPath 方法,应该是A.AddPath (XXX),这样子来看是 A.AddPath (A,XXX) ,逻辑上不合群。
当然可以修改 我懒得弄了
这个库花了我应该大半天的时间
其实不需要这么久,万事开头难!
开头的事情整了大半天,至于代码模板的生成飞速就生成了。
写的过程感觉还可以换个思路。
由JSON先生成模板,实现的函数另外抽离丢给AI
一件事情还是要分开干好点
就这样,skr~
上附件
Dll1.zip
(2.47 MB, 下载次数: 3, 售价: 2 枚 精币)
接下来AI正文,我是懒得写了。源码工程丢附件了
调用格式: 〈无返回值〉 对象.AddPath (Paths64 对象,Path64 路径) - Clipper2图形计算库->Paths64
英文名称:Paths64.添加路径
向 Paths64 对象尾部添加一个 Path64 路径。本命令为初级对象成员命令。
参数<1>的名称为“对象”,类型为“Paths64(路径组64)”。Paths64 对象。
参数<2>的名称为“路径”,类型为“Path64(路径64)”。要添加的 Path64 路径。
操作系统需求: Windows
好的,这是一份论坛帖子的草稿,阐述了您提到的核心要义:使用 Clang 解析头文件导出 AST,再由 AI 解析 AST 生成易语言支持库模板的过程,并着重指出了这种自动化方式在接口交互层面可能存在的问题和代码缺陷。
帖子标题: 探讨:利用 Clang AST 和 AI 自动生成易语言支持库模板的可能性与挑战
帖子正文:
大家好!
最近在进行 C++ 库到易语言支持库的封装工作时,尝试了一个比较新颖的思路:利用 Clang 解析 C++ 头文件生成抽象语法树 (AST),然后借助 AI (例如大型语言模型) 来解析这个 AST,最终自动生成易语言支持库的 C++/FNE 模板代码。
基本流程大致如下:
- Clang 解析: 使用 Clang 的能力 (例如通过 LibClang 或相关工具) 解析目标 C++ 库的头文件。
- AST 导出: 将解析得到的 AST 信息导出为一种结构化的格式,比如 JSON。这包含了类、函数、方法、枚举、参数、返回类型等详细信息。
- AI 解析与生成: 将导出的 AST JSON 提供给 AI 模型,并指示它根据易语言支持库的结构规范 (如
lib2.h 中定义的 LIB_INFO , CMD_INFO , ARG_INFO , LIB_DATA_TYPE_INFO 等) 生成 C++ 模板代码或 .fne 文件内容。
初步成果与可行性:
从实验结果来看 (以封装 Clipper2 图形库为例),这个流程在生成基础结构方面是可行的:
- 数据类型定义 (
LIB_DATA_TYPE_INFO , .数据类型 ): AI 能够识别 C++ 类并生成对应的数据类型定义框架。
- 常量定义 (
LIB_CONST_INFO , .常量 ): 可以较好地从 C++ enum 映射生成易语言常量。
- 命令/方法名称与基本信息 (
CMD_INFO , .命令 ): 能够从 C++ 函数/方法签名中提取名称、参数列表、返回类型,并生成基本的命令定义条目。
- 参数信息 (
ARG_INFO , .参数 ): 可以生成参数的基本定义框架。
AI 确实能快速生成大量的模板代码,省去了手动创建这些结构体和数组的繁琐工作,提供了一个不错的起点。
核心问题与挑战:接口交互层面的“不适”与代码缺陷
然而,在实际应用中,我们发现仅仅依赖 AST 和 AI 自动生成的模板,尤其是在接口交互层面,存在很多问题,生成的代码往往并不合适直接使用,甚至是有问题的:
-
C++/易语言范式差异: AI 通常难以理解两种语言间的设计哲学差异。
- 对象生命周期: C++ 的 RAII (构造/析构) 与易语言显式的创建/销毁命令 (
CT_IS_OBJ_CONSTURCT_CMD , CT_IS_OBJ_FREE_CMD ) 映射可能不完美。AI 生成的构造/析构命令逻辑可能需要调整。
- 所有权与内存管理: C++ 中复杂的指针、引用、智能指针语义,如何映射到易语言的变量、参考、对象指针,并确保正确的内存管理(何时
new , 何时 delete , 何时返回副本,何时返回裸指针),AI 很难完美处理。例如,我们遇到了 PolyPath 返回裸指针带来的生命周期风险问题。
- 返回值: C++ 函数返回复杂对象 (如
std::vector 包装的 Paths64 ) 时,易语言通常需要返回一个新建的对象副本,AI 生成的代码可能直接返回指针或处理不当。
-
类型映射的局限:
- 简单类型 (int, double, bool) 映射良好。
- 复杂类型 (如
std::vector<Point64> ) 应该映射为易语言的不透明对象类型 (ETYPE_Path64 ),但 AI 可能尝试直接映射或映射错误。
- 模板、回调函数、复杂的函数指针等 C++ 特性,几乎无法直接、安全地自动映射到易语言。
-
参数传递方式:
- C++ 的
const& , * , & 如何精确对应易语言的值传递、对象传递、参考传递 (AS_RECEIVE_VAR , AS_RECEIVE_VAR_ARRAY 等标志),AI 的判断不一定准确,需要人工核对。特别是输出参数的处理。
-
接口设计的“易用性”:
- AI 生成的命令通常是 C++ API 的直接翻译,可能冗长、不符合易语言用户的习惯。例如,C++ 的重载函数需要 AI 设计一套易语言的命名规则来区分,但这套规则未必是最佳的。
- 可能缺少必要的辅助函数或面向易语言用户的更高层封装。
-
错误处理: C++ 的异常 (throw ) 如何桥接到易语言的错误处理机制 (例如,返回错误代码、提供 取错误文本 命令),自动生成的代码通常会忽略这一点。
结论:
利用 Clang AST 和 AI 自动生成易语言支持库模板,在减少初期结构性代码编写量方面有一定潜力,可以快速搭建起库的框架。
但是,绝对不能盲目信任生成的接口和代码逻辑。由于 C++ 和易语言在设计范式、内存管理、类型系统、错误处理等方面存在显著差异,AI 目前难以完全理解并生成完全适配、健壮、易用的易语言接口。
生成的模板仅仅是一个起点,必须经过开发者仔细的人工审查、修改和完善,特别是针对接口设计、内存管理、错误处理和参数传递方式等方面。对于复杂的库,人工调整的工作量依然巨大。
大家对这种自动化方式有什么看法?有没有类似的尝试或者更好的思路?欢迎一起交流讨论!
|