Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Проекции Футамуры и частичные вычисления (Ренат...

Проекции Футамуры и частичные вычисления (Ренат Идрисов)

Ренат Идрисов (ИСИ СО РАН) рассказывает о теоретических основах программирования, о проекциях Футамуры-Турчина и о том, можно ли написать компилятор для интерпретируемого языка.

http://techtalks.nsu.ru

Tech Talks @NSU

October 14, 2013
Tweet

More Decks by Tech Talks @NSU

Other Decks in Education

Transcript

  1. Теоретические  основы   программирования   Проекции  Футамуры-­‐Турчина  и   частичные

     вычисления.  Можно  ли   написать  компилятор  для   интерпретируемого  языка  
  2. Возникновение  идеи   •  Валентин  Турчин   •  Нужно  запустить

     эволюцию  в   мире  программ   •  Язык  РЕФАЛ   (символьные  преобразования,   переписывание)   S   S   S   MS  
  3. РЕФАЛ   Palindrom  {            s.1

     e.2  s.1  =  <Palindrom  e.2>  ;            s.1  =  True  ;            =  True;            e.1  =  False  ;   }     <Palindrom  'abcba'>  
  4. Lisp   Обработка  списков  и  задачи  искусственного   интеллекта  

      (defun  palindrome(  L  )          (cond                  ((null  L)  T    )                  ((equal  (car  L)  (car  (last  L)))                          (palindrome  (cdr  (reverse  (cdr  L)))))))     (palindrome  '(bob))    
  5. Специализация  программ   •  порождение  по  универсальной  программе   с

     множеством  параметров   специализированной  программы,  когда   значения  части  параметров  известны  и   фиксированы.   •  Пример:  возведение  в  степень  и   нахождение  площади  квадрата  
  6. Пример  специализации   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;  }  
  7. Специализатор   (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      
  8. Возможно  ли  такое?   •  Проекции  Футамуры  –  1977  

    •  Datalogisk  Inswtut  på  Københavns  Universitet   (Дания)  специализатор  для  подмножества   языка  Lisp  примерно  через  15  лет  
  9. Как  написать  специализатор?   •  Компилятор,  который  математически   моделирует

     выполнение  программы,  а  затем   использует  эту  модель  для  производства   более  эффективной  программы  называется   суперкомпилятором  (англ.  supervising   compiler)   •  Это  можно  таже  назвать  «абстрактной   интерпретацией»  программ  
  10. Пример   data  N  =  Z  |  S  N  

    «0»  →  Z,     «1»  →  S  Z,     «2»  →  S  (S  Z),     «3»  →  S  (S  (S  Z))  и  т.  д.     (взят  из  статьи  «Введение  в  метавычисления   и  суперкомпиляцию»  А.В.  Климова)  
  11. Прогонка  (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)      
  12. Популярные  задачи   метавычислений   •  Специализация  программ:    

     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).    
  13. Self-­‐hoswng   •  Ada,  BASIC,  C,  CoffeeScript,  F#,  FASM,  Forth,

      Haskell,  Java,  Lisp,  Modula-­‐2,  OCaml,  Oberon,   Pascal,  Python,  Scala,  Smalltalk,  and  Vala   •  Для  корректности  специализатору  не   обязательно  выполнять  какие-­‐то   определённые  оптимизации  
  14. Самоприменимость   •  Полиморфизм  вирусов   •  1990  год  

    •  Шифрование  и  запутывание  собственного   тела  с  целью  затруднения  распознания  
  15. Самообфускация   •  1   •  +!+[]   •  18

     +  78   •  +(+!+[]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+ []])+(+(!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+[!+[]+! +[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]))   h€p://discogscounter.ge¨reehoswng.co.uk/js-­‐ noalnum_com.php  
  16. Ссылки   •  Ю.  А.  Климов  Специализатор  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/)