Армения, Степанакерт |
Категориальная абстрактная машина
Рассмотрим следующий этап процедуры трансляции, который состоит в преобразовании полученного выражения категориальной комбинаторной логики в " инструкции " "языка программирования" категориальной абстрактной машины.
Отображение выражений категориальной комбинаторной логики в соответствующие " инструкции " категориальной абстрактной машины удобно представить в форме таблицы 11.1.
При этом каждая инструкция категориальной абстрактной машины изменяет состояние КАМ, которое определяется значениями тройки { T, C, S }. Смысл состояний КАМ удобно представить в виде таблицы 11.2.
Таким образом, процесс работы КАМ сводится к смене состояний вида:
{T, C, S} -> {T’, C’, S’}.
Для завершения описания процедуры функционирования категориальной абстрактной машины осталось описать динамику состояний КАМ.
Циклом работы КАМ назовем множество всевозможных изменений ( динамики ) ее состояний.
Цикл работы КАМ удобно представить в виде таблицы 11.3.
Поскольку в данной таблице рассмотрены все возможные инструкции категориальной абстрактной машины, можно сделать вывод о том, что формализация проведена в полном объеме.
Старое состояние КАМ | Новое состояние КАМ | ||||
---|---|---|---|---|---|
Терм | Код | Стек | Терм | Код | Стек |
t | push.C | S | t | С | t.S |
t | swap.C | s.S | s | C | t.S |
t | cons.C | s.S | [s, t] | C | S |
S | (cur C).C1 | S | C:s | C | S |
S | (quote c).C | S | c | C | S |
S | C | s | S | car.C | [s, t] |
[s,t] | cdr.C | S | t | C | S |
S | C@C1 | [s, t] | S | app.C1 | [C:s, t] |
Проиллюстрируем процедуру трансляции программы на языке функционального программирования в последовательность инструкций категориальной абстрактной машины с последующим вычислением результирующего значения в среде на примере.
Рассмотрим текст следующей программы на языке функционального программирования SML:
val curry = fn f => fn x => fn y => f(x,y); fun sum ab = a+b; (curry sum) 1 2;
Заметим, что данная программа на языке SML реализует функцию вычисления значения суммы целых чисел 1 и 2, представленную в каррированной форме.
Рассмотрим поэтапно процедуру трансляции программы на языке функционального программирования в последовательность инструкций категориальной абстрактной машины с последующим вычислением результирующего значения в среде.
На первом этапе процедуры трансляции произведем преобразование текста программы на языке функционального программирования в соответствующее выражение ламбда-исчисления.
В результате получим:

На втором этапе процедуры трансляции произведем преобразование полученного выражения ламбда-исчисления в код де Брейна.
В результате получим:

На третьем этапе процедуры трансляции произведем преобразование полученного кода де Брейна в терм категориальной комбинаторной логики.
В результате получим:

На четвертом этапе процедуры трансляции произведем преобразование полученного терма категориальной комбинаторной логики в последовательность инструкций категориальной абстрактной машины.
В результате получим:
push cur (push push cdr swap quote 1 cons app swap push cur (cdr) swap quote 2 cons app cons app) swap quote + cons app.
На пятом этапе процедуры трансляции выполним результирующую последовательность инструкций категориальной абстрактной машины с означиванием в среде вычислений.
Создав таблицу с графами, соответствующими терму, коду и стеку КАМ, производим вычисления согласно инструкциям КАМ, полученным в предыдущем пункте до окончательного результата.
Последний пункт преобразований предлагается произвести самостоятельно в качестве упражнения.
Подводя итоги рассмотрения формальной системы категориальной комбинаторной логики и ее применения для реализации категориальной абстрактной машины на состояниях, принадлежащих пространству д.з.к., можно сделать следующие выводы (в сопоставлении КАМ с виртуальной машиной технологической платформы Microsoft .NET).
Во-первых, как уже упоминалось ранее, схема трансляции в .NET явно содержит в своем составе абстрактную машину.
Во-вторых, абстрактная машина .NET транслирует исходный текст на языке программирования в высокоуровневый ассемблер (известный под названием Microsoft Intermediate Language, или MSIL), который во многом подобен коду категориальной абстрактной машины.
В-третьих, виртуальная машина .NET способна осуществлять трансляцию из широкого спектра языков программирования, в том числе, в отличие от категориальной абстрактной машины, и для императивных языков (C++, C# и целого ряда других языков программирования).
В-четвертых, виртуальная машина .NET, как и категориальная абстрактная машина, отличается высокой аппаратной совместимостью, поскольку реализует целый ряд механизмов, обеспечивающих безопасную схему вычислений.
Наконец, в-пятых, отметим, что виртуальная машина .NET лучше адаптирована для объектно-ориентированных языков программирования (в том числе для языка C#, который будет рассматриваться в ходе изложения курса).
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [31, 32, 44, 62, 67, 76].