跳转到内容

Ada 编程/构建

来自维基教科书,开放的书籍,开放的世界

Ada. Time-tested, safe and secure.
Ada. 经久耐用、安全可靠。

Ada 程序通常比用其他语言(如 C 或 C++)编写的程序更容易构建,这些语言通常需要 Makefile。这是因为 Ada 源文件已经指定了其源单元的依赖关系。有关详细信息,请参见 with 关键字

构建 Ada 程序未在参考手册中定义,因此此过程完全取决于编译器。通常,编译器套件包含一个 make 工具,用于编译主程序及其所有依赖项,并链接可执行文件。

使用各种编译器构建

[编辑 | 编辑源代码]
此列表不完整。您可以通过 添加其他编译器的构建信息 来帮助维基教科书。

Alire 是一个构建工具和包管理器,它自动管理包依赖关系,包括下载所需的构建工具。它基于 GNAT 编译器。

您可以使用 alr init 创建一个新项目

代码:

alr init test

输出:

Select the kind of crate you want to create:
  1. LIBRARY
  2. BINARY
Enter your choice index (first is default): 
> 1
Enter a short description of the crate: (default: '')
> Testing alr init
Select a software license for the crate?
  1. MIT OR Apache-2.0 WITH LLVM-exception
  2. MIT
  3. Apache-2.0 WITH LLVM-exception
  4. Apache-2.0
  5. BSD-3-Clause
  6. LGPL-3.0-or-later
  7. GPL-3.0-or-later WITH GCC-exception-3.1
  8. GPL-3.0-or-later
  9. Other...
Enter your choice index (first is default): 
> 8
Enter a comma (',') separated list of tags to help people find your crate: (default: '')
> test
Enter an optional Website URL for the crate: (default: '')
> https://wikibook-ada.sourceforge.net/
✓ test initialized successfully.

Alire 支持下面提到的 GNAT 大多数功能,以及相同的 IDE 和代码编辑器。

使用 GNAT,您可以运行此命令

gnat make <your_unit_file>

如果文件包含一个过程,gnatmake 将生成一个可执行文件,该文件将过程作为主程序。否则,例如一个包,gnatmake 将编译单元及其所有依赖项。

GNAT 命令行

[编辑 | 编辑源代码]

gnatmake 可以写成一个词 gnatmake 或两个词 gnat make。要查看 gnat 命令的完整列表,只需键入 gnat 而不带任何命令选项。输出将类似于以下内容

GNAT 3.4.3 Copyright 1996-2004 Free Software Foundation, Inc.

List of available commands

GNAT BIND               gnatbind
GNAT CHOP               gnatchop
GNAT CLEAN              gnatclean
GNAT COMPILE            gnatmake -c -f -u
GNAT ELIM               gnatelim
GNAT FIND               gnatfind
GNAT KRUNCH             gnatkr
GNAT LINK               gnatlink
GNAT LIST               gnatls
GNAT MAKE               gnatmake
GNAT NAME               gnatname
GNAT PREPROCESS         gnatprep
GNAT PRETTY             gnatpp
GNAT STUB               gnatstub
GNAT XREF               gnatxref

Commands FIND, LIST, PRETTY, STUB and XREF accept project file switches -vPx, -Pprj and -Xnam=val

要获得有关选项的更多帮助,只需键入命令(一个词或两个词——随你喜欢)而不带任何命令选项。

GNAT 工具链附带一个名为 IDEGPS,包含在 GNAT 的 GPL 版本 的最近发布版本中。GPS 具有 图形用户界面

Emacs 包含 (Ada 模式),并且 KDevelopVim (Ada 模式) 的 GNAT 插件可用。

Vim Ada 模式由 GNU Ada 项目 维护。

GNAT 与 Xcode

[编辑 | 编辑源代码]

Apple 的免费(免费)IDE,Xcode,使用 LLVM 编译器,前端为 Clang,不支持 Ada:但是,在 OS X Lion 及更高版本的 Xcode 4.3 中,使用 GNAT 所需的命令行工具(汇编器、链接器等)是 Xcode 的可选组件,必须 专门安装

Rational APEX

[编辑 | 编辑源代码]

Rational APEX 是一个完整的开发环境,包含语言敏感的编辑器、编译器、调试器、覆盖率分析器、配置管理等等。您通常在运行 GUI 的情况下使用 APEX。

APEX 是为开发大型程序而构建的。因此,APEX 的基本实体是子系统,一个具有 APEX 识别的某些特征的目录。所有 Ada 编译单元都必须驻留在子系统中。

您可以定义一个导出集,即对其他子系统可见的 Ada 单元集。但是,要使子系统 A 能够看到另一个子系统 B,A 必须导入 B。导入后,A 会看到 B 的导出集中所有单元。(这很像 with 子句,但这里的可见性仅意味着 Ada 的潜在可见性:要真正可见的单元必须在外部子系统的 Ada 单元的 with 子句中提及;导出集之外的单元不能在 with 子句中使用。)

通常,子系统应该按层次顺序排列,即形成一个有向图。但出于特殊用途,子系统也可以相互导入。

为了进行配置管理,子系统被分解成视图,子系统的子目录。视图包含 Ada 单元的不同开发版本。因此,实际上并不是子系统导入其他子系统,而是子系统视图导入其他子系统的视图。(当然,所有导入的闭包必须一致——不能出现例如子系统 (A,视图 A1) 导入子系统 (B,B1) 和 (C,C1),而 (B,B1) 导入 (C,C2) 的情况)。

可以将一个视图定义为开发视图。然后其他视图将保存不同阶段的版本。

每个 Ada 编译单元都必须驻留在它自己的文件中。编译 Ada 单元时,编译器会遵循 with 子句。如果在包含编译的子系统中找不到单元,则编译器会搜索导入列表(只考虑直接导入,不考虑闭包)。

单元可以被纳入版本控制。在每个子系统中,可以定义一组历史记录。一个 Ada 单元可以在一个历史记录中被纳入控制。如果您想编辑它,您首先必须签出它——它将获得一个新的版本号。更改后,您可以再次签入它,即使更改永久化(或者放弃更改,即返回到以前的版本)。您通常只在开发视图中签出单元;禁止在发布视图中签出单元。

您可以选择哪个版本是活动版本;通常是最近签入的版本。您甚至可以切换历史记录以获得不同的开发路径。例如,同一规范的不同主体用于不同的目标。

ObjectAda

[编辑 | 编辑源代码]

ObjectAda 是用于编辑、编译、导航和调试用 Ada 编写的程序的一组工具。ObjectAda 有各种版本。对于某些版本,您可以在运行工具的相同平台和操作系统上编译程序。这些被称为本地版本。对于其他版本,您可以为不同的操作系统和平台生成程序。一个可能的平台是 Java 虚拟机。

这些说明适用于原生 Microsoft Windows 版本。您可以从 IDE 或命令行运行翻译工具。

无论您喜欢从 IDE 工作还是从命令行工作,都需要进行一些簿记工作。这是通过创建一个项目来完成的。每个项目都包含多个源文件,以及多个设置,例如用于附加 Ada 库和其他依赖项的搜索路径。每个项目也至少有一个目标。通常,有一个调试目标和一个发布目标。目标的名称指示其目的。在某些时候,您会进行调试编译,通常是在开发过程中,而在其他时候,您会使用不同的设置进行编译,例如当程序准备好发布时。ObjectAda 的某些(所有商业?)版本允许使用 Java(VM)目标。

DEC Ada for VMS

[编辑 | 编辑源代码]

DEC Ada 是一个 Ada 83 编译器,用于 VMS。虽然“DEC Ada”可能是大多数用户所知的名称,但编译器现在被称为“HP Ada”。它以前也称为“VAX Ada”和“Compaq Ada”。

DEC Ada 使用真正的库管理系统——因此您需要做的第一件事是创建并激活一个库。

ACS Library Create [MyLibrary]
ACS Set Library [MyLibrary]

在创建库时,您已经设置了一些约束,例如对 Long_Float 的支持或可用的内存大小。所以仔细阅读

HELP ACS Library Create *

下一步是将您的 Ada 源代码加载到库中。

ACS Load [Source]*.ada

源代码在这个阶段不必完美,但语法正确足以让编译器确定声明的包并分析with 语句。Dec Ada 允许您在一个源文件中包含多个包,您可以使用任何您喜欢的文件名约定。ACS Load 的目的是创建源文件之间的依赖关系树。

接下来,您需要编译它们。

ACS Compile *

请注意,编译需要包名而不是文件名。通配符*表示所有已加载的包。编译器会自动确定编译的正确顺序,因此严格来说不需要 make 工具。

最后,您将文件链接到

ACS Link /Executable=[Executables]Main.exe Main

在大型系统上,您可能希望将源代码分解成多个库——在这种情况下,您还需要

ACS Merge /Keep *

将当前库的内容与层次结构中更高级别的库合并。然后应该使用

ACS Library Create /Large

来创建更大的库。这使用不同的目录布局,更适合大型库。

DEC Ada IDE

[编辑 | 编辑源代码]

Dec Ada 没有附带 IDE,但是 DEC LSE 以及 Ada 模式Vim 文本编辑器 支持 DEC Ada。

编译我们的演示源代码

[编辑 | 编辑源代码]

一旦您 下载 了我们的示例程序,您可能会想知道如何编译它们。

除非您使用 Alire,否则您需要解压缩源代码。使用您最喜欢的 zip 工具 来完成此操作。解压缩后,会创建一个与文件名相同的目录。注意:WinZip 也可能会创建一个与文件名相同的目录,因此 Windows 用户在使用正确选项时需要小心,否则他们最终会得到 wikibook-ada-1_2_0.src\wikibook-ada-1_2_0

解压缩文件后,您将在 wikibook-ada-1_2_0/Source 中找到所有源代码。您可以在那里直接编译它们。为了方便起见,我们还为以下 IDE 提供了现成的项目文件(如果您发现某个未命名的 IDE 的目录,它可能正在制作中,实际上可能无法使用)。

Alire 是在 Windows、macOS 或 Linux 上编译示例代码的最简单方法。使用 Alire,您甚至不需要下载和解压缩源代码,因为 Alire 会为您完成所有操作。在 安装 Alire 本身 之后,您需要做的就是在终端或 CMD 窗口中执行以下命令。

类 Unix 操作系统的示例

代码:

alr get "wikibook"

输出:

ⓘ Deploying wikibook=1.0.1...                                            
############################################################################################################################################################################################# 100.0%############################################################################################################################################################################################# 100.0%

wikibook=1.0.1 successfully retrieved.
ⓘ Found 2 nested crates in /Work/wikibook_1.0.1_780ee70f:
   basic/basic=1.0.1: Samples for WikiBook Ada Programing: Basic Ada
   pragmas_restrictions/pragmas_restrictions=1.0.1: Samples for WikiBook Ada Programing: Pragmas Restrictions
Dependencies were solved as follows:

   +📦 gnat 13.2.1 (new,gnat_native,binary)

这将按章节顺序下载所有示例。然后,例如,要构建并执行 基本 Ada 章节中的第一个示例代码,您需要输入以下命令。

类 Unix 操作系统的示例

代码:

 cd "wikibook_1.0.1_780ee70f/basic"
 alr build
 bin/hello_word_1

输出:

ⓘ Synchronizing workspace...
Dependencies automatically updated as follows:                           

   +📦 gnat 13.2.1 (new,gnat_native,binary)

ⓘ Building basic=1.0.1/basic.gpr...                                        
Setup
   [mkdir]        object directory for project Basic
   [mkdir]        exec directory for project Basic
Compile
   [Ada]          hello_world_1.adb
   [Ada]          hello_world_2.adb
   [Ada]          hello_world_3.adb
Bind
   [gprbind]      hello_world_1.bexch
   [gprbind]      hello_world_2.bexch
   [gprbind]      hello_world_3.bexch
   [Ada]          hello_world_1.ali
   [Ada]          hello_world_2.ali
   [Ada]          hello_world_3.ali
Link
   [link]         hello_world_1.adb
   [link]         hello_world_2.adb
   [link]         hello_world_3.adb
✓ Build finished successfully in 0.90 seconds.

Hello World!

您将在 wikibook-ada-2_0_0/GNAT 中找到多目标 GNAT 项目文件和多 make Makefile 文件。对于 i686 Linux 和 Windows,您可以使用以下命令编译任何演示。

gnat make -P project_file

您也可以使用以下命令在 GPS 中打开它们。

gps -P project_file

对于其他目标平台,则会稍微复杂一些,因为您需要告诉项目文件您要创建哪个目标。可以使用以下选项

样式 ("Debug", "Release")
您可以定义是否想要调试版本或发布版本,以便您可以比较这些选项如何影响大小和速度。
操作系统 ("Linux", "OS2", "Windows_NT", "VMS")
选择您的操作系统。由于 OS/2 上没有 Ada 2005 可用,因此不要指望所有示例都能编译。
目标 ("i686", "x86_64", "AXP")
选择您的 CPU——"i686" 是任何形式的 32 位 Intel 或 AMD CPU,"x86_64" 是一个 64 位 Intel 或 AMD CPU,如果您有 "AXP",那么您就知道它是什么。

请记住按显示的格式输入所有选项。要编译 x86-64 Linux 上的调试版本,您需要输入以下命令。

gnat make -P project_file -Xstyle=Debug -Xos=Linux -Xtarget=x86_64

如开头所说,还有一个可用的 makefile,它会自动确定使用的目标。因此,如果您有 GNU make,则可以使用以下命令节省大量输入。

make project

甚至可以使用以下命令

make all

一次性制作所有示例的调试和发布版本。

每次编译都存储在自己的目录中,该目录以 wikibook-ada-2_0_0/GNAT/OS-Target-Style 的形式创建。存档中提供了空目录。

Rational APEX

[编辑 | 编辑源代码]

APEX 使用子系统和视图目录结构,因此您需要先创建它们并将源文件复制到视图中。在使用您选择的体系结构模型创建视图后,使用菜单选项“编译->维护->导入文本文件”。在“导入文本文件”对话框中,添加“wikibook-ada-2_0_0/Source/*.ad?”以从您最初解压缩到的目录中选择 Ada 源文件。Apex 使用 .1.ada 扩展名表示规范,.2.ada 扩展名表示主体——不用担心,导入文本文件命令会自动更改这些扩展名。

要链接示例,请在目录查看器中选择其主子程序,然后单击工具栏中的链接按钮,或从菜单中选择“编译->链接”。双击可执行文件运行它。您可以使用 Shift 键修饰符来绕过链接或运行对话框。

ObjectAda

[编辑 | 编辑源代码]

ObjectAda 命令行

[编辑 | 编辑源代码]

以下描述在控制台窗口中使用 Windows 的 ObjectAda 工具。

在您从命令行使用 ObjectAda 工具之前,请确保PATH环境变量列出包含 ObjectAda 工具的目录。类似于

set path=%path%;P:\Programs\Aonix\ObjectAda\bin

一个最小的 ObjectAda 项目只需要一个源文件,例如在以下位置提供的 Hello World 程序

文件:hello_world_1.adb (查看纯文本下载页面浏览所有)

要从这个源文件构建一个可执行文件,请按照以下步骤操作(假设当前目录是一个新的目录,并且包含上面提到的源文件)。

  • 注册您的源文件
X:\some\directory> adareg hello_world_1.adb

这使您的源代码为 ObjectAda 工具所知。如果您想了解幕后发生的事情,请查看当前目录中由 adareg 创建的 UNIT.MAP 文件。

  • 编译源文件
X:\some\directory> adacomp hello_world_1.adb
Front end of hello_world_1.adb succeeded with no errors.
  • 构建可执行程序
X:\some\directory> adabuild hello_world_1
ObjectAda Professional Edition Version 7.2.2: adabuild
   Copyright (c) 1997-2002 Aonix.  All rights reserved.
Linking...
Link of hello completed successfully

请注意,您为adabuild指定了主单元的名称,而不是源文件的名称。在本例中,它是 Hello_World_1,如

procedure Hello_World_1 is

有关这些工具的更多信息,请参阅与 ObjectAda 工具一起安装的用户指南使用命令行界面


另请参阅

[编辑 | 编辑源代码]

维基教科书

[编辑 | 编辑源代码]


[编辑 | 编辑源代码]
华夏公益教科书