跳转到内容
cd /languages
  • 高可靠代码
  • 编程语言
  • AST 和符号支持

Maguyva 的 Ada 支持:规格、实现体与包依赖图谱

Maguyva 以 AST、符号和图谱支持 Ada,让 AI 智能体能够在长期运行的 Ada 系统中追踪包规格、实现体、任务和标记类型。

为什么 Ada 仓库需要一张依赖图

Ada 把一个包承诺做什么(.ads)与它如何做(.adb)分离开来。这是优秀的工程实践,但也意味着一次修改会涉及多个文件,而文本搜索无法替你把它们联系起来。长期运行的 Ada 系统还多了一层:泛型、标记类型、任务和受保护对象,它们之间的关系比任何单个文件都更重要。

Maguyva 会在智能体提出修改之前把这张依赖图交给它,这也正是高可靠评审所要求的顺序。

Maguyva 在 Ada 中提取什么

Maguyva 覆盖 .ads、.adb 和 .ada。子程序实现体以及过程和函数规格都会被提取为可调用符号,因此例程的规格和实现体都可以搜索。符号匹配不区分大小写,与 Ada 本身一致。

导入来自 with 和 use 子句,关键字会被去掉,图谱中保存的是包名。图谱还记录调用、标记类型上的继承与重写、实例化、类型引用、读写,以及异常的抛出与处理边。

在结构搜索中,任务类型、受保护类型、记录类型和接口类型可以作为类型定义选取,入口实现体可以作为方法选取。

智能体提示词示例

  • “哪些单元依赖 Flight_Control.Sensors,它们调用了其中哪些子程序?”(dependency_search 的 incoming 方向)
  • “显示 Compute_Trajectory 的规格、实现体和所有调用方。”(find_symbol)
  • “解释遥测任务如何把数据交给日志受保护对象。”(get_task_context)

已知限制

  • 在 Ada 中,部分调用、记录字段访问和索引使用相同的语法。为保持调用图干净,Maguyva 会过滤内置类型、标准库包、属性函数和运算符(约 113 个模式),因此对标准库的调用不会成为图谱的边。记录字段访问和索引依据其在语法中的位置与调用区分开,而不是依靠字段名列表。Put_Line、Put 和 Get 等常用文本 I/O 调用是特意保留的。
  • use 子句会改变可见性,但在结构搜索中不会被选为导入;with 子句会。
  • 记录类型和接口类型的节点可能是匿名片段,因此基于名称的结构查询可能会漏掉它们。查找具名类型请使用 find_symbol。

后续步骤

通过快速入门连接仓库,然后在兼容性页面查看支持矩阵。如果你的 Ada 代码与 C 绑定,也请阅读 C 指南。

最适合场景

  • > 在航空航天、国防、铁路等高可靠领域维护长期 Ada 代码、且每次变更都要评审的团队。
  • > 代码分成 `.ads` 规格和 `.adb` 实现体、接口与实现位于不同文件的代码库。
  • > 把 AI 智能体用于影响分析和评审准备、而不是未经评审的代码生成的工程师。

智能体工作流

  • > 在修改包规格之前,找出所有 `with` 了该包的单元。
  • > 跨包边界追踪哪些子程序调用了某个例程。
  • > 在并发或设计变更之前,梳理任务类型、受保护类型和标记类型的层次结构。

引擎细节

  • > Ada 支持覆盖 `.ads` 规格、`.adb` 实现体和 `.ada`。子程序的实现体和规格都是可调用符号。
  • > 符号匹配不区分大小写,`with` 和 `use` 子句会去掉关键字后成为导入关系。
  • > 约 113 个内置类型、标准库包、属性函数和运算符会从调用中过滤掉;记录字段访问和索引依据其在语法中的位置与调用区分开,`Put_Line`、`Put` 和 `Get` 是特意保留的。

常用 MCP 入口工具

  • find_symbol

    用来一次找到某个子程序的规格和实现体,以及它的引用。

  • dependency_search

    在修改包规格之前使用 incoming 遍历,查看所有依赖它的单元。

  • get_task_context

    适用于“解释遥测任务如何把数据交给日志受保护对象”这类提示词。