tech talks @nsu: Теоретические основы программирования:...

22
Теоретические основы программирования Проекции ФутамурыТурчина и частичные вычисления. Можно ли написать компилятор для интерпретируемого языка

Upload: tech-talks-nsu

Post on 19-Jan-2017

65 views

Category:

Education


1 download

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        

Другими  словами  Пример:  машина  для  печати  денег  

Компилятор:  Интерпретатор:  

Частичные  вычисления  

•  Специализатор  

Первая  проекция  

Вторая  проекция  

Третья  проекция  

h�p://blog.sigfpe.com/2009/05/three-­‐projecwons-­‐of-­‐doctor-­‐futamura.html  

Возможно  ли  такое?  

•  Проекции  Футамуры  –  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/)