Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Ada仿制药公司;汇编代码生成_Generics_Assembly_Compiler Construction_Ada_Gnat - Fatal编程技术网

Generics Ada仿制药公司;汇编代码生成

Generics Ada仿制药公司;汇编代码生成,generics,assembly,compiler-construction,ada,gnat,Generics,Assembly,Compiler Construction,Ada,Gnat,我想知道是否有一种方法可以从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 Thin

我想知道是否有一种方法可以从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
0000000000 40275F:
40275f:55%rbp
402760:4889E5MOV%rsp%rbp
…<剪断>

0000000000402a05 <main__caa.2187>:
  402a05:   55                      push   %rbp
  402a06:   48 89 e5                mov    %rsp,%rbp
0000000000 402A05:
402a05:55%rbp
402a06:48 89 e5 mov%rsp,%rbp
…<剪断> 等等

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

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

我希望实例化采用以下形式:

  • 设置Baa/应用通用参数(我知道
    X
    具有
    此值
    &程序
    Bob
    位于
    此地址
  • 调用
    Thing\u Gen
    (然后使用设置生成 预期结果)
  • 导致重用
    东西\u Gen
    代码。但情况似乎并非如此。也欢迎解释我为什么是汇编和编译器方面的noob


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

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


    据介绍,RR和Irvine可能支持共享泛型。

    您使用了哪些编译器标志?@ChristianForler None。完整的命令如所提供的那样
    gnatmake main.adb
    (投票结果超过1000,享受你的新特权。呜呜呜!:-)+1。我清楚地记得某处有一个“pragma shared_generic”。快速搜索显示这是一个VMS Ada(83)编译器选项。我上次使用这个编译器大概是在92年左右。哇,那是很久以前的事了……@T.E.D.我自己的谷歌搜索现在找到了它的布拉格语共享(通用:)