Partial evaluation

In computing, partial evaluation is a technique for program optimization by specialization.

A computer program, prog, is seen as a mapping of input data into output data:

I_{static} \times I_{dynamic} \to O

Istatic, the static data, is the part of the input data known at compile time.

The partial evaluator transforms \langle prog, I_{static}\rangle into I_{dynamic} \to O by precomputing all static input at compile time. prog * is called the «residual program» and should run more efficiently than the original program. The act of partial evaluation is said to «residualize» prog to prog * .

Futamura projections

A particularly interesting example of this, first described in the 1970s by Yoshihiko Futamura, is when prog is an interpreter for a programming language.

If Istatic is source code designed to run inside said interpreter, then partial evaluation of the interpreter with respect to this data/program produces prog*, a version of the interpreter that only runs that source code, is written in the implementation language of the interpreter, does not require the source code to be resupplied, and runs faster than the original combination of the interpreter and the source. In this case prog* is effectively a compiled version of Istatic.

This technique is known as the first Futamura projection, of which there are three:

  1. Compiling by specializing an interpreter
  2. Compiler generation by self-application
  3. Compiler generator generation by double self-application

References

  • Yoshihiko Futamura (1971). «Partial Evaluation of Computation Process – An Approach to a Compiler-Compiler«. Systems, Computers, Controls 2 (5): 45–50.  Reprinted in Higher-Order and Symbolic Computation 12 (4): 381–391, 1999, with a foreword.
  • Charles Consel and Olivier Danvy (1993). «Tutorial Notes on Partial Evaluation». Proceedings of the Twentieth Annual ACM Symposium on Principles of Programming Languages: 493–501. 

Fast Partial Evaluation of Pattern Matching in Strings

Program Transformation System Based on Generalized Partial Computation

Partial Evaluation of Computation Process, Revisited

Предикат

Предика́т (n-местный, или n-арный) — это функция с областью значений {0,1} (или «Истина» и «Ложь»), определённая на nдекартовой степени множества M. Таким образом, каждую n-ку элементов M он характеризует либо как «истинную», либо как «ложную».

Предикат можно связать с математическим отношением: если n-ка принадлежит отношению, то предикат будет возвращать на ней 1.

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

Предикат называют тождественно-истинным и пишут:

 P\left ( x_1, ..., x_n \right) \equiv 1

если на любом наборе аргументов он принимает значение 1.

Предикат называют тождественно-ложным и пишут:

 P\left ( x_1, ..., x_n \right) \equiv 0

если на любом наборе аргументов он принимает значение 0.

Предикат называют выполнимым, если хотя бы на одном наборе аргументов он принимает значение 1.

Так как предикаты принимают только два значения, то к ним применимы все операции булевой алгебры, например: отрицание, импликация, конъюнкция, дизъюнкция и т. д.

Примеры

Например, обозначим предикатом EQ(x, y) отношение равенства («x = y»), где x и y принадлежат множеству вещественных чисел. В этом случае предикат EQ будет принимать истинное значение для всех равных x и y.

Более житейским примером может служить предикат ПРОЖИВАЕТ(x, y, z) для отношения «x проживает в городе y на улице z» или ЛЮБИТ(x, y) для «x любит y», где множество M — это множество всех людей.

Yoshihiko Futamura

Yoshihiko Futamura, Ph.D. was born in 1942. He is the President and Chairman of Futamura Institute, Inc. from April 2005. He was a Professor of Department of Information and Computer Science and the director of the Institute for Software Production Technology (ISPT) of Waseda University from 1991 to 2005. He received his BS in mathematics from Hokkaido University in 1965, MS in applied mathematics from Harvard University in 1973 and Ph.D. degree from Hokkaido University in 1985. He joined Hitachi Central Research Laboratory in 1965 and moved to Waseda University in 1991. He was a visiting professor of Uppsala University from 1985 to 1986 and a visiting scholar of Harvard University from 1988 to 1989. Automatic generation of computer programs and programming methodology are his main research fields. He is the inventor of the Futamura Projections in partial evaluation and PAD (Problem Analysis Diagram PDF1MB). PAD has been adopted as an international standard (ISO8631) and a national standard of China (GB13502). He was an editor of the Journal of New Generation Computing (1982-1995). He has been an Advisory Board member of the Journal of New Generation Computing from 1996 and an Advisory Board member of the Journal of Higher Order and Symbolic Computation from 2002. He is a fellow of Japan Society for Software Science and Technology. During 40 years of his career, he has contributed more than 200 research papers and patents on Programming Methodology, Software Engineering and Theoretical Computer Science.

Логическое исчисление

Ло́гические исчисле́ния — теория формальных логических вычислений. Эта теория иначе называется ещё математической или формальной логикой.

Исторически логические исчисления были разработаны для теоретической формализации процесса доказательства в различных теориях.

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

Вычисление

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

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

Умножение 2 на 2 это простое алгоритмическое вычисление.

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

Процесс

Проце́сскомпьютерная программа, находящаяся в стадии выполнения на компьютерной системе, способной выполнять несколько компьютерных программ параллельно. Стандарт ISO 9000:2000 Definitions определяет процесс как совокупность взаимосвязанных и взаимодействующих действий, преобразующих входящие данные в исходящие.

Компьютерная программа сама по себе это только пассивная совокупность инструкций, в то время как процесс – это непосредственное выполнение этих инструкций.

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

Создание процесса

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

  1. При запуске ОС,
  2. При появлении запроса на создание процесса – происходит в случае, если работающий процесс создает новый процесс.

Завершение процесса

Завершение процесса происходит как:

  1. Обычный выход
  2. Выход по исключению или ошибке

Литература

Рекурсия

Реку́рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса.

Другими словами, рекурсия — частичное определение объекта через себя, определение объекта с использованием ранее определённых. Рекурсия используется, когда можно выделить самоподобие задачи.

В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.

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

Имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), выполняют хвостовую рекурсию в ограниченном объёме памяти при помощи итераций.

Следует избегать избыточной глубины рекурсии, так как это может вызвать переполнение стека вызовов.

Данные

Описание типа данных может содержать ссылку на саму себя. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):

 class element_of_list
 {
   element_of_list *next; /* ссылка на следующий элемент того же типа */
   int data; /* некие данные */
 };

Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.

« Предыдущие записи