tech talks @nsu: Теоретические основы программирования:...
TRANSCRIPT
Теоретические основы программирования
Проекции Футамуры-‐Турчина и частичные вычисления. Можно ли
написать компилятор для интерпретируемого языка
Возникновение идеи
• Валентин Турчин • Нужно запустить эволюцию в мире программ
• Язык РЕФАЛ (символьные преобразования, переписывание) S S S
MS
РЕФАЛ
Palindrom { s.1 e.2 s.1 = <Palindrom e.2> ; s.1 = True ; = True; e.1 = False ; } <Palindrom 'abcba'>
Lisp Обработка списков и задачи искусственного интеллекта (defun palindrome( L ) (cond ((null L) T ) ((equal (car L) (car (last L))) (palindrome (cdr (reverse (cdr L))))))) (palindrome '(bob))
Специализация программ
• порождение по универсальной программе с множеством параметров специализированной программы, когда значения части параметров известны и фиксированы.
• Пример: возведение в степень и нахождение площади квадрата
Пример специализации
f x 1 = x f x 0 = 1 f x n = x * f x (n-‐1) s x = f x 2 -‐-‐-‐-‐-‐ s x = x * x
funcwon f(x, n) { if (n===0) return 1; if (n===1) return x; return x * f(x, n-‐1);
} funcwon s(x) {
return f(x, 2); } funcwon s(x) {
return x*x; }
Специализатор
(s (p, x)) (y) = p (x, y) pL(d) = r intLR (p, d) = r s (intLR ,p) (d) = r 1-‐я проекция s (s, intLR) (p) (d) = r 2-‐я проекция s (s, s) (intLR) (p) (d) = r
Возможно ли такое?
• Проекции Футамуры – 1977
• Datalogisk Inswtut på Københavns Universitet (Дания) специализатор для подмножества языка Lisp примерно через 15 лет
Как написать специализатор?
• Компилятор, который математически моделирует выполнение программы, а затем использует эту модель для производства более эффективной программы называется суперкомпилятором (англ. supervising compiler)
• Это можно таже назвать «абстрактной интерпретацией» программ
Пример
data N = Z | S N «0» → Z, «1» → S Z, «2» → S (S Z), «3» → S (S (S Z)) и т. д. (взят из статьи «Введение в метавычисления и суперкомпиляцию» А.В. Климова)
Прогонка (driving) Программа: data N = Z | S N add x Z = x add x (S y) = S (add x y) add2 x = add x (S (S Z)) Остаточная программа: data N = Z | S N add2 x1 = S (S x1)
Путь вычислений: add2 x1 add x1 (S (S Z)) S (add x1 (S Z)) S (S (add x1 Z) S (S x1)
Популярные задачи метавычислений
• Специализация программ: f(x,y) → fA(y) = f(A, y).
• Композиция программ: f(x), g(x) → fg(x) = f(g(x)).
• Инверсия программ: f(x) → f-‐1(y) = x, когда y = f(x).
Self-‐hoswng
• Ada, BASIC, C, CoffeeScript, F#, FASM, Forth, Haskell, Java, Lisp, Modula-‐2, OCaml, Oberon, Pascal, Python, Scala, Smalltalk, and Vala
• Для корректности специализатору не обязательно выполнять какие-‐то определённые оптимизации
Самоприменимость
• Полиморфизм вирусов • 1990 год • Шифрование и запутывание собственного тела с целью затруднения распознания
Самообфускация • 1 • +!+[] • 18 + 78 • +(+!+[]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]])+(+(!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))
h�p://discogscounter.ge¨reehoswng.co.uk/js-‐noalnum_com.php
Ссылки • Ю. А. Климов Специализатор CILPE: частичные вычисления для объектно-‐ориентированных языков
• С.М. Абрамов Метавычисления и их применение • А.В. Климов Введение в метавычисления и суперкомпиляцию
• Three Futamura Projecwons и не только (h�p://habrahabr.ru/post/47418/)
• The Three Projecwons of Doctor Futamura (h�p://blog.sigfpe.com/2009/05/three-‐projecwons-‐of-‐doctor-‐futamura.html)
• Обфускация JavaScript (h�p://habrahabr.ru/post/112530/)