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 。
.ads
.adb
否则,没有太多理由说明代码不能完全移植。我曾在一项工作中完成了一个高保真飞行模拟器,该模拟器使用基于Intermetrics的前端构建,用于VxWorks操作系统目标,我们可以使用Gnat在我们的(Win32)办公桌上进行基本桌面测试。即使是硬实时调度程序移植得很好,因为它在其实现中使用了所有Ada任务原语。 IIRC,我们必须处理的唯一非便携式呼叫是用于设置TOD时钟的电池备份的BIOS调用,以及用于设置其实时时钟频率的单个VxWorks OS调用。弄清楚如何获得一切 gnatchop 正确地花费了更多的时间,而不是剔除这两个电话。
gnatchop
我当前的项目使用了一些特定的编译器(Branched from gnat )功能,我们还打开了一堆警告,在编译的某些时候,它给出了错误消息:
gnat
warning: use of this unit is non-portable and version-dependent
如果您还要求编译器将警告视为错误,( -gnatwe 你找到它们时应该编译失败。
-gnatwe