Технологии автоматического дедуктивного распараллеливания в языке Planning C. Владимир Викторович Пекунов
Чтение книги онлайн.

Читать онлайн книгу Технологии автоматического дедуктивного распараллеливания в языке Planning C - Владимир Викторович Пекунов страница 6

СКАЧАТЬ « {» сгенерированный_макромодулем_код»}»

      Уже очевидно, что возможно применение макромодулей для параметризованной генерации синтаксических конструкций, включающих префиксованный блок (П-блок) в фигурных скобках: деклараций структур, классов, уний, функций. Очевидно, что если ввести синтаксические средства, позволяющие убрать префиксную строку (возможность ее изменения заложена в макромодуль изначально) и обрамляющие скобки, то задача порождения принципиально произвольного Planning C-кода будет решена. Соответственно, определим два специальных предиката, управляющих порождением кода:

      – prefix_off, выключающий префиксную строку,

      – brackets_off, выключающий обрамляющие фигурные скобки.

      Эти предикаты имеют глобальный для всего макромодуля эффект, соответственно они могут быть вызваны в любом из предикатов/целей модуля.

      Таким образом, реализовано полноценное логическое порождающее программирование, которое может быть применено для решения сложных, интеллектуальных задач:

      а) дедуктивного анализа фактов, представляющих, в частности, разобранную входную программу, с выработкой фактов, указывающих на необходимость применения распараллеливающих конструкций;

      б) генерации кода на основании исходных и полученных фактов.

      2.1.3. Некоторые простые примеры логического порождающего программирования на базе макромодулей

      1. Пусть макромодуль генерирует серию заголовков цикла – в этом случае используется П-блок с опущенными префиксом и скобками. Далее приведен пример, содержащий соответствующий макромодуль big_loop, который вызывается для генерации тройного вложенного цикла (i = 0..2, j = 0..3, k = 0..4).

      #include <iostream>

      using namespace std;

      #def_module () big_loop (Vars, Lows, Highs) {

      @goal:-brackets_off.

      @loop ([], [], []):-!.

      @loop ([V|VT], [L|LT], [H|HT]):-

      write (’for (int»),write (V),write (»=»),write (L),write (»;»),

      write (V),write (»<=»),write (H),write (»;»),

      write (V),write (»++)»),

      loop (VT, LT, HT).

      @goal:-loop (Vars, Lows, Highs).

      };

      int main () {

      big_loop ([’i’,’j’,’k’], [0,0,0], [2,3,4])

      cout <<«1»;

      cout <<endl;

      return 0;

      }

      2. Рассмотрим применение макромодуля tree_node для формирования декларацию типа элемента n-арного дерева (n> = 2).

      #def_module (struct) tree_node (ID, Type, Name, Arity) {

      @goal:-brackets_off.

      @goal:-write (ID). {

      @goal:-write (Type),write (»»),write (Name),write (»;»).

      Конец ознакомительного фрагмента.

      Текст предоставлен ООО «ЛитРес».

      Прочитайте эту книгу целиком, купив полную легальную версию на ЛитРес.

      Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.

      Примечания

      1

      Информация СКАЧАТЬ