Назад Оглавление Вперед
На головную страницу М.М.Горбунов-Посадов
 
РАСШИРЯЕМЫЕ ПРОГРАММЫ
 

 Г л а в а  1
ОФОРМЛЕНИЕ ВАРИАНТА
 
1.6. Настраиваемые модули в Аде
 

 

1.6. Настраиваемые модули в Аде

      Рассмотренные в предыдущих разделах подпрограммы и оператор выбора периода выполнения пригодны для оформления варианта не во всех случаях. Они неплохо работают там, где варьироваться должен фрагмент выполняемой части программы, и обычно оказываются бессильными, когда вариантный фрагмент принадлежит области описаний. Ограниченная применимость этих методов — существенный недостаток, поскольку потребность в оформлении варианта того или иного описания возникает довольно-таки часто. Например, могут варьироваться размер массива, тип некоторой переменной или группы переменных и т. п.
      Для реализации вариантности в описаниях можно воспользоваться аппаратом настраиваемых модулей, предоставляемым языком программирования Ада. (Получили распространение два перевода на русский язык исходного английского термина generic: «настраиваемый» и «родовой»; мы будем употреблять первый из них.) В Аде программный модуль может быть специфицирован как настраиваемый, в результате чего появится возможность во время сборки программы варьировать отдельные компоненты этого модуля, объявленные при спецификации параметрами настройки.
      Пусть, например, имеется процедура SWAP, посредством которой две целочисленные переменные обмениваются своими значениями:

procedure SWAP(U, V : in out INTEGER) is
       T : INTEGER;
begin
       T := U; U := V; V := T;
end SWAP;

      Требуется оформить вариант этой процедуры, обслуживающий не целочисленные (INTEGER), а, скажем, вещественные (FLOAT) переменные.
      Наиболее аккуратное решение здесь — параметризация типа переменных. Для этого исходная процедура SWAP трансформируется в настраиваемую процедуру EXCHANGE, где конкретный тип INTEGER заменен параметром настройки — настраиваемым типом ELEM:

procedure EXCHANGE(U, V : in out ELEM) is
       T : ELEM;
begin
       T := U; U := V; V := T;
end EXCHANGE;

К полученному таким образом телу настраиваемой процедуры добавляется спецификация настройки

generic
       type ELEM is private;
procedure EXCHANGE(U, V : in out ELEM);

      Теперь, конкретизируя настраиваемую процедуру типом FLOAT

procedure SWAP is new EXCHANGE(FLOAT);

мы получим искомую процедуру для вещественных чисел, а при конкретизации

procedure SWAP is new EXCHANGE(INTEGER);

вернемся к исходной целочисленной процедуре. (Этот и последующий примеры заимствованы из [Джехани, 1988].)
      В качестве параметров настройки могут выступать не только описательные, но и выполняемые компоненты модуля; в последнем случае они представляются в виде подпрограмм. Например, функцию INTEGRATE, вычисляющую значение определенного интеграла в пределах от A до B с точностью EPS, можно снабдить параметром настройки — подынтегральной функцией F. Спецификация настройки INTEGRATE будет иметь вид:

generic
       with function F(X : in FLOAT) return FLOAT;
function INTEGRATE(A, B, EPS : in FLOAT) return FLOAT;

      Подпрограммы, подставляемые при конкретизации на место формального параметра F, немного удобнее для оформления варианта, чем традиционные подпрограммы, рассмотренные в разд. 1.4. Преимущество Ады состоит в том, что тут для подпрограмм — параметров настройки на уровне языка решена одна из упоминавшихся в разд. 1.4 проблем: проблема именования вариантных подпрограмм. В Аде все подпрограммы-параметры имеют различные имена, и имя требуемой подпрограммы служит фактическим параметром настройки.
      Однако остальные выявленные в разд. 1.4 слабости оформления варианта с помощью подпрограмм присущи, к сожалению, и аппарату настраиваемых модулей. Заголовки подпрограмм — параметров настройки дублируются практически так же, как и заголовки вариантных подпрограмм.
      Не лучше обстоит дело и с безболезненностью. Необходимое здесь преобразование текста модуля, превращающее его в настраиваемый (равно как и обратное преобразование), этим полезным качеством, увы, не обладает. Для полноценного оформления как описательных вариантных фрагментов, так и выполняемых (т. е. подпрограмм-параметров) требуется редактирование первоначального текста, которое затрагивает по меньшей мере все места вхождения вариантного фрагмента. Тем самым работоспособность исходной версии программы подвергается серьезной опасности.
      Проектируя аппарат настраиваемых модулей, разработчики Ады, по-видимому, вовсе не имели в виду столь обыденное его применение, как решение рассматриваемой нами задачи оформления варианта. Цель, вероятно, была иной: они стремились создать инструмент для изготовления многократно используемых многовариантных программ. Однако, как будет видно из дальнейших рассмотрений (см. гл. 4), для потребностей многократного использования мощность аппарата настраиваемых модулей несколько слабовата, включенные в Аду средства выглядят лишь как первый, пока еще робкий шаг в этом важном направлении.
      Вместе с тем сама идея внедрения средств оформления варианта непосредственно в язык программирования безусловно заслуживает внимания. Ведь в силу своего функционального содержания вариантный фрагмент, как правило, представляет собой цельную языковую конструкцию. Это обстоятельство совершенно теряется из вида при использовании для оформления варианта внеязыковых средств, воспринимающих такой фрагмент как произвольный кусок текста. Последнее замечание в значительной степени справедливо и по отношению к рассматриваемому в следующем разделе механизму превращения вариантного фрагмента в комментарий, хотя, формально говоря, там для указанной цели будет использована вполне легальная языковая конструкция.

Далее

Рейтинг@Mail.ru