LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Что конкретно ты под этим подразумеваешь?

Суперкомпиляция, специализация программ методом частичных вычислений. Например вот: http://keldysh.ru/papers/2008/prep12/prep2008_12.html#_Toc193602742

Предположим есть код вида

if (x == 5)
  foo(a, x)
else
  foo(a, x+1)
и у нас по статистике условие x == 5 срабатывает чрезвычайно часто, то тогда можно функцию foo специализировать в одном случае, и будет:
if (x == 5)
  foo5(a)
else
  foo(a, x+1)

Или даже еще лучше

char a[300];
scanf (a[0...299]);
char a1_sorted[300] ATTRIBUTE(...)
char a2_sorted[300] ATTRIBUTE(...)
qsort(a, a1_sorted);
bubble_sort(a, a2_sorted);
if(a1_sorted == a2_sorted) // тут компилятор эту проверку должен вообще выкинуть, оставив только printf("ok, good!");
  printf("ok, good!");
else
  printf("impossible");
т.е. если компилятору можно дать инфу что qsort и bubble_sort дают одинаковый результат(или если компилятор может логически доказать, что сортировка и та и другая для всех возможных входных данных дает одинаковый результат через символьные вычисления над кодом (логика Хоара)), то компилятор может куски кода выкинуть нафиг, которые невозможны. И тогда от всего кода может остаться только scanf (a[0...299]); и printf("ok, good!");. И притом этот scanf (a[0...299]); может быть тоже заспециализирован(оптимизирован) таким образом, что ничего не будет записывать в память, т.е. просто повторять наблюдаемое поведения (пользователь вводит какие-то там цифры, программа их типа читает), но реально никуда никакие числа в память заноситься не будут, и массива char a[300]; самого не будет.

Исходная версия SZT, :

Что конкретно ты под этим подразумеваешь?

Суперкомпиляция, специализация программ методом частичных вычислений. Например вот: http://keldysh.ru/papers/2008/prep12/prep2008_12.html#_Toc193602742

Предположим есть код вида

if (x == 5)
  foo(a, x)
else
  foo(a, x+1)
и у нас по статистике условие x == 5 срабатывает чрезвычайно часто, то тогда можно функцию foo специализировать в одном случае, и будет:
if (x == 5)
  foo5(a)
else
  foo(a, x+1)

Или даже еще лучше

char a[300];
scanf (a[0...299]);
char a1_sorted[300] ATTRIBUTE(...)
char a2_sorted[300] ATTRIBUTE(...)
qsort(a, a1_sorted);
bubble_sort(a, a2_sorted);
if(a1_sorted == a2_sorted) // тут компилятор эту проверку должен вообще выкинуть, оставив только printf("ok, good!");
  printf("ok, good!");
else
  printf("impossible");
т.е. если компилятору можно дать инфу что qsort и bubble_sort дают одинаковый результат(или если компилятор может логически доказать, что сортировка и та и другая для всех возможных входных данных дает одинаковый результат через символьные вычисления над кодом (логика Хоара)), то компилятор может куски кода выкинуть нафиг, которые невозможны. И тогда от всего кода может остаться только scanf (a[0...299]); и printf("ok, good!");. И притом этот scanf (a[0...299]); может быть тоже заспециализирован таким образом, ничего не записывать в память, т.е. просто повторять наблюдаемое поведения (пользователь вводит какие-то там цифры, программа их типа читает), но реально никуда никакие числа в память заноситься не будут.