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

Canonical source: https://maguyva.ai/zh-hans/languages/ada

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

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

## 支持情况速览

- 支持等级: AST 和符号支持
- 编程语言
- 扩展名: .ada, .adb, .ads
- 真正的 AST 解析，支撑语法感知搜索和结构化上下文。
- 命名符号支撑语义查找和交叉引用。启用关系提取后，即可使用图谱导航。
- 该语言为图谱感知搜索提供符号和关系；支持的边类型随其原生构造而异。
- 同时支持 AST 解析和符号提取。

## 最适合场景

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

## 智能体工作流

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

## 为什么 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`。

## 后续步骤

通过[快速入门](/zh-hans/docs/quickstart)连接仓库，然后在[兼容性页面](/zh-hans/docs/compatibility)查看支持矩阵。如果你的 Ada 代码与 C 绑定，也请阅读 [C 指南](/zh-hans/languages/c)。

## 引擎细节

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

## 常用 MCP 入口工具

- `find_symbol`: 用来一次找到某个子程序的规格和实现体，以及它的引用。
- `dependency_search`: 在修改包规格之前使用 incoming 遍历，查看所有依赖它的单元。
- `get_task_context`: 适用于“解释遥测任务如何把数据交给日志受保护对象”这类提示词。
