本课目标
完成本课后,你将能够:
-
在Windows、macOS或Linux系统上安装完整的Ada开发环境
-
使用GNAT工具链编译和运行Ada程序
-
配置适合初学者的代码编辑器或集成开发环境(IDE)
-
理解Ada项目的文件结构和编译流程
-
成功编写、编译并运行你的第一个Ada程序
一、认识GNAT工具链
1.1 什么是GNAT?
GNAT(GNU NYU Ada Translator)是Ada语言最广泛使用的开源编译器,基于GCC(GNU Compiler Collection)构建。
历史背景:GNAT最初由纽约大学(NYU)在1992-1994年间开发,1995年成为GNU项目的一部分。如今由AdaCore公司主导维护,同时社区版完全免费。
GNAT包含的核心工具:
| 工具 | 命令 | 用途 |
|---|---|---|
| GNAT编译器 | gnatmake / gcc -c | 编译Ada源文件 |
| GNAT绑定器 | gnatbind | 处理语言运行时依赖 |
| GNAT链接器 | gnatlink | 生成可执行文件 |
| GPS/GNATstudio | gnatstudio | 集成开发环境(IDE) |
| GNATcheck | gnatcheck | 代码风格检查 |
| GNATtest | gnattest | 单元测试框架 |
1.2 选择哪个版本?
Ada标准历经多次修订,GNAT支持情况如下:
| Ada版本 | 年份 | 主要特征 | GNAT支持 |
|---|---|---|---|
| Ada 83 | 1983 | 初始标准 | 完全支持 |
| Ada 95 | 1995 | 面向对象、受控类型 | 完全支持 |
| Ada 2005 | 2005 | 接口类型、改进并发 | 完全支持 |
| Ada 2012 | 2012 | 契约式编程、方面规范 | 完全支持(本课程使用) |
| Ada 2022 | 2022 | 并行块、改进泛型 | 部分支持(开发中) |
本课程统一使用Ada 2012标准,这是目前工业界最成熟、工具链支持最完善的版本。
二、Windows系统安装
2.1 下载GNAT社区版
访问AdaCore官方下载页面:
选择 "GNAT Community" → "2021"(或更新版本)→ "x86_64-windows"
注意:GNAT Community 2021是最后一个完全免费的社区版,后续版本需注册AdaCore账户。对于学习完全够用。
2.2 安装步骤
1.运行安装程序,选择安装路径(建议默认 C:\GNAT\2021 )
2.选择组件(建议全选):
-
GNAT Ada Compiler
-
GNAT Programming Studio (GPS)
-
GDB Debugger
-
Ada Reference Manual
3.完成安装,勾选"Add to PATH"
2.3 验证安装
打开命令提示符(CMD)或PowerShell,输入:
gnat --version
应显示类似输出:
GNAT 11.2.0 (x86_64-w64-mingw32)
Copyright (C) 1996-2021, Free Software Foundation, Inc.
再验证GPS安装:
gnatstudio --version
三、macOS系统安装
3.1 使用Homebrew安装(推荐)
macOS用户建议通过Homebrew安装,更简单且易于管理:
# 安装Homebrew(如未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装GNAT
brew install gnat
# 安装GPS(可选,较大)
brew install --cask gnatstudio
3.2 验证安装
gnat --version
which gnatmake
四、Linux系统安装
4.1 Ubuntu/Debian
sudo apt update
sudo apt install gnat gnat-gps
4.2 Fedora/RHEL/CentOS
sudo dnf install gcc-gnat
sudo dnf install gnatcoll-gps # GPS IDE
4.3 Arch Linux
sudo pacman -S gcc-ada
sudo pacman -S gnatstudio # AUR
4.4 验证安装
gnat --version
gnatmake --version
五、配置代码编辑器
5.1 方案一:GNAT Programming Studio(GPS)
GPS是AdaCore官方IDE,专为Ada优化,功能包括:
-
语法高亮与代码折叠
-
智能跳转与自动补全
-
集成调试器(GDB)
-
项目向导与构建管理
启动方式:
-
Windows:开始菜单 → GNAT → GPS
-
macOS/Linux:终端输入
gnatstudio
首次启动配置:
1.选择主题(推荐"Dark"或"Light")
2.配置字体(推荐等宽字体如Consolas、JetBrains Mono)
3.启用行号显示: Edit → Preferences → Editor → Display → Line numbers
5.2 方案二:VS Code + 插件
VS Code轻量且插件丰富,适合习惯现代编辑器的开发者。
推荐插件:
| 插件名 | 功能 | 安装命令 |
|---|---|---|
| Ada & SPARK | 语法高亮、跳转、格式化 | 扩展商店搜索安装 |
| Ada Debug | 调试支持 | 配合Native Debug插件 |
配置tasks.json(按 Ctrl+Shift+P → "Tasks: Configure Task"):
{
"version": "2.0.0",
"tasks": [
{
"label": "Build Ada",
"type": "shell",
"command": "gnatmake",
"args": ["-g", "-O0", "${file}"],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Run Ada",
"type": "shell",
"command": "${fileDirname}/${fileBasenameNoExtension}",
"dependsOn": "Build Ada"
}
]
}
5.3 方案三:Vim/Neovim
适合终端爱好者,配置 ~/.vimrc :
" Ada语法高亮(通常内置)
autocmd BufRead,BufNewFile *.adb,*.ads set filetype=ada
" 编译快捷键
autocmd FileType ada nnoremap <F5> :!gnatmake -g -O0 %<CR>
autocmd FileType ada nnoremap <F9> :!./%:r<CR>
六、你的第一个Ada程序
6.1 创建项目目录
mkdir ~/ada_learning
cd ~/ada_learning
mkdir lesson_02
cd lesson_02
6.2 编写Hello World
创建文件 hello.adb (注意扩展名是.adb,代表Ada Body):
-- 文件名: hello.adb
-- 这是一个简单的Ada程序,演示基本结构
with Ada.Text_IO; -- 引入标准输入输出包
procedure Hello is
-- 这是声明部分,此处为空
begin
-- 这是执行部分
Ada.Text_IO.Put_Line ("Hello, Ada World!");
end Hello;
代码解析:
| 部分 | 说明 |
|---|---|
-- | Ada的注释符,从 -- 到行尾都是注释 |
with Ada.Text_IO; | with子句,引入外部包(类似 #include 或 import ) |
procedure Hello is | 定义名为Hello的过程(无返回值的子程序) |
is | 分隔声明部分与执行部分 |
bagin | 执行部分开始 |
Ada.Text_IO.Put_Line (...) | 调用Text_IO包的Put_Line过程,输出字符串并换行 |
end Hello; | 程序结束,必须与过程名匹配 |
Ada命名规范:过程名
Hello采用PascalCase(首字母大写),包名Ada.Text_IO采用点分命名空间。
6.3 编译程序
在终端执行:
gnatmake hello.adb
gnatmake会自动完成以下步骤:
1.编译 hello.adb → 生成 hello.o (目标文件)
2.绑定(bind)→ 处理运行时依赖
3.链接(link)→ 生成可执行文件 hello (Windows为 hello.exe )
成功输出:
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali
6.4 运行程序
Linux/macOS:
./hello
Windows:
hello.exe
输出:
Hello, Ada World!
6.5 清理编译产物
gnatclean hello
或手动删除:
-
hello.o(目标文件) -
hello.ali(Ada库信息文件,用于依赖分析) -
hello或hello.exe(可执行文件)
七、理解Ada文件扩展名
| 扩展名 | 全称 | 用途 | 示例 |
|---|---|---|---|
| .adb | Ada Body | 包体或主程序的实现 | hello.adb , stack.adb |
| .ads | Ada Spec | 包的规范(接口声明) | stack.ads , math_utils.ads |
| .ali | Ada Library Information | 编译器生成的依赖信息 | hello.ali (自动生成) |
| .o/.obj | Object File | 目标文件(机器码) | hello.o (自动生成) |
关键规则:
-
主程序(含
procedure且无参数)通常放在.adb文件 -
包规范(接口)与包体(实现)分离,分别用
.ads和.adb -
文件名必须与单元名完全一致(包括大小写,但Ada不区分大小写)
八、常见错误与解决
8.1 错误1:文件名不匹配
现象:
gnatmake Hello.adb
输出: error: "hello.adb" and unit name "Hello" do not match
原因:Linux/macOS区分大小写,文件名必须严格匹配单元名。
解决:统一使用小写文件名,如 hello.adb 。
8.2 错误2:缺少分号
代码:
procedure Bad is
begin
Ada.Text_IO.Put_Line ("Oops") -- 缺少分号!
end Bad;
错误信息:
bad.adb:4:01: ";" expected
解决:Ada语句以分号结束, Put_Line 是过程调用语句,必须加 ; 。
8.3 错误3:end后缺少单元名
代码:
procedure Wrong is
begin
null;
end; -- 缺少 "Wrong"
错误信息:
wrong.adb:4:04: missing "Wrong" in "end"
解决:Ada强制要求 end 后重复单元名,增强可读性。
8.4 错误4:字符串使用错误引号
错误代码:
Ada.Text_IO.Put_Line ('Hello'); -- 单引号错误!
解决:Ada中字符串用双引号 " ,单引号 ' 用于单个字符,如 'A' 。
九、进阶:多文件项目结构
9.1 创建规范文件(.ads)
创建 greetings.ads :
-- 文件名: greetings.ads
-- 包规范:声明接口
package Greetings is
procedure Say_Hello;
procedure Say_Goodbye;
end Greetings;
9.2 创建包体文件(.adb)
创建 greetings.adb :
-- 文件名: greetings.adb
-- 包体:实现规范中声明的子程序
with Ada.Text_IO;
package body Greetings is
procedure Say_Hello is
begin
Ada.Text_IO.Put_Line ("Hello from package!");
end Say_Hello;
procedure Say_Goodbye is
begin
Ada.Text_IO.Put_Line ("Goodbye from package!");
end Say_Goodbye;
end Greetings;
9.3 修改主程序
修改 hello.adb :
with Greetings; -- 引入自定义包
procedure Hello is
begin
Greetings.Say_Hello;
Greetings.Say_Goodbye;
end Hello;
9.4 编译多文件项目
gnatmake hello.adb
gnatmake会自动:
1.发现 hello.adb 依赖 greetings
2.编译 greetings.ads (检查规范)
3.编译 greetings.adb (生成包体)
4.编译 hello.adb
5.链接生成可执行文件
十、本课总结
-
GNAT是Ada的主流开源编译器,包含编译、链接、调试完整工具链
-
安装方式:Windows用安装包,macOS用Homebrew,Linux用包管理器
-
开发环境:GPS是官方IDE,VS Code适合轻量开发,Vim适合终端
-
文件类型:
.adb(包体/主程序)、.ads(包规范)、.ali(编译信息) -
编译命令:
gnatmake 文件名.adb一键完成编译链接 -
关键规范:文件名与单元名匹配,
end后重复单元名,语句用分号结束
十一、课后练习
1.环境验证:确认 gnat --version 能正常输出,截图保存。
2.修改程序:将 hello.adb 改为输出你的姓名和当前日期。
3.故意犯错:尝试去掉 end Hello 中的 Hello ,观察错误信息并理解。
4.扩展包:在 greetings 包中添加 Say_Time 过程,输出"Current lesson: 2"。
5.查阅手册:在GPS中按 F1 或访问 Help → Ada Reference Manual ,查找 Ada.Text_IO 包的规范。
十二、下节预告
第3课|第一个Ada程序:Hello World深入解析
我们将:
-
深入剖析
procedure的完整语法结构 -
理解
with子句的多种用法和限制 -
学习Ada的标识符命名规则和保留字
-
掌握程序注释的最佳实践和文档生成工具
关键术语表
GNAT:GNU NYU Ada Translator,Ada语言的开源编译器
GPS/GNATstudio:AdaCore开发的集成开发环境
adb/ads:Ada Body(包体)和Ada Spec(规范)的文件扩展名
ALI文件:Ada Library Information,编译器用于依赖跟踪的元数据
gnatmake:GNAT的自动化构建工具,处理多文件编译依赖
提示警告:本课程内容(包括但不限于文字、图片、音频、视频等)版权归原作者所有,未经授权严禁转载、复制、翻录、传播或以任何方式用于商业用途。本课程仅供个人学习使用,请尊重知识产权,共同维护良好的创作环境。如有疑问或需授权合作,请联系版权方。感谢您的理解与支持!