我将从事一个使用 Ada 语言的软件开发项目。客户正在使用 Rational Apex Ada 编译器,而我将使用 GNU 编译器。我的代码应该可以在客户的电脑上正常运行。 Ada 语言中所有可能的编译器相关代码有哪些?这样我就可以开发独立于编译器的代码。我还想在我的电脑上编译并执行客户的代码。
GNAT Pro 的下一版本将提供新的“pragma Profile (Rational)”以帮助从 Apex 移植到 GNAT。请参阅 http://docs.adacore.com/gnat-unw-docs/html/gnat_rm_2.html#SEC110 了解说明。
“与编译器相关的代码”在 Ada 中的作用比在许多其他语言(例如 C 或 C++)中小得多。然而,编译器相关的包并不罕见,并且也可能存在特定于编译器的编译指示和属性。
根据我的经验,Rational Apex 开发人员似乎有过度(恕我直言)使用 Rational 提供的包的倾向。
人们要么必须移植或重新实现此类包,要么重新编码与它们交互的 Ada 以使用纯 Ada 方法,这是高度首选的选项。
根据我的经验,在 Gnat 和其他供应商的编译器之间进行转换的主要困难是处理 Gnat 的奇怪文件命名要求。我相信 Rational,像大多数编译器一样,会很乐意使用您给它的任何文件名,并且只跟踪与内部文件的映射。 Gnat 就没那么宽容了(但不需要内部映射文件)。
因此,如果你们从头开始编写所有内容,我的建议是标准化 Gnat 的首选文件命名。这意味着每个 Ada 程序单元有一个源文件,文件名与程序单元名称匹配,但全部小写,并且点由连字符替换。包规范使用
.ads
扩展名,程序单元主体使用 .adb
。
否则,代码就没有太多理由不能完全移植。我从事的一项工作是使用基于 Intermetrics 的前端为 VxWorks 操作系统目标构建高保真飞行模拟器,我们能够在 (Win32) 办公桌上使用 Gnat 重建该模拟器以进行基本桌面测试。即使是硬实时调度程序也能很好地移植,因为它在实现中使用了所有 Ada 任务原语。 IIRC,我们必须处理的唯一非便携式调用是通过其备用电池设置 TOD 时钟的 BIOS 调用,以及用于设置其实时时钟频率的单个 VxWorks 操作系统调用。弄清楚如何正确地处理所有事情比取消这两个调用花费的时间要多得多。
gnatchop
分支)功能,并且我们还打开了一堆警告,在编译的某个时刻,它们给了我们错误消息:
gnat
如果您还要求编译器将警告视为错误,(
warning: use of this unit is non-portable and version-dependent
) 当您发现它们时,您应该编译失败。