ada精化代码名称

ada精化代码名称,ada,Ada,我刚刚开始学习ADA和gnat是如何工作的,当涉及到精化代码时,有一些事情我不理解 我看到过几个例子,其中一个人写了这样的东西: E003:短整数;pragma Import(Ada,E003,“XXX_E”),其中“XXX”通常是包的名称 我在代码中搜索XXX_E符号,但找不到它。因此,我假设这是由蚊虫产生的?!(或者我错了?)我在哪里可以读到更多关于这方面的信息 谢谢,我不相信你会找到任何文档来描述GNAT为什么引入这些\u E符号;我猜开发人员认为你真的不需要知道,事实上,在使用GNAT的

我刚刚开始学习ADA和gnat是如何工作的,当涉及到精化代码时,有一些事情我不理解

我看到过几个例子,其中一个人写了这样的东西:
E003:短整数;pragma Import(Ada,E003,“XXX_E”)
,其中
“XXX”
通常是包的名称

我在代码中搜索XXX_E符号,但找不到它。因此,我假设这是由蚊虫产生的?!(或者我错了?)我在哪里可以读到更多关于这方面的信息


谢谢,

我不相信你会找到任何文档来描述GNAT为什么引入这些
\u E
符号;我猜开发人员认为你真的不需要知道,事实上,在使用GNAT的20年中,我不记得有过探索这个的需要。您可以查看源代码(看起来有详细信息)

至于他们为什么会在那里,看起来好像是为了检查一个包是否已经被详细阐述;查看活页夹生成的包体(
b_uuuu.adb
,或者有时是
b~.adb
),代码如下

...
E056 : Short_Integer; pragma Import (Ada, E056, "ada__text_io_E");
...
   Ada.Text_Io'Elab_Spec;
   Ada.Text_Io'Elab_Body;
   E056 := E056 + 1;
...
E056
是地址
ada_uutext_io_E
处两字节对象的本地名称),意思是“首先,详细说明ada.text_io的规范,然后是其主体,然后设置一个标志以显示其已完全详细说明”

我还没有找到一个实际检查此标志的示例,尽管您可以看到为什么在以下情况下需要此标志:

package Elaboration is
   function F return Integer;
end Elaboration;

package body Elaboration is
   Value : Integer;
   function F return Integer is (Value);
begin
   Value := 42;
end Elaboration;
如果在阐述包体之前调用
explainion.F
,则
Value
的内容将是未定义的


默认情况下,GNAT会花费相当长的时间来确保精化前的访问(ABE)不会发生(也许这解释了为什么在
精化.o
!)中实际上没有生成签入)

我相信您不会找到任何文档来描述GNAT引入这些
\E
符号的原因;我猜开发人员认为你真的不需要知道,事实上,在使用GNAT的20年中,我不记得有过探索这个的需要。您可以查看源代码(看起来有详细信息)

至于他们为什么会在那里,看起来好像是为了检查一个包是否已经被详细阐述;查看活页夹生成的包体(
b_uuuu.adb
,或者有时是
b~.adb
),代码如下

...
E056 : Short_Integer; pragma Import (Ada, E056, "ada__text_io_E");
...
   Ada.Text_Io'Elab_Spec;
   Ada.Text_Io'Elab_Body;
   E056 := E056 + 1;
...
E056
是地址
ada_uutext_io_E
处两字节对象的本地名称),意思是“首先,详细说明ada.text_io的规范,然后是其主体,然后设置一个标志以显示其已完全详细说明”

我还没有找到一个实际检查此标志的示例,尽管您可以看到为什么在以下情况下需要此标志:

package Elaboration is
   function F return Integer;
end Elaboration;

package body Elaboration is
   Value : Integer;
   function F return Integer is (Value);
begin
   Value := 42;
end Elaboration;
如果在阐述包体之前调用
explainion.F
,则
Value
的内容将是未定义的


默认情况下,GNAT会进行相当长的处理,以确保精化前的访问(ABE)不会发生(也许这可以解释为什么在
精化.o
!)中实际上没有生成签入)

是的,这是一个GNAT ism。它本质上是编写一个Ada源文件作为实际源代码的包装,以将其绑定到其依赖项。通常你不需要看到这一点;gnatmake或gprbuild会隐藏它。请看一下“啃咬”的文档。你能给我指一下手册中的一些示例或具体文本吗。我甚至不知道用谷歌搜索什么和如何搜索它。关于第四次点击的“Gnatbind文档”。参见本页第3点。这是GNAT如何将Ada(一个女人的名字,而不是首字母缩写)转换为可执行文件的一部分。只有当你在使用GNAT编译器时,你才会对它感兴趣,当然这不是学习Ada的人应该看到的东西。是的,这是一个GNAT ism。它本质上是编写一个Ada源文件作为实际源代码的包装,以将其绑定到其依赖项。通常你不需要看到这一点;gnatmake或gprbuild会隐藏它。请看一下“啃咬”的文档。你能给我指一下手册中的一些示例或具体文本吗。我甚至不知道用谷歌搜索什么和如何搜索它。关于第四次点击的“Gnatbind文档”。参见本页第3点。这是GNAT如何将Ada(一个女人的名字,而不是首字母缩写)转换为可执行文件的一部分。只有当你在使用GNAT编译器的时候,你才会对它感兴趣,当然这不是学习Ada的人应该看到的。谢谢你的回答。可以在地图文件中看到
pkg_E
符号,但不能看到
E0XX
符号。如果你真的想确保检查这些符号,那么最好在哪里搜索?在地图文件中看不到它们的事实让我觉得链接器会把它们拿走?!(可能在检查序列之后)更新了答案(稍微)
E056
(注意使用反勾号表示代码!)看起来甚至不是本地符号;我认为,在生成的绑定器的源代码中,对这些对象的每个引用都会在编译生成的绑定器时直接替换为对导入对象的引用,因此不需要符号。即使它是本地符号,它会出现在地图文件中吗?再次感谢!指向sem_elab的链接帮助我理解了它是如何在高水平上工作的。那么版本控制常量呢?如何计算它们以及如何检查它们。是否有与sem_elab类似的软件包?类型版本_32为mod 2**32;u00001:常数版本32:=16#8ad6e54a#;有一次,我跟踪了一个在精化阶段的bug——这是我唯一一次真正使用这些标签。出于类似的原因,我发现自己单步通过了
adainit
——但只有在McCusthanks上才能找到这个极好的答案。可以在地图文件中看到
pkg_E
符号,但不能看到
E0XX
符号。如果真的