Суперкомпиляция двойной интерпретации

index.htm - English text 

scp2int.zip - архивированная директория. 

В названии я не оригинален - оно было для суперкомпилятора рефала. Думаю, что здесь оно тоже годится. Операции над комплексными числами интерпретируются через операции над матрицами, а операции над матрицами интерпретируются пакетом Jama.

Андрей Климов очень образно прокомментировал суть данного параграфа:

Здесь предлагается способ комбинирования двух чужих пакетов. Полученное ускорение - 200 раз - стоит затраченных усилий.

Используются пакеты

Если пакет для работы с действительными матрицами специализировать по квадратным матрицам размера 2 вида { {a, b} , {-b, a) }, то получим пакет для работы с комплексными числами. Я использую известный простой факт, что множество указанных матриц изоморфно множеству комплексных чисел.

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

В множестве действительных матриц размера 2 на 2 имеется подмножество, изоморфное множеству комплексных чисел. Оно состоит из матриц вида {{a,b},{-b,a}}.

Поскольку у меня была только экспериментальная цель, то я сделал так.

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

public Complex
    add (Complex z) {
        return  cart(re + z.re, im + z.im);
    }//end add(Complex)

заменил на фрагмент

public Complex
    add (Complex z) {

    Matrix zzz1 = new Matrix(2,2);
    Matrix zzz2 = new Matrix(2,2);
 
    zzz1.set(0,0,re);
    zzz1.set(0,1,im);
    zzz1.set(1,0,-im);
    zzz1.set(1,1,re);

    zzz2.set(0,0,z.re);
    zzz2.set(0,1,z.im);
    zzz2.set(1,0,-z.im);
    zzz2.set(1,1,z.re);

    Matrix zzz = zzz1.plus(zzz2);

    return  cart(zzz.get(0,0), zzz.get(0,1));

    }//end add(Complex)

(сделал первое, что пришло в голову, наверное, можно и по-другому и проще). 

Затем взял пример Happy Tickets

В директории happytickets размещено все необходимое для пуска на счет исходных программ. 

В директории mycomplex сделана указанная замена комплексных чисел на матрицы. 

В таблицу помещены времена исполнения в секундах обоих программ до суперкомпиляции и после суперкомпиляции

  до scpj после scpj ускорение
HappyTickets 9.07 1.09 8.32
MyComplex 167.7 1.17 143

Числа в таблице достаточно понятны. После суперкомпиляции получаются почти одинаковые программы. В программе MyComplex постоянно происходит "лишняя" работа, поэтому время ее исполнения в несколько раз больше, поэтому и коэффициент ускорения больше.

Этот пример является типичным примером использования суперкомпилятора Явы в будущем. Можно сознательно программировать "неоптимально", а суперкомпилятор уберет все лишнее и построит хорошую программу.

В этом примере в одном случае использовался пакет для комплексных чисел, в другом - совершенно нелогичное применение матриц. После суперкомпиляции получилось одно и то же.