gpt4 book ai didi

generics - Ada 泛型和汇编代码生成

转载 作者:行者123 更新时间:2023-12-04 05:35:46 29 4
gpt4 key购买 nike

我想知道是否有办法从 Ada 泛型中获得更小/更高效的汇编代码。

例如,我编写了一个小的虚拟 Ada 程序 (main.adb) 来显示一个通用过程并实例化它 6 次:

with Ada.Text_Io;
procedure Main is

generic
X : Natural;
with procedure Bob (S : in String);
procedure Thing_Gen (S : in String);

procedure Thing_Gen (S : in String) is
begin
for I in 0 .. X loop
Bob (Natural'Image (I) & " " & S);
end loop;
end Thing_Gen;

procedure Alice (S : in String) is
begin
Ada.Text_Io.Put_Line ("Alice:" & S);
end Alice;

procedure Aaa is new Thing_Gen (X => 1, Bob => Alice);
procedure Baa is new Thing_Gen (X => 2, Bob => Alice);
procedure Caa is new Thing_Gen (X => 3, Bob => Alice);
procedure Daa is new Thing_Gen (X => 4, Bob => Alice);
procedure Eaa is new Thing_Gen (X => 5, Bob => Alice);
procedure Faa is new Thing_Gen (X => 6, Bob => Alice);

begin

Aaa("A");
Baa("B");
Caa("C");
Daa("D");
Eaa("E");
Faa("F");

end Main;

为了编译,我使用 gnatmake main.adb当我查看结果 objdump -d -S main > main.dump我看到每个通用实例都有 6 个部分:
000000000040275f <main__baa.2182>:
40275f: 55 push %rbp
402760: 48 89 e5 mov %rsp,%rbp

... <截图>
0000000000402a05 <main__caa.2187>:
402a05: 55 push %rbp
402a06: 48 89 e5 mov %rsp,%rbp

... <截图>
等等...

每个都有非常相似的代码,所以我怀疑正在发生的是 gnatmake 正在使用 Thing_Gen作为模板并为每个实例扩展代码,而不是使用一些参数重用代码。

所以问题是,如何让 gnatmake 重用泛型的代码,而不是为每个实例复制/粘贴?

我本来希望实例化采用以下形式:
  • 设置 Baa/应用通用参数(我知道 X 是有 This_Value和程序BobThis_Address )
  • 调用 Thing_Gen (然后使用设置来生成
    预期结果)

  • 导致重复使用 Thing_Gen代码。但情况似乎并非如此。也欢迎解释为什么我是汇编程序和编译器问题的菜鸟!

    注意:在 Sparc 和 Intel 中的结果相同! (英特尔 gnatmake 版本 4.4.3)

    最佳答案

    我不认为你可以让 Gnat 做共享泛型,因为泛型的代码生成是编译器实现者设计选择的问题,而 AdaCore 选择复制。

    根据 this thread , RR 和也许 Irvine 支持共享泛型。

    关于generics - Ada 泛型和汇编代码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11966247/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com