Ада-95. Компилятор GNAT

       

Расширение существующего проекта


Общим случаем для больших программных систем является наличие множества реализаций общего интерфейса. В терминах Ады, это представляется как множество версий тела пакета для одной и той же спецификации этого пакета.

Например, одна реализация может быть безопасна при использовании в многозадачных/многопоточных программах, а другая может быть более эффективно использована в последовательных/однопоточных приложениях

В среде GNAT это может быть смоделировано с помощью использования концепции расширения проекта (project extension).

Если один проект ("проект-потомок") расширяет другой проект ("проект-предок"), то по умолчанию, все исходные файлы проекта-предка наследуются проектом-потомком, но проект-потомок может заменить версию любого исходного файла проекта-предка новой версией, а также способен добавить новые файлы.

Для проектов, такая способность аналогична использованию расширения в объектно-ориентированном программировании.

В среде GNAT допускаются иерархии проектов: проект-потомок может служить проектом-предком для другого проекта, и проект, который наследует один проект, может также импортировать другие проекты.

В качестве примера предположим, что каталог "/seq" содержит файл проекта "seq_proj.gpr" и исходные файлы "pack.ads", "pack.adb" и "proc.adb":

/seq pack.ads pack.adb proc.adb seq_proj.gpr

Следует заметить, что файл проекта может быть просто пуст (то есть, он не содержит каких-либо описаний атрибутов и/или пакетов):

project Seq_Proj is

end Seq_Proj;

допуская, что все его исходные файлы являются исходными файлами Ады и все они расположены в каталоге проекта.

Предположим, что необходимо предоставить какую-либо альтернативную версию файла "pack.adb" в каталоге "/tasking", но, при этом, сохранить использование существующих версий файлов "pack.ads" и "proc.adb".

С этой целью можно описать проект Tasking_Proj, который наследует проект Seq_Proj.




Схематически это будет иметь следующий вид:

/tasking pack.adb tasking_proj.gpr

При этом, файл проекта "tasking_proj.gpr" может быть следующим:

project Tasking_Proj extends "/seq/seq_proj" is

end Tasking_Proj;

Таким образом, используемая в процессе сборки версия файла "pack.adb", будет зависеть от указываемого файла проекта.

Следует заметить, что для решения рассматриваемой задачи можно вместо наследования проекта использовать импорт проекта.

Базовый проект base будет содержать исходные файлы "pack.ads" и "proc.adb", последовательный/однопоточный проект будет импортировать проект base и добавлять "pack.adb", а многозадачный/многопоточный проект будет, подобным образом, импортировать проект base и добавлять свою версию "pack.adb",

Фактический выбор решения зависит от необходимости замены других исходных файлов оригинального проекта. При отсутствии такой необходимости достаточно использовать импорт проекта. В противном случае, необходимо использовать расширение проекта.


Содержание раздела