Как Ada реализует пакеты? - PullRequest
1 голос
/ 31 марта 2019

Как язык программирования Ada реализует пакеты? Использует ли он структуру? запись? и где я могу найти пример этой реализации, если это возможно?

Ответы [ 2 ]

4 голосов
/ 31 марта 2019

Язык на самом деле не определяет, как должна выполняться базовая реализация.Это оставлено на усмотрение поставщика компилятора.Я сомневаюсь, что они используют структуру или запись.Любой ответ, который вы найдете, будет зависеть от поставщика, а не от языка.Стоит отметить, что наиболее распространенный компилятор, GNAT, является открытым исходным кодом, поэтому исходный код доступен для просмотра и попытки разобраться, как они это делают.Опять же, это только одна потенциальная реализация.Другие компиляторы могут делать это по-другому.

Если вы просто имеете в виду, как выглядит пример пакета:

empty my_package.ads:

package My_Package is
    -- Empty package
end My_Package;

my_package.ads с типом "class":

package My_Package is

   type My_Type is tagged private;

   function Get_Value(Self : My_Type) return Integer;

private

   type My_Type is tagged record
      Value : Integer := 2;
   end record;

end My_Package;

my_package.adb с определениями операций:

package body My_Package is

   function Get_Value(Self : My_Type) return Integer is
   begin
      return Self.Value;
   end Get_Value;

end My_Package;

Как видите, пакеты могут быть пустыми.Они могут иметь типы, операции или оба.Пакеты - это место, где обрабатывается инкапсуляция (в отличие от типа, подобного C ++ и Java).Таким образом, вы можете иметь частные типы и операции в пакете, но не заниматься традиционным объектно-ориентированным программированием.

1 голос
/ 01 апреля 2019

Пакет Ada - это в основном просто пространство имен, поэтому он не влияет на исполняемый код, генерируемый компилятором.

Позвольте мне попытаться проиллюстрировать это.

Ада:

   ...
   A := B;
   ...

может выдавать код, такой как:

...
CPY B, A
...

Ада:

   package P is
      B: Integer;
      ...
   end;
   ...
   A := P.B;
   ...

может испускать точно такой же код. Тот факт, что B теперь находится внутри пакета, не меняет выданный код.

Пакет может иметь код инициализации, который будет реализован очень похоже на процедуру. Создание экземпляра универсального пакета может быть реализовано как запись (чьи компоненты содержат универсальные параметры), или его можно развернуть на месте, и в этом случае ситуация такая же, как и с неуниверсальным пакетом.

Интересный вопрос! Почему ты спрашиваешь?

...