SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
Как	
  написать	
  
компилятор	
  	
  
за	
  15	
  минут?	
  
Андрей	
  Гершун	
  
AlaSQL	
  
Зачем	
  еще	
  языки	
  	
  
кроме	
  JavaScript?	
  
2	
  
Benjamin	
  Lee	
  Whorf	
  
Автор	
  гипотезы	
  	
  
лингвистической	
  относительности	
  
(категории	
  языка	
  определяют	
  	
  
категории	
  мышления)	
  
3	
  
Содержание	
  
•  Знакомьтесь	
  –	
  МАТRIX!	
  
•  Инструменты	
  
•  Орфография	
  
•  Грамматика	
  
•  Семантика	
  
•  Пишем	
  интерпретатор	
  
•  Венец	
  творения	
  
	
  –	
  компилятор!	
  
4	
  
Как	
  происходит	
  процесс	
  	
  
понимания	
  и	
  выполнения?	
  
•  Лексер	
  
•  Парсер	
  
•  Run-­‐cme	
  library	
  
•  Интерпретатор	
  
или	
  
•  Компилятор	
  
5	
  
C3P0	
  
интерпретатор	
  
Знакомьтесь,	
  
MATRIX!	
  
6	
  
MATRIX	
  
•  Язык	
  работы	
  с	
  матрицами	
  
•  Вдохновлен	
  MATLAB,	
  OCTANE,	
  R	
  и	
  Q	
  
	
  	
  	
  
	
   	
   	
   	
   	
  c	
  =	
  	
  a	
  *	
  b'	
  
7	
  
Пример	
  программы	
  на	
  MATRIX	
  
A	
  =	
  1	
  2	
  3	
  
B	
  =	
  4|5|6	
  
PRINT	
  A*B	
  
•  Если	
  все	
  правильно,	
  	
  
то	
  мы	
  должны	
  увидеть:	
  32	
  
8	
  
Примитивы	
  
1	
  	
   	
   	
   	
   	
   	
  //	
  число	
  
1	
  2	
  3	
  4	
  	
   	
   	
  //	
  вектор-­‐строка	
  
1	
  |	
  2	
  |	
  3	
  	
  	
  //	
  вектор-­‐столбец	
  
1	
  2	
  |	
  3	
  4	
  	
   	
  //	
  матрица	
  2x2	
  
	
  
9	
  
Операции	
  МАТRIX	
  
1	
  2	
  +	
  3	
  4	
   	
   	
  //	
  =>	
  4	
  6	
  –	
  сложение	
  
2	
  *	
  5	
  6	
  	
  	
   	
   	
  //	
  =>	
  10	
  12	
  –	
  умножение	
  
1	
  2'	
  	
  	
  	
  	
  	
   	
   	
  //	
  =>	
  1|2	
  -­‐транспонирование	
  
(1	
  2	
  +	
  3	
  4)*2	
  //	
  =>	
  8	
  12	
  -­‐	
  скобки	
  
size(1	
  2|3	
  4)	
  //	
  =>	
  2	
  2	
  -­‐	
  функция	
  размера	
  
10	
  
Zach	
  Carter	
  
Автор	
  Jison	
  
Воспользуемся	
  	
  
генератором	
  	
  
парсеров:	
  
•  Jison	
  
	
  
Альтернативы:	
  
•  PEG.js	
  
•  ALTNR/4	
  
	
   11	
  
Структура	
  файла	
  	
  
с	
  грамматикой	
  (matrix0.jison)	
  
%{	
  /*	
  А.	
  Вспомогательный	
  код	
  */	
  %}	
  
	
  
%lex	
  
%options	
  case-­‐insensitive	
  
%%	
  
/*	
  Б.	
  Лексемы	
  */	
  
/lex	
  
12	
  
Структура	
  файла	
  (продолжение)	
  
%ebnf	
  
%start	
  main	
  
/*	
  В.	
  Приоритеты	
  правил	
  */	
  
	
  
%%	
  
/*	
  Г.	
  Грамматические	
  правила	
  	
  */	
  
13	
  
Слова	
  языка	
  
•  Комментарии	
  //	
  
•  Пробелы	
  
•  Число	
  
•  Названия	
  переменных	
  и	
  функций	
  
•  Знаки:	
  +	
  *	
  ‘	
  =	
  (	
  )	
  	
  
•  Ключевое	
  слово:	
  PRINT	
  
•  Конец	
  файла:	
  <<EOF>>	
  
14	
  
Как	
  работает	
  лексер?	
  
	
  
a	
  =	
  1	
  2	
  3'	
  
	
  
15	
  
Описываем	
  лексемы	
  
регулярка	
   	
   	
   	
  return	
  'лексема'	
  
	
  
16	
  
Бритва	
  Оккама:	
  Отсекаем	
  все	
  
ненужное:	
  комментарии	
  и	
  пробелы	
  
	
  
//	
  Комментарии	
  
//.*$	
   	
   	
   	
  return	
  
	
  
//	
  Пробелы,	
  переносы	
  строк	
  
s	
   	
   	
   	
   	
   	
  return	
  
17	
  William	
  of	
  Okkam	
  
Ключевые	
  слова	
  
	
  
'PRINT'	
   	
   	
   	
   	
  return	
  'PRINT'	
  
'GO	
  TO'	
   	
   	
   	
   	
  return	
  'GOTO'	
  
	
  
	
  
Синонимы	
  
'GOTO'	
   	
   	
   	
   	
   	
  return	
  'GOTO'	
  
18	
  
Числа	
  и	
  литералы	
  
(после	
  ключевых	
  слов!)	
  
	
  
/*	
  Числа	
  */	
  
[0-­‐9]+(.[0-­‐9]*)? 	
   	
   	
  return	
  'NUMBER'	
  
	
  
/*	
  Литералы:	
  названия	
  переменных	
  и	
  
функций	
  */	
  
[A-­‐Za-­‐z_][A-­‐Za-­‐z_0-­‐9]*	
  return	
  'LITERAL'	
  
19	
  
Немного	
  магии	
  	
  
(служебные	
  лексемы)	
  
/*	
  Конец	
  файла	
  */	
  
<<EOF>>	
   	
   	
   	
   	
  return	
  'EOF'	
  
	
  
/*	
  В	
  конце	
  отлавливаем	
  
нераспознанные	
  символы	
  */	
  
.	
   	
   	
   	
   	
   	
   	
   	
  return	
  'INVALID'	
  
	
  
20	
  
Кофе-­‐брейк	
  1:	
  	
  
Что	
  выдает	
  на	
  выходе	
  лексер?	
  
•  Проверим	
  лексику:	
  
	
  >	
  jison	
  matrix1.jison	
  
•  Отладим	
  с	
  помощью	
  jison-­‐debugger	
  
	
  
a	
  =	
  1	
  2	
  3'	
  
21	
  
Теперь	
  грамматика!	
  
правило	
  
	
  :	
  набор	
  лексем	
  1	
  
	
  |	
  набор	
  лексем	
  2	
  
	
  |	
  набор	
  лексем	
  3	
  
	
  ;	
  
22	
  
	
  	
  	
  	
  	
  John	
  Backus	
  
Peter	
  Naur	
  
Описываем	
  операторы	
  
main	
  
	
  :	
  Statement*	
  EOF	
  ;	
  
	
  
Statement	
  
	
  :	
  Print	
  |	
  Set	
  ;	
  
	
  
Set	
  	
  
	
  :	
  LITERAL	
  EQ	
  Expression	
  ;	
  
	
  
Print	
  
	
  :	
  PRINT	
  Expression	
  ;	
  
a	
  =	
  1	
  2	
  3	
  
	
  
PRINT	
  A*b'	
  
23	
  
Выражения	
  
Expression	
  
	
  :	
  Matrix	
  
	
  |	
  LITERAL	
  
	
  |	
  LPAR	
  Expression	
  RPAR	
  
	
  |	
  Expression	
  PLUS	
  Expression	
  
	
  |	
  Expression	
  STAR	
  Expression	
  
	
  |	
  Expression	
  SHTRIH	
  
	
  ;	
  
24	
  
Матрицы	
  
Matrix	
  
	
  :	
  Columns	
  
	
  ;	
  
Row	
  
	
  :	
  NUMBER	
  
	
  |	
  Row	
  NUMBER	
  
	
  ;	
  
Columns	
  
	
  :	
  Row	
  
	
  |	
  Columns	
  PALKA	
  Row	
  
	
  ;	
  
•  Пример	
  1	
  2	
  3	
  
25	
  
Приоритеты	
  операций	
  
	
  
%left	
  PLUS	
   	
   	
   	
   	
  //	
  	
  1	
  +	
  2	
  +	
  3	
  
%left	
  STAR	
   	
   	
   	
   	
  //	
  	
  	
  1	
  +	
  2	
  *	
  3	
  
%right	
  STRIH	
   	
   	
   	
  //	
   	
  1	
  2	
  *	
  3	
  4'	
  
	
  
26	
  
Кофе-­‐брейк	
  2:дерево	
  разбора	
  
a	
  =	
  1	
  2	
  3'	
  
27	
  
Пора	
  уже	
  что-­‐то	
  делать!	
  
Компилируем	
  грамматику	
  
	
  >	
  jison	
  matrix2.jison	
  
	
  
Выполняем	
  проверку	
  грамматики	
  
	
  >	
  node	
  matrix2.js	
  program.mat	
  
	
  
Если	
  все	
  правильно,	
  то	
  ничего	
  не	
  
будет!	
  
28	
  
Пишем	
  	
  
интерпретатор!	
  
29	
  
C3P0	
  
интерпретатор	
  
Подготовимся	
  интерпретировать	
  
(run-­‐cme	
  library	
  MATRIX)	
  
•  Операторы	
  
– MATRIX.print()	
  
•  Операции	
  
– MATRIX.add()	
  
– MATRIX.mulcply()	
  
– MATRIX.transpose()	
  
30	
  
Добавляем	
  семантику:	
  	
  
подставляем	
  лексемы	
  
Правило	
  	
  
:	
  Expression	
  PLUS	
  Expression	
  	
  
	
  {	
  
	
   	
  //	
  $$	
  -­‐	
  возвращаемая	
  переменная	
  
	
   	
  //	
  	
  $1,	
  $2…	
  -­‐	
  лексемы	
  
	
  	
  	
  $$	
  =	
  $1	
  +	
  $3;	
  
	
  }	
  
	
  ;	
  
31	
  
Начнем	
  с	
  печати!	
  
Print	
  	
  
	
  :	
  PRINT	
  Expression	
  	
  
	
   	
  {	
  MATRIX.print($2);	
  }	
  
	
  ;	
  
32	
  
Присваивание	
  переменной	
  
Set	
  	
  
	
  :	
  LITERAL	
  EQ	
  Expression	
  
	
   	
  {	
  MATRIX.mem[$1]	
  =	
  $3;	
  }	
  
	
  ;	
  
	
  
//	
  Когда	
  будем	
  забирать	
  значение,	
  	
  
//	
  просто	
  возьмем:	
  
	
   	
  MATRIX.mem.a	
  
33	
  
Матрица	
  
Внутреннее	
  представление	
  –	
  массив	
  
массивов,	
  например,	
  матрица:	
  
	
  	
  	
  	
  1	
  2	
  3	
  |	
  4	
  5	
  6	
  
	
  
Представляется	
  как:	
  
	
  	
  [[1,2,3],[4,5,6]]	
  
	
  
	
  
	
   34	
  
 Строки	
  и	
  столбцы	
  матрицы	
  
/*	
  1	
  2	
  3	
  */	
  
Row	
  
	
  :	
  NUMBER	
  
	
   	
  {	
  $$	
  =	
  [parseFloat($1)];	
  }	
  
	
  |	
  Row	
  NUMBER	
  
	
   	
  {	
  $$	
  =	
  $1;	
  $$.push(parseFloat($2));	
  }	
  
	
  ;	
  
	
  
/*	
  1	
  2	
  |	
  3	
  4	
  */	
  
Columns	
  
	
  :	
  Row	
  
	
   	
  {	
  $$	
  =	
  [$1];	
  }	
  
	
  |	
  Columns	
  PALKA	
  Row	
  
	
   	
  {	
  $$	
  =	
  $1;	
  $$.push($3);	
  }	
  
	
  ;	
  
35	
  
И	
  все	
  -­‐	
  интерпретатор	
  готов!	
  
	
  
36	
  
Кофе-­‐брейк	
  3:	
  Настоящий	
  запуск!	
  
>	
  jison	
  matrix3.jison	
  
>	
  node	
  matrix3	
  program.mat	
  
	
  
Voila!	
  
…	
  наша	
  матрица!	
  
37	
  
38	
  
Розеттский	
  камень	
  Жан-­‐Франсуа	
  Шампольон	
  
(транслятор)	
  
Интерпретатор	
  
Возвращает	
  значение:	
  
	
  
Expression	
  PLUS	
  Expression	
  
{	
  $$	
  =	
  MATRIX.add($1,$3);	
  }	
  
	
  
39	
  
А	
  компилятор…	
  
Возвращает	
  строку	
  кода	
  на	
  JavaScript:	
  
	
  
Expression	
  PLUS	
  Expression	
  
{	
  $$	
  =	
  'MATRIX.add('+$1+','+$3+')';	
  }	
  
	
  
	
  
40	
  
Главная	
  функция	
  интерпретатора	
  
Ничего	
  не	
  возвращает	
  
	
  
main	
  
	
  :	
  Statement*	
  EOF;	
  
	
  
	
  
	
  
	
  
41	
  
Главная	
  функция	
  компилятора	
  
Возвращает	
  откомпилированную	
  функцию	
  
на	
  JavaScript:	
  
	
  
main	
  
	
  :	
  Statement*	
  EOF	
  
	
   	
  {	
  return	
  new	
  Function(	
  
	
  	
  	
  	
  	
  	
  	
  	
  'var	
  MATRIX	
  =	
  this;’	
  
	
  	
  	
  	
  	
  	
  	
  	
  +$1.join(';'))	
  
	
  	
  	
  	
  	
  	
  .bind(MATRIX);	
  }	
  
	
  ;	
  
	
  
42	
  
Праздничный	
  ужин!	
  
Компилируем	
  грамматику	
  
>	
  jison	
  matrix4.jison	
  
	
  
//	
  Запуск	
  из	
  JavaScript	
  
var	
  parser	
  =	
  require('./matrix4.js');	
  
var	
  f	
  =	
  parser.parse('print	
  1	
  2+100');	
  
	
  
f();	
  
//вернет	
  101	
  102	
  
43	
  
В	
  браузере	
  
<script	
  src="matrix4.js"></script>	
  
<script>	
  
	
  var	
  f	
  =	
  parse.parse('print	
  1	
  2+100');	
  
	
  f();	
  
</script>	
  
	
  
44	
  
Итак,	
  для	
  интерпретатора/
компилятора	
  нужно:	
  
•  Определить	
  лексемы	
  
•  Определить	
  правила	
  
•  Разработать	
  runcme	
  библиотеку	
  
•  Определить	
  семантику	
  (как	
  будут	
  
интерпретироваться	
  или	
  компилироваться	
  
правила)	
  
45	
  
Хотите	
  написать	
  свой	
  ES6?	
  
•  Парсеры	
  JavaScript	
  
– Esprima	
  
– Acorn	
  
– UglifyJS	
  
– SpiderMonkey	
  
•  Линтеры	
  –	
  используют	
  парсеры	
  
•  CoffeeScript	
  –	
  использует	
  Jison	
  
46	
  
47	
  
	
  
Андрей	
  Гершун	
  	
  	
  agershun@gmail.com	
  
h˜p://github.com/agershun/matrix	
  
	
  

Mais conteúdo relacionado

Mais procurados

Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Alexey Paznikov
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Alexey Paznikov
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3Ann Eres
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовAndrey Dolinin
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIAlexey Paznikov
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++mcroitor
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияYandex
 

Mais procurados (19)

Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
 
19 pascal urok_3
19 pascal urok_319 pascal urok_3
19 pascal urok_3
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмов
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 
особенности программирования на с++
особенности программирования на с++особенности программирования на с++
особенности программирования на с++
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Python. Обработка ошибок
Python. Обработка ошибокPython. Обработка ошибок
Python. Обработка ошибок
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
Михаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знанияМихаил Давыдов - JavaScript. Базовые знания
Михаил Давыдов - JavaScript. Базовые знания
 

Destaque

Анализ текста на естественном языке, управляемый вариантами разбора
Анализ текста на естественном языке, управляемый вариантами разбораАнализ текста на естественном языке, управляемый вариантами разбора
Анализ текста на естественном языке, управляемый вариантами разбораAlexey Noskov
 
Открытый код Томита-парсера. Виктор Бочаров
 Открытый код Томита-парсера. Виктор Бочаров Открытый код Томита-парсера. Виктор Бочаров
Открытый код Томита-парсера. Виктор БочаровYandex
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24MoscowJS
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScriptDmitry Soshnikov
 
Alasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAlasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAndrey Gershun
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6Dmitry Soshnikov
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6Dmitry Soshnikov
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)mlatushko
 
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Ontico
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)Ontico
 
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraAllen Wirfs-Brock
 
Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionMoscowJS
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptWojciech Dzikowski
 

Destaque (20)

Анализ текста на естественном языке, управляемый вариантами разбора
Анализ текста на естественном языке, управляемый вариантами разбораАнализ текста на естественном языке, управляемый вариантами разбора
Анализ текста на естественном языке, управляемый вариантами разбора
 
Открытый код Томита-парсера. Виктор Бочаров
 Открытый код Томита-парсера. Виктор Бочаров Открытый код Томита-парсера. Виктор Бочаров
Открытый код Томита-парсера. Виктор Бочаров
 
Tomita
TomitaTomita
Tomita
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
"Готовим промисы правильно", Андрей Яманов, MoscowJS 24
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
доклад
докладдоклад
доклад
 
AddConf. Дмитрий Сошников - Будущее ECMAScript
AddConf. Дмитрий Сошников  - Будущее ECMAScriptAddConf. Дмитрий Сошников  - Будущее ECMAScript
AddConf. Дмитрий Сошников - Будущее ECMAScript
 
Alasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAlasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User Manual
 
DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6DevConf. Дмитрий Сошников - ECMAScript 6
DevConf. Дмитрий Сошников - ECMAScript 6
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
HelsinkiJS meet-up. Dmitry Soshnikov - ECMAScript 6
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)
 
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
Классические архитектуры во фронтенде / Александра Шинкевич (LOVATA)
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
 
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing EraECMAScript 6: A Better JavaScript for the Ambient Computing Era
ECMAScript 6: A Better JavaScript for the Ambient Computing Era
 
Александр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in actionАлександр Русаков - TypeScript 2 in action
Александр Русаков - TypeScript 2 in action
 
ES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern JavascriptES2015 / ES6: Basics of modern Javascript
ES2015 / ES6: Basics of modern Javascript
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 

Semelhante a "Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24

Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.Dev2Dev
 
Теории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2DТеории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2D0xffAA
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'110xffAA
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
трасировка Mpi приложений
трасировка Mpi приложенийтрасировка Mpi приложений
трасировка Mpi приложенийMichael Karpov
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
1 вводное занятие
1 вводное занятие1 вводное занятие
1 вводное занятиеluis_blanco_rau
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
Презентация на тему: Знакомство с языком программирования QBasic
Презентация на тему: Знакомство с языком программирования QBasicПрезентация на тему: Знакомство с языком программирования QBasic
Презентация на тему: Знакомство с языком программирования QBasic2berkas
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел СычевYandex
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 

Semelhante a "Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24 (20)

Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
 
Теории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2DТеории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2D
 
паскаль 10кл 14
паскаль 10кл 14паскаль 10кл 14
паскаль 10кл 14
 
functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'11
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
трасировка Mpi приложений
трасировка Mpi приложенийтрасировка Mpi приложений
трасировка Mpi приложений
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
паскаль
паскальпаскаль
паскаль
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
1 вводное занятие
1 вводное занятие1 вводное занятие
1 вводное занятие
 
Step cpp022
Step cpp022Step cpp022
Step cpp022
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Презентация на тему: Знакомство с языком программирования QBasic
Презентация на тему: Знакомство с языком программирования QBasicПрезентация на тему: Знакомство с языком программирования QBasic
Презентация на тему: Знакомство с языком программирования QBasic
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 

Mais de MoscowJS

Виктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIВиктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIMoscowJS
 
Favicon на стероидах
Favicon на стероидахFavicon на стероидах
Favicon на стероидахMoscowJS
 
E2E-тестирование мобильных приложений
E2E-тестирование мобильных приложенийE2E-тестирование мобильных приложений
E2E-тестирование мобильных приложенийMoscowJS
 
Reliable DOM testing with browser-monkey
Reliable DOM testing with browser-monkeyReliable DOM testing with browser-monkey
Reliable DOM testing with browser-monkeyMoscowJS
 
Basis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkBasis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkMoscowJS
 
Контекст в React, Николай Надоричев, MoscowJS 31
Контекст в React, Николай Надоричев, MoscowJS 31Контекст в React, Николай Надоричев, MoscowJS 31
Контекст в React, Николай Надоричев, MoscowJS 31MoscowJS
 
Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31MoscowJS
 
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31MoscowJS
 
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31MoscowJS
 
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33MoscowJS
 
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33MoscowJS
 
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33MoscowJS
 
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...MoscowJS
 
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter..."Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...MoscowJS
 
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29MoscowJS
 
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29MoscowJS
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29MoscowJS
 
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28MoscowJS
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27MoscowJS
 
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27MoscowJS
 

Mais de MoscowJS (20)

Виктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public APIВиктор Розаев - Как не сломать обратную совместимость в Public API
Виктор Розаев - Как не сломать обратную совместимость в Public API
 
Favicon на стероидах
Favicon на стероидахFavicon на стероидах
Favicon на стероидах
 
E2E-тестирование мобильных приложений
E2E-тестирование мобильных приложенийE2E-тестирование мобильных приложений
E2E-тестирование мобильных приложений
 
Reliable DOM testing with browser-monkey
Reliable DOM testing with browser-monkeyReliable DOM testing with browser-monkey
Reliable DOM testing with browser-monkey
 
Basis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA FrameworkBasis.js - Production Ready SPA Framework
Basis.js - Production Ready SPA Framework
 
Контекст в React, Николай Надоричев, MoscowJS 31
Контекст в React, Николай Надоричев, MoscowJS 31Контекст в React, Николай Надоричев, MoscowJS 31
Контекст в React, Николай Надоричев, MoscowJS 31
 
Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31Верстка Canvas, Алексей Охрименко, MoscowJS 31
Верстка Canvas, Алексей Охрименко, MoscowJS 31
 
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
Веб без интернет соединения, Михаил Дунаев, MoscowJS 31
 
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
Angular2 Change Detection, Тимофей Яценко, MoscowJS 31
 
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
Создание WYSIWIG-редакторов для веба, Егор Яковишен, Setka, MoscowJs 33
 
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
Предсказуемый Viewport, Вопиловский Константин, KamaGames Studio, MoscowJs 33
 
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
Promise me an Image... Антон Корзунов, Яндекс, MoscowJs 33
 
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
Регрессионное тестирование на lenta.ru, Кондратенко Павел, Rambler&Co, Moscow...
 
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter..."Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
"Опыт разработки универсальной библиотеки визуальных компонентов в HeadHunter...
 
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
"Во все тяжкие с responsive images", Павел Померанцев, MoscowJS 29
 
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
"AMP - технология на три буквы", Макс Фролов, MoscowJS 29
 
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
"Observable и Computed на пример KnockoutJS", Ольга Кобец, MoscowJS 29
 
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
«Пиринговый веб на JavaScript», Денис Глазков, MoscowJS 28
 
"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27"Доклад не про React", Антон Виноградов, MoscowJS 27
"Доклад не про React", Антон Виноградов, MoscowJS 27
 
"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27"Web Audio Api", Анатолий Найда, MoscowJS 27
"Web Audio Api", Анатолий Найда, MoscowJS 27
 

"Как написать компилятор за 15 минут", Андрей Гершун, MoscowJS 24

  • 1. Как  написать   компилятор     за  15  минут?   Андрей  Гершун   AlaSQL  
  • 2. Зачем  еще  языки     кроме  JavaScript?   2   Benjamin  Lee  Whorf   Автор  гипотезы     лингвистической  относительности   (категории  языка  определяют     категории  мышления)  
  • 4. Содержание   •  Знакомьтесь  –  МАТRIX!   •  Инструменты   •  Орфография   •  Грамматика   •  Семантика   •  Пишем  интерпретатор   •  Венец  творения    –  компилятор!   4  
  • 5. Как  происходит  процесс     понимания  и  выполнения?   •  Лексер   •  Парсер   •  Run-­‐cme  library   •  Интерпретатор   или   •  Компилятор   5   C3P0   интерпретатор  
  • 7. MATRIX   •  Язык  работы  с  матрицами   •  Вдохновлен  MATLAB,  OCTANE,  R  и  Q                  c  =    a  *  b'   7  
  • 8. Пример  программы  на  MATRIX   A  =  1  2  3   B  =  4|5|6   PRINT  A*B   •  Если  все  правильно,     то  мы  должны  увидеть:  32   8  
  • 9. Примитивы   1              //  число   1  2  3  4        //  вектор-­‐строка   1  |  2  |  3      //  вектор-­‐столбец   1  2  |  3  4      //  матрица  2x2     9  
  • 10. Операции  МАТRIX   1  2  +  3  4      //  =>  4  6  –  сложение   2  *  5  6          //  =>  10  12  –  умножение   1  2'                //  =>  1|2  -­‐транспонирование   (1  2  +  3  4)*2  //  =>  8  12  -­‐  скобки   size(1  2|3  4)  //  =>  2  2  -­‐  функция  размера   10  
  • 11. Zach  Carter   Автор  Jison   Воспользуемся     генератором     парсеров:   •  Jison     Альтернативы:   •  PEG.js   •  ALTNR/4     11  
  • 12. Структура  файла     с  грамматикой  (matrix0.jison)   %{  /*  А.  Вспомогательный  код  */  %}     %lex   %options  case-­‐insensitive   %%   /*  Б.  Лексемы  */   /lex   12  
  • 13. Структура  файла  (продолжение)   %ebnf   %start  main   /*  В.  Приоритеты  правил  */     %%   /*  Г.  Грамматические  правила    */   13  
  • 14. Слова  языка   •  Комментарии  //   •  Пробелы   •  Число   •  Названия  переменных  и  функций   •  Знаки:  +  *  ‘  =  (  )     •  Ключевое  слово:  PRINT   •  Конец  файла:  <<EOF>>   14  
  • 15. Как  работает  лексер?     a  =  1  2  3'     15  
  • 16. Описываем  лексемы   регулярка        return  'лексема'     16  
  • 17. Бритва  Оккама:  Отсекаем  все   ненужное:  комментарии  и  пробелы     //  Комментарии   //.*$        return     //  Пробелы,  переносы  строк   s            return   17  William  of  Okkam  
  • 18. Ключевые  слова     'PRINT'          return  'PRINT'   'GO  TO'          return  'GOTO'       Синонимы   'GOTO'            return  'GOTO'   18  
  • 19. Числа  и  литералы   (после  ключевых  слов!)     /*  Числа  */   [0-­‐9]+(.[0-­‐9]*)?      return  'NUMBER'     /*  Литералы:  названия  переменных  и   функций  */   [A-­‐Za-­‐z_][A-­‐Za-­‐z_0-­‐9]*  return  'LITERAL'   19  
  • 20. Немного  магии     (служебные  лексемы)   /*  Конец  файла  */   <<EOF>>          return  'EOF'     /*  В  конце  отлавливаем   нераспознанные  символы  */   .                return  'INVALID'     20  
  • 21. Кофе-­‐брейк  1:     Что  выдает  на  выходе  лексер?   •  Проверим  лексику:    >  jison  matrix1.jison   •  Отладим  с  помощью  jison-­‐debugger     a  =  1  2  3'   21  
  • 22. Теперь  грамматика!   правило    :  набор  лексем  1    |  набор  лексем  2    |  набор  лексем  3    ;   22            John  Backus   Peter  Naur  
  • 23. Описываем  операторы   main    :  Statement*  EOF  ;     Statement    :  Print  |  Set  ;     Set      :  LITERAL  EQ  Expression  ;     Print    :  PRINT  Expression  ;   a  =  1  2  3     PRINT  A*b'   23  
  • 24. Выражения   Expression    :  Matrix    |  LITERAL    |  LPAR  Expression  RPAR    |  Expression  PLUS  Expression    |  Expression  STAR  Expression    |  Expression  SHTRIH    ;   24  
  • 25. Матрицы   Matrix    :  Columns    ;   Row    :  NUMBER    |  Row  NUMBER    ;   Columns    :  Row    |  Columns  PALKA  Row    ;   •  Пример  1  2  3   25  
  • 26. Приоритеты  операций     %left  PLUS          //    1  +  2  +  3   %left  STAR          //      1  +  2  *  3   %right  STRIH        //    1  2  *  3  4'     26  
  • 28. Пора  уже  что-­‐то  делать!   Компилируем  грамматику    >  jison  matrix2.jison     Выполняем  проверку  грамматики    >  node  matrix2.js  program.mat     Если  все  правильно,  то  ничего  не   будет!   28  
  • 29. Пишем     интерпретатор!   29   C3P0   интерпретатор  
  • 30. Подготовимся  интерпретировать   (run-­‐cme  library  MATRIX)   •  Операторы   – MATRIX.print()   •  Операции   – MATRIX.add()   – MATRIX.mulcply()   – MATRIX.transpose()   30  
  • 31. Добавляем  семантику:     подставляем  лексемы   Правило     :  Expression  PLUS  Expression      {      //  $$  -­‐  возвращаемая  переменная      //    $1,  $2…  -­‐  лексемы        $$  =  $1  +  $3;    }    ;   31  
  • 32. Начнем  с  печати!   Print      :  PRINT  Expression        {  MATRIX.print($2);  }    ;   32  
  • 33. Присваивание  переменной   Set      :  LITERAL  EQ  Expression      {  MATRIX.mem[$1]  =  $3;  }    ;     //  Когда  будем  забирать  значение,     //  просто  возьмем:      MATRIX.mem.a   33  
  • 34. Матрица   Внутреннее  представление  –  массив   массивов,  например,  матрица:          1  2  3  |  4  5  6     Представляется  как:      [[1,2,3],[4,5,6]]         34  
  • 35.  Строки  и  столбцы  матрицы   /*  1  2  3  */   Row    :  NUMBER      {  $$  =  [parseFloat($1)];  }    |  Row  NUMBER      {  $$  =  $1;  $$.push(parseFloat($2));  }    ;     /*  1  2  |  3  4  */   Columns    :  Row      {  $$  =  [$1];  }    |  Columns  PALKA  Row      {  $$  =  $1;  $$.push($3);  }    ;   35  
  • 36. И  все  -­‐  интерпретатор  готов!     36  
  • 37. Кофе-­‐брейк  3:  Настоящий  запуск!   >  jison  matrix3.jison   >  node  matrix3  program.mat     Voila!   …  наша  матрица!   37  
  • 38. 38   Розеттский  камень  Жан-­‐Франсуа  Шампольон   (транслятор)  
  • 39. Интерпретатор   Возвращает  значение:     Expression  PLUS  Expression   {  $$  =  MATRIX.add($1,$3);  }     39  
  • 40. А  компилятор…   Возвращает  строку  кода  на  JavaScript:     Expression  PLUS  Expression   {  $$  =  'MATRIX.add('+$1+','+$3+')';  }       40  
  • 41. Главная  функция  интерпретатора   Ничего  не  возвращает     main    :  Statement*  EOF;           41  
  • 42. Главная  функция  компилятора   Возвращает  откомпилированную  функцию   на  JavaScript:     main    :  Statement*  EOF      {  return  new  Function(                  'var  MATRIX  =  this;’                  +$1.join(';'))              .bind(MATRIX);  }    ;     42  
  • 43. Праздничный  ужин!   Компилируем  грамматику   >  jison  matrix4.jison     //  Запуск  из  JavaScript   var  parser  =  require('./matrix4.js');   var  f  =  parser.parse('print  1  2+100');     f();   //вернет  101  102   43  
  • 44. В  браузере   <script  src="matrix4.js"></script>   <script>    var  f  =  parse.parse('print  1  2+100');    f();   </script>     44  
  • 45. Итак,  для  интерпретатора/ компилятора  нужно:   •  Определить  лексемы   •  Определить  правила   •  Разработать  runcme  библиотеку   •  Определить  семантику  (как  будут   интерпретироваться  или  компилироваться   правила)   45  
  • 46. Хотите  написать  свой  ES6?   •  Парсеры  JavaScript   – Esprima   – Acorn   – UglifyJS   – SpiderMonkey   •  Линтеры  –  используют  парсеры   •  CoffeeScript  –  использует  Jison   46  
  • 47. 47     Андрей  Гершун      agershun@gmail.com   h˜p://github.com/agershun/matrix