IntroductionToProgrammingLanguages — различия между версиями
(→Список групп для выполнения задач) |
|||
Строка 2: | Строка 2: | ||
Лектор - Дмитрий Юрьевич [http://www.matmex.spb.ru/photoalbum/person_teachers_BulychevDY_1.html Булычев] | Лектор - Дмитрий Юрьевич [http://www.matmex.spb.ru/photoalbum/person_teachers_BulychevDY_1.html Булычев] | ||
+ | |||
+ | [https://docs.google.com/spreadsheet/ccc?key=0ApYxPEC9C_QXdC00UkVJekxYV0pYYVAxTmFXUkt6SVE Учёт посещаемости занятий] | ||
+ | |||
+ | [https://docs.google.com/spreadsheet/ccc?key=0ApYxPEC9C_QXdE05Q09iWlRqRzJ3d1FwTlJRSEkxbFE Учёт сдачи домашних заданий] | ||
== Лекции == | == Лекции == | ||
− | |||
* [http://code.google.com/p/aptu-tex/source/browse/formallang/les1/les.tex Лекция №1] 10.02.2012 | * [http://code.google.com/p/aptu-tex/source/browse/formallang/les1/les.tex Лекция №1] 10.02.2012 | ||
+ | * 17.02.2012 | ||
+ | В семантике ошибка: правило для переменной вместо | ||
+ | [x](s)=s(x) | ||
+ | читать как | ||
+ | [x](s)=[s(x)](s). | ||
+ | * 24.02.2012 | ||
== Домашние задания == | == Домашние задания == | ||
− | + | ||
* [Задание №1] срок сдачи 17 февраля 2011 | * [Задание №1] срок сдачи 17 февраля 2011 | ||
написать генерирующее расширения для программы возведения в степень | написать генерирующее расширения для программы возведения в степень | ||
Строка 24: | Строка 33: | ||
Это генерирующее расширение должно для своего единственного параметра n печатать остаточную программу, полученную специализацией функции exp на это значение n. Если это генерирующее расширение сохранит в себе какие-то черты exp, будет совсем хорошо. | Это генерирующее расширение должно для своего единственного параметра n печатать остаточную программу, полученную специализацией функции exp на это значение n. Если это генерирующее расширение сохранит в себе какие-то черты exp, будет совсем хорошо. | ||
− | |||
* [Задание №2] срок сдачи 24 февраля 2011 | * [Задание №2] срок сдачи 24 февраля 2011 | ||
− | |||
Написать принтер, который по абстрактному синтаксическому дереву программы печатает её представление в конкретном синтаксисе (который мы обсуждали) и интерпретатор (который вычисляет значение выражения в данном состоянии). | Написать принтер, который по абстрактному синтаксическому дереву программы печатает её представление в конкретном синтаксисе (который мы обсуждали) и интерпретатор (который вычисляет значение выражения в данном состоянии). | ||
+ | * [Задание №3] желаемы срок сдачи 26 февраля 2011 | ||
+ | # Написать порождающую грамматику для языка над алфавитом {a, b, c}, состоящего из всех слов, в которых количество букв a, b и c одинаково. | ||
+ | # Написать порождающую грамматику для языка над алфавитом {0, 1}, состоящего из всех слов, в которых не встречается две единицы подряд. | ||
+ | # Написать порождающую грамматику для языка над алфавитом {0, 1, *}, состоящего из всех слов вида sas, где s --- непустая строка нулей и единиц любой длины, а a --- непустая строка из звездочек любой длины. | ||
+ | # Написать порождающую грамматику для языка над алфавитом {a, b}, состоящего из всех вида a^nb^m, где n <> m. | ||
+ | # Написать порождающую грамматику для языка над алфавитом {a, b}, состоящего из всех слов, в которых количество букв a в два раза больше, чем количество букв b. | ||
+ | # Правда ли, что любой рекурсивный язык контекстно-зависим (обратное, как известно, верно)? | ||
+ | # Написать реализацию построения НКА по регулярной грамматике; написать интерпретатор этого автомата, который проверяет принадлежность заданного слова языку, и принтер, который печатает граф переходов автомата в формате .dot пакета graphviz. | ||
+ | # Написать грамматику для порождения выражений в алфавите {x, +, *, (, )}, где x играет роль операндов, * и + --- левоассоциативные операции (то есть E+F+G означает ((E+F)+G)), операция * связывает операнды сильнее, чем + (то есть E+F*G означает E+(F*G)), причем порождаемые выражения НЕ ДОЛЖНЫ содержать ненужных скобок (а именно, например, выражение x+(x*x) не должно порождаться) | ||
== Программа курса == | == Программа курса == | ||
− | + | # Языки программирования, синтаксис, семантика, прагматика. Когнитивные особенности человеческого мышления и их влияние на развитие языков программирования. | |
− | + | # Языки программирования в ретроспективе. Процедурное, объектно-ориентированное, логическое и функциональное программирование. Предметно-ориентированные языки. Языки вне классификации. | |
− | + | # Абстрактный и конкретный синтаксис. Статическая и динамическая семантика. Компиляция и интерпретация. Проекции Футамуры-Ершова. | |
− | + | # Генеративный и аналитический подходы к описанию синтаксиса. Формальные грамматики, иерархия Хомского. | |
− | + | # Регулярные языки и конечные автоматы. Применение регулярных выражений в народном хозяйстве (grep/sed/awk) и для лексического анализа (lex/flex). Отсутствие бесконтекстной лексики в реальных языках программирования. | |
− | + | # Контекстно-свободные грамматики. Нормальные формы Хомского и Грейбах. Алгоритмы Эрли и Кока-Янгера-Касами. Неконтекстосвободность реальных языков программирования. | |
− | + | # Нисходящий анализ. Возврат и заглядывание вперед. Класс языков LL(k). Рекурсивный спуск, магазинные автоматы, парсер-комбинаторы, PEG, "скаредный" разбор. GLL. Инструменты нисходящего анализа (Parsec, ANTLR и пр.) | |
− | + | # Восходящий анализ, классы LR(k) и LALR(k). GLR. Инструменты восходящего анализа (yacc/bison). | |
− | + | # Двухуровневые и атрибутные грамматики, вопросы применения на практике. | |
− | + | # Идентификация. Область видимости и область действия. Статическое и динамическое, раннее и позднее связывание. | |
− | + | # Энергичность и ленивость. Call-by-name, call-by-value, call-by-reference. | |
− | + | # Строгость, чистота, прозрачность по ссылкам. | |
− | + | # Языки с типами и языки без типов. Статическая и динамическая типизация. | |
− | + | # Номинальная и структурная эквивалентность типов. Простейшие конструкторы. | |
− | + | # Типы с кванторами и что они означают. Универсальные и экзистенциальные типы. | |
− | + | # Subtyping. Структурный и номинальный subtyping. | |
− | + | # Динамическая семантика языков. Операционная семантика большого и малого шага. | |
− | + | # Денотационный подход к описанию семантики. | |
− | + | # Аксиоматическая семантика. Верификация программ. Design by contract. | |
− | + | # Когерентность языков программирования и машинных архитектур. Языково-специфичные архитектуры, виртуальные машины и JIT-компиляция. | |
− | * | + | #<nowiki>*</nowiki> Структура рабочей программы. Код, данные, библиотеки, поддержка времени исполнения. |
− | * | + | #<nowiki>*</nowiki> Задача генерации кода. Генерация кода путем интерпретации. |
− | * | + | #<nowiki>*</nowiki> Восходящее переписывание деревьев и динамическое программирование (BURS). |
− | * | + | #<nowiki>*</nowiki> Алгоритмы распределения регистров. Распределение регистров и раскраска графов. |
− | * | + | #<nowiki>*</nowiki> Параллелизм на уровне инструкций. Планирование инструкций. |
− | * | + | #<nowiki>*</nowiki> Анализ потока управления. Глубинное остовное дерево, доминирование, анализ циклической структуры программ. Сводимость. Устранение недостижимого кода, оптимальная линеаризация. |
− | * | + | #<nowiki>*</nowiki> Анализ потока данных. Полурешеточная модель. RD, LV, AE, UEU. Устраненние мертвого кода, экономия общих подвыражений, понижение силы операций, чистка циклов. |
''<nowiki>* - вопросы будут рассмотрены при наличии времени.</nowiki>'' | ''<nowiki>* - вопросы будут рассмотрены при наличии времени.</nowiki>'' | ||
== Список литературы == | == Список литературы == | ||
− | + | # S.Muchnik. Advanced Compiler Design & Implementation. Academic Press, Morgan Kaufmann, 1998. | |
− | + | # А.Ахо, Р.Сети, С.Ульман. Компиляторы: принципы, технологии, инструменты. Вильямс, 2003. | |
− | + | # А.Ахо, С.Ульман. Теория синтаксического анализа, перевода и компиляции. Том 1. М., "Мир", 1978. | |
− | + | # F.Nielsen. Principles of Program Analysis. Springer, 2005. | |
− | + | # F.Nielse, H-R.Nielsen. Semantics with Applications. Wiley Professional Computing, 1992. | |
− | + | # B.Pierce. Types and Programming Languages. MIT Press, 2002. | |
− | + | # T.Пратт. Языки программирования: разработка и реализация. 1978. | |
− | + | # Б.К.Мартыненко. Языки и трансляции. Из-во СПбГУ, 2008. | |
== Список групп для выполнения задач == | == Список групп для выполнения задач == | ||
− | + | # [Haskell] Мартынов Семён, Башоров Залим, Казенюк Сергей, Витвицкий Александр, Тугарёв Денис. | |
− | + | # Кринкин Михаил, Лазарев Сергей, Фофанова Мария, Бандурин Дмитрий, Ждан Анна | |
− | + | # [JAVA] Сорокин Артём, Коровин Алексей, Опейкин Александр, Шеставин Дмитрий, Владислав Савельев | |
− | + | # [C++] Иванов Антон, Крашенинникова Ксения, Лепенькин Ярослав, Диевский Алексей, Кормишин Сергей | |
− | + | # Певзнер Алина, Князев Сергей | |
− | + | # [JAVA] Великий Алексей. | |
− | ''<nowiki>* Не более 5 человек в каждой группе; старайтесь выравнивать группы по уровню.</nowiki>'' | + | ''<nowiki>* Не более 5 человек в каждой группе; старайтесь выравнивать группы по уровню, и не повторяться в выборе языков.</nowiki>'' |
== Полезные ссылки == | == Полезные ссылки == |
Версия 02:21, 26 февраля 2012
Введение в языки программирования
Лектор - Дмитрий Юрьевич Булычев
Содержание
Лекции
- Лекция №1 10.02.2012
- 17.02.2012
В семантике ошибка: правило для переменной вместо
[x](s)=s(x)
читать как
[x](s)=[s(x)](s).
- 24.02.2012
Домашние задания
- [Задание №1] срок сдачи 17 февраля 2011
написать генерирующее расширения для программы возведения в степень
int exp (int x, int n) { int y = 1; while (n) { if (n % 2) y *= x; n /= 2; x *= x; } return y; }
Это генерирующее расширение должно для своего единственного параметра n печатать остаточную программу, полученную специализацией функции exp на это значение n. Если это генерирующее расширение сохранит в себе какие-то черты exp, будет совсем хорошо.
- [Задание №2] срок сдачи 24 февраля 2011
Написать принтер, который по абстрактному синтаксическому дереву программы печатает её представление в конкретном синтаксисе (который мы обсуждали) и интерпретатор (который вычисляет значение выражения в данном состоянии).
- [Задание №3] желаемы срок сдачи 26 февраля 2011
- Написать порождающую грамматику для языка над алфавитом {a, b, c}, состоящего из всех слов, в которых количество букв a, b и c одинаково.
- Написать порождающую грамматику для языка над алфавитом {0, 1}, состоящего из всех слов, в которых не встречается две единицы подряд.
- Написать порождающую грамматику для языка над алфавитом {0, 1, *}, состоящего из всех слов вида sas, где s --- непустая строка нулей и единиц любой длины, а a --- непустая строка из звездочек любой длины.
- Написать порождающую грамматику для языка над алфавитом {a, b}, состоящего из всех вида a^nb^m, где n <> m.
- Написать порождающую грамматику для языка над алфавитом {a, b}, состоящего из всех слов, в которых количество букв a в два раза больше, чем количество букв b.
- Правда ли, что любой рекурсивный язык контекстно-зависим (обратное, как известно, верно)?
- Написать реализацию построения НКА по регулярной грамматике; написать интерпретатор этого автомата, который проверяет принадлежность заданного слова языку, и принтер, который печатает граф переходов автомата в формате .dot пакета graphviz.
- Написать грамматику для порождения выражений в алфавите {x, +, *, (, )}, где x играет роль операндов, * и + --- левоассоциативные операции (то есть E+F+G означает ((E+F)+G)), операция * связывает операнды сильнее, чем + (то есть E+F*G означает E+(F*G)), причем порождаемые выражения НЕ ДОЛЖНЫ содержать ненужных скобок (а именно, например, выражение x+(x*x) не должно порождаться)
Программа курса
- Языки программирования, синтаксис, семантика, прагматика. Когнитивные особенности человеческого мышления и их влияние на развитие языков программирования.
- Языки программирования в ретроспективе. Процедурное, объектно-ориентированное, логическое и функциональное программирование. Предметно-ориентированные языки. Языки вне классификации.
- Абстрактный и конкретный синтаксис. Статическая и динамическая семантика. Компиляция и интерпретация. Проекции Футамуры-Ершова.
- Генеративный и аналитический подходы к описанию синтаксиса. Формальные грамматики, иерархия Хомского.
- Регулярные языки и конечные автоматы. Применение регулярных выражений в народном хозяйстве (grep/sed/awk) и для лексического анализа (lex/flex). Отсутствие бесконтекстной лексики в реальных языках программирования.
- Контекстно-свободные грамматики. Нормальные формы Хомского и Грейбах. Алгоритмы Эрли и Кока-Янгера-Касами. Неконтекстосвободность реальных языков программирования.
- Нисходящий анализ. Возврат и заглядывание вперед. Класс языков LL(k). Рекурсивный спуск, магазинные автоматы, парсер-комбинаторы, PEG, "скаредный" разбор. GLL. Инструменты нисходящего анализа (Parsec, ANTLR и пр.)
- Восходящий анализ, классы LR(k) и LALR(k). GLR. Инструменты восходящего анализа (yacc/bison).
- Двухуровневые и атрибутные грамматики, вопросы применения на практике.
- Идентификация. Область видимости и область действия. Статическое и динамическое, раннее и позднее связывание.
- Энергичность и ленивость. Call-by-name, call-by-value, call-by-reference.
- Строгость, чистота, прозрачность по ссылкам.
- Языки с типами и языки без типов. Статическая и динамическая типизация.
- Номинальная и структурная эквивалентность типов. Простейшие конструкторы.
- Типы с кванторами и что они означают. Универсальные и экзистенциальные типы.
- Subtyping. Структурный и номинальный subtyping.
- Динамическая семантика языков. Операционная семантика большого и малого шага.
- Денотационный подход к описанию семантики.
- Аксиоматическая семантика. Верификация программ. Design by contract.
- Когерентность языков программирования и машинных архитектур. Языково-специфичные архитектуры, виртуальные машины и JIT-компиляция.
- * Структура рабочей программы. Код, данные, библиотеки, поддержка времени исполнения.
- * Задача генерации кода. Генерация кода путем интерпретации.
- * Восходящее переписывание деревьев и динамическое программирование (BURS).
- * Алгоритмы распределения регистров. Распределение регистров и раскраска графов.
- * Параллелизм на уровне инструкций. Планирование инструкций.
- * Анализ потока управления. Глубинное остовное дерево, доминирование, анализ циклической структуры программ. Сводимость. Устранение недостижимого кода, оптимальная линеаризация.
- * Анализ потока данных. Полурешеточная модель. RD, LV, AE, UEU. Устраненние мертвого кода, экономия общих подвыражений, понижение силы операций, чистка циклов.
* - вопросы будут рассмотрены при наличии времени.
Список литературы
- S.Muchnik. Advanced Compiler Design & Implementation. Academic Press, Morgan Kaufmann, 1998.
- А.Ахо, Р.Сети, С.Ульман. Компиляторы: принципы, технологии, инструменты. Вильямс, 2003.
- А.Ахо, С.Ульман. Теория синтаксического анализа, перевода и компиляции. Том 1. М., "Мир", 1978.
- F.Nielsen. Principles of Program Analysis. Springer, 2005.
- F.Nielse, H-R.Nielsen. Semantics with Applications. Wiley Professional Computing, 1992.
- B.Pierce. Types and Programming Languages. MIT Press, 2002.
- T.Пратт. Языки программирования: разработка и реализация. 1978.
- Б.К.Мартыненко. Языки и трансляции. Из-во СПбГУ, 2008.
Список групп для выполнения задач
- [Haskell] Мартынов Семён, Башоров Залим, Казенюк Сергей, Витвицкий Александр, Тугарёв Денис.
- Кринкин Михаил, Лазарев Сергей, Фофанова Мария, Бандурин Дмитрий, Ждан Анна
- [JAVA] Сорокин Артём, Коровин Алексей, Опейкин Александр, Шеставин Дмитрий, Владислав Савельев
- [C++] Иванов Антон, Крашенинникова Ксения, Лепенькин Ярослав, Диевский Алексей, Кормишин Сергей
- Певзнер Алина, Князев Сергей
- [JAVA] Великий Алексей.
* Не более 5 человек в каждой группе; старайтесь выравнивать группы по уровню, и не повторяться в выборе языков.