Принципы и интерпретация динамических языков программирования

Общая информация
ЛекторР. А. Попов
Семестрвесна 2015
Дата начала17.02.2015
Количество пар8
Язык курсарусский
Аннотация В последнее время начали набирать популярность динамические языки программирования. Python и Ruby уже можно назвать мейнстримом. Основной фичей этих языков является метапрограммирование. Однако, ни Python ни Ruby не привнесли ничего нового в теорию языков программирования, а лишь переизобрели и популяризировали идеи рефлексии и метапрограммирования. Весь фундамент был заложен гораздо раньше в языках семейства Lisp. В курсе будет рассказано, почему Lisp занимает особое место среди динамических языков, будут продемонстрированы идеи, которые еще не нашли отражения в современных языках. Курс знакомит слушателей не только с идеями, но и с их программной реализацией. На примере кода интерпретаторов Lisp будет показано, с какими трудностями сталкиваются разработчики динамических языков. Изложение начнется с простых реализаций, занимающих страницу кода и дойдет до диалекта, обладающего наибольшими на сегодняшний день возможностями метапрограммирования. Особенностью курса является изложение теории реификации, которая была разработана автором на основе работ Brian Cantwell Smith. Соединив полученные знания со знаниями о синтаксическом анализе (эта тематика в курсе не рассматривается), слушатели смогут разработать самостоятельно реализацию языка уровня Python.
Лекции Подсказка: слайды, видеозапись и другие материалы лекции доступны со страницы лекции, попасть на которую можно, нажав на её название.

1. Введение в Lisp
(17.02.2015 - 18:30 - 20:00)

В лекции было рассказано о историческом синтаксисе языка Lisp — M-выражениях. Была введена функция репрезентации и показано, что списки представимы cons-ячейками. Было разъяснено различие между объектами и значениями, абстрактными и интенциональными типами данных.

Слушателям было рекомендовано ознакомиться со средой CLISP.

Литература

[1] John R. Allen. "Anatomy of LISP" Chaper 1 "Symbolic Expressions".

[2] J. MacLennan. "Values and objects in programming languages"

[3] Kent M. Pitman "The Best of Intentions / EQUAL Rights--and Wrongs--in Lisp" (единственный источник обращающий внимание на феномен интенциональных типов).

https://www.youtube.com/watch?v=eBXdrQcGPSo
2. Универсализация синтаксиса
(03.03.2015 - 18:30 - 20:00)

В лекции будет проанализирована функция репрезентации для M-выражений. Будет показано, что на основе S-выражений можно построить более выразительный язык, чем на основе любого ad hoc синтаксиса. Будет сформулирована проблема создания библиотечных специальных операторов и рассказано про самое простое решение -- макросы. На примере макросов будут разъяснено различие между функцией репрезентации и интерпретатором.

https://www.youtube.com/watch?v=lDZYTHP1TFM
3. Механизация вычислений
(17.03.2015 - 18:30 - 20:00)

В лекции было рассказано про интерпретаторы, предложенные McCarthy в работах [1, 2]. Была затронута тема представления в языке булевских значений.

Литература

[1] Джон Маккарти. "Рекурсивные функции символических выражений и их вычисление машиной. Часть I"

[2] John McCarthy. "LISP 1.5 Programmer's Manual"

Слушателям рекомендуется распечатать интерпретатор приведенный на стр. 13 работы [2].

https://www.youtube.com/watch?v=fl-7usVzrFs
4. Окружения
(31.03.2015 - 18:30 - 20:00)

В начале мы посмотрим на некоторые важные типы данных, которые есть в Python и Ruby, но отсутствуют в Lisp. Далее решим проблему funarg и проанализируем детальнее идею окружений. Вновь вернемся к проблеме макросов и проанализируем их работу с точки зрения окружений.

Литература

[1] Guy Lewis Steele Jr., Gerald Jay Sussman "The Art of the Interpreter or, The Modularity Complex. (Parts Zero, One, and Two)"

[2] Обсуждение гиперстатического глобального окружения

[3] Анализ макросов с точки зрения различий dynamic/lexical scope

5. Продолжения
(14.04.2015 - 18:30 - 20:00)

В лекции будет завершена тема анализа окружений. Мы познакомимся с циклическими окружениями и псевдонимами. От окружений меток перейдем к продолжениям и покажем их реализацию на основе CPS.

Литература

[1] Описание типа box в Racket

[2] Christopher Strachey "Fundamental Concepts in Programming Languages"

6. Реификаторы
(28.04.2015 - 18:30 - 20:00)

В лекции будет показано, что система команд традиционных машинных языков неадекватно описывает поток управления в исключительных ситуациях. Эти системы команд будут сравнены со схемой реализованной в языке SNOBOL. Опыт SNOBOL будет обобщен и показано, что любое вычисление должно иметь не менее двух продолжений. Будет рассказано, как продолжения могут стать полностью объектами первого класса. Далее на основе этих идей будет решена проблема создания новых специальных операторов, которые вслед за первооткрывателем — Brian Cantwell Smith — будут названы реификаторами.

Демонстрационная (предварительная) версия HEALED LISP

https://www.youtube.com/watch?v=kJT2BUMZZ6s
7. Продолжения и итераторы
(12.05.2015 - 18:30 - 20:00)

Литература

Kent Pitman "UNWIND-PROTECT vs. Continuations"

https://www.youtube.com/watch?v=IBLEo7cVMho
8. Пролегомены ко всякой будущей теории языков программирования
(19.05.2015 - 18:30 - 20:00)

В лекции будет рассказано как тезис Тьюринга-Черча оказывает влияние на разработчиков языков программирования. В частности будут рассмотрены некоторые ошибочные аспекты теории структурной рефлексии разработанной Brian Cantwell Smith.

Литература

[1] Peter Wegner. "Why interaction is more powerful than algorithms"

[2] Brian Cantwell Smith. "Reflection and semantics in LISP"

Ваша оценка: Пусто Средняя: 5 (3 голосов)
Share |