8.1. Модификаторы семантик 115
каждый тип (сложение, умножение и т.п) арифметической операции. В начале работы
интерпретатора всем счетчикам присвоим значение 0. Каждый раз, когда в интерпрета-
торе выполняется арифметическая операция в интересах интерпретируемой програм-
мы будем, помимо выполнения операции, увеличивать на 1 соответствующий счетчик.
Когда интерпретация программы завершена, будем возвращать не посчитанный резуль-
тат, а список значений счетчиков. Назовем так измененный интерпретатор rsrR. Для
любой программы p∈R и данным d программа rsrR::ProgR->D->[Int] вычисляет—
rsrR p d
∗
⇒ [n
+
,n
−
,...]—оценку вычислительных ресурсов: сколько потребуется вы-
полнить арифметических операций при вы числении p на d.
Определим rsr::ProgR->D->D->[Int] следующим образом:
rsr intL p d = rsrR intL (p:d).
По определению 40 rsr является модификатором семантик. Для любого языка L, любой
программы p∈L и данных d в результате счета rsr intL p d получаем оценку вычис-
лительных ресурсов для вычисления p на d. Да нный пример легко изменить на случай
оценки других ресурсов (памяти, дискового пространства и т.п.)
С первого взгляда пример кажется парадоксальным: для оценки требуемых ресурсов
некоторого вычисления, проводят эти вычисления и подсчитывают по ходу дела затра-
ченные ресурсы. Более разумно стремиться получить оценку ресурсов до (то есть—без)
проведения вычисления p на d. Оказывается, что методы эффективной реализации
нестандартных семантик, которые будут обсуждаться в разделе 8.3 позволяют наде-
яться на возможность автоматического преоб разо ва ния приведенного алгоритма в ал-
горитм подсчета ресурсов без проведения (полного) вычисления.
Нестандартные вычисления. Рассмотрим стандартный интерпретатор
int::ProgR->D->D
и по его тексту внесем следующие изменения. Допустим во входных данных интер-
претируемых программ, в тех позициях, где ожидаются числа, указывать не только
числа, но и интервалы. Обозначим через D’ соответствующее расширение D’ исходной
предметной области D. В тексте интерпретатора, в тех местах, где выполняются опе-
рации над числами в интересах интерпретируемой программы, внесем изменения: в
качестве операндов операций будем принимать как числа, так и интервалы, а операции
будем выполнять в стиле интервальных вычислений. Соответственно, при завершении
вычисления в результат (в те позиции, где должны быть числа) возможно попадут
интервалы. Назовем так измененный интерпретатор iarR. По построению, выполнено:
iarR::ProgR->D’->D’.
Определим iar::ProgR->D->D’->D’ следующим образом:
iar intL p d’ = iarR intL (p:d’).
По определению 40 iar яв ляется модификатором семантик. Для любого языка L,
любой программы p∈L и любых входных (интервальных) данных d’∈D’ вычисления
iar intL p d’ являются интервальными вычислениями в языке L. Таким образом, до-
статочно один раз реализовать интервальные вычисления для языка R, чтобы иметь
возможность выполнения интервальных вычислений в любом языке L, для которого
имеется (обычный) интерпретатор intL∈R.
На базе данного примера легко сформулировать класс аналогичных модифика то ров,
подменяющих обычные вычисления на их (каким-либо образом расширенный) вариант.