# Maguyva 對 Ada 的支援：規格、本體與套件圖譜

Canonical source: https://maguyva.ai/zh-hant/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-hant/docs/quickstart)連接儲存庫，然後在[相容性頁面](/zh-hant/docs/compatibility)查看支援矩陣。如果你的 Ada 程式碼與 C 繫結，也請閱讀 [C 指南](/zh-hant/languages/c)。

## 引擎細節

- Ada 支援涵蓋 `.ads` 規格、`.adb` 本體與 `.ada`。子程式的本體與規格都是可呼叫的符號。
- 符號比對不區分大小寫，`with` 與 `use` 子句會移除關鍵字後成為匯入關係。
- 約 113 個內建型別、標準函式庫套件、屬性函式與運算子會從呼叫中過濾掉；記錄欄位存取與索引依其在語法中的位置與呼叫區分開來，`Put_Line`、`Put` 與 `Get` 是刻意保留的。

## 實用的 MCP 進入點

- `find_symbol`: 用來一次找到某個子程式的規格與本體，以及它的參照。
- `dependency_search`: 在變更套件規格之前使用 incoming 走訪，查看所有依賴它的單元。
- `get_task_context`: 適合用於「說明遙測任務如何把資料交給記錄用的受保護物件」這類提示。
