Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Функциональное программирование. Лабораторный курс
- > — Это же проблема Бен Бецалеля. Калиостро же доказал, что она не имеет решения.
- >
- > — Мы сами знаем, что она не имеет решения, — сказал Хунта, немедленно ощетиниваясь. — Мы хотим знать, как ее решать.
- >
- > — Как-то ты странно рассуждаешь, Кристо… Как же искать решение, когда его нет? Бессмыслица какая-то…
- >
- > — Извини, Теодор, но это ты очень странно рассуждаешь. Бессмыслица — искать решение, если оно и так есть. Речь идет о том, как поступать с задачей, которая решения не имеет. Это глубоко принципиальный вопрос, который, как я вижу, тебе, прикладнику, к сожалению, не доступен.
- Цель лабораторного курса: получение практических навыков работы в функциональной парадигме.
- Лабораторный курс носит индивидуальный характер, конкретное наполнение и состав определяется в рамках лабораторной работы №0).
- Доступны следующие степени свободы:
- 1. Наполнение курса:
- - стандартный набор лабораторных работ, в рамках которого решается несколько синтетических задач;
- - «курсовой проект», в рамках которого решается выбранная и согласованная учащимся (или группой учащихся в 2-3 человека) задача.
- 2. Используемая технология / язык программирования.
- ## Лабораторная работа №0
- Задачи:
- - поверхностное ознакомление с предлагаемыми к использованию технологиями по открытым источникам;
- - выбор варианта наполнения курса и используемой технологии;
- - написание эссе объёмом порядка страницы, в рамках которого [обосновать](https://dic.academic.ru/dic.nsf/enc_philosophy/847/ОБОСНОВАНИЕ) свой выбор технологии и, в случае «курсового проекта», описать предлагаемую к решению задачу;
- - защита эссе, утверждение наполнения курса и выбора технологии (возможны общие вопросы о невыбранных технологиях).
- В случае если выполняется «курсовой проект» на группу учащихся - работа пишется и защищается коллективно.
- В случае если выполняется «курсовой проект», но группу ещё только предстоит собрать - по предварительному согласованию предоставляется пять минут на лекции для нужд агитации. Новобранцы подлежат регистрации.
- Примечание: при утверждении используемого языка программирования будет учитываться его популярность у ранее определившихся во избежании "курса по технологии Ч".
- ## «Курсовой проект»
- Выполнение «курсового проекта» оформляется как единый отчёт по лабораторным работам, в рамках которого описывается:
- - постановка задачи;
- - организационная структура исполнителей проекта (если это группа учащихся);
- - архитектура предлагаемого решения (предпочтительны схемные описания);
- - приводится исходный код проекта и описание инструментальной цепочки;
- - методика испытаний;
- - выводы, обобщающие полученный опыт и дающие качественную оценку применённым технологиям и приёмам.
- Отчёт сдаётся в два подхода:
- - в середине семестра (~1 апреля, но информация будет уточняться) защищается черновик первых четырёх разделов с целью корректировки направления проекта (постановка задачи, архитектура, подход к реализации, испытания);
- - в конце семестра - сдача проекта.
- Кроме отчёта:
- - работа над курсовым проектом должна вестись в репозитории (если стыдно - организую приватный).
- ### Примеры тем
- - система управления вычислениями на кластере (Erlang/OTP);
- - система распределённого хранения данных (Erlang/OTP);
- - peer2peer сервис чатов с шифрованием и хранением истории;
- - тактовая модель процессора и транслятор в шаминный язык (Haskell);
- - eDSL для разработки и анализа конечных автоматов (Haskell);
- - разработка eDSL для описания разметки оконного интерфейса (Lisp);
- - библиотека парсер-комбинаторов и eDSL фронтенд (lisp);
- - web framework (Common Lisp / CLOS);
- - разработка алгоритмов обработки данных и формальное доказательство их корректности (Coq);
- - транслятор Lua для проекта nitta.io (Haskell);
- - обобщённое программирование на базе Generic для проекта nitta.io (Haskell);
- - практически любая другая сложная и интересная задача (можете попробовать найти пересечение с другими предметами).
- ## Стандартный набор лабораторных работ
- 1. Управление потоком данных. Простые задачи на примере проекта Эйлер с разными способами реализации (рекурсия, хвостовая рекурсия, функции высшего порядка) с учётом особенностей используемого инструмента.
- 2. Работа с неизменяемыми и рекурсивными структурами данных (деревья, списки, функции высшего порядка), ленивые вычисления и бесконечные структуры данных, мемоизация. Тестирование.
- 3. Реализация лабораторной работы № 1, 2 или 3 по предмету "Вычислительная математика" с использованием функционального программирования. Сравнение реализаций.
- 4. Ввод-вывод. Реализация стандартных консольных утилит UNIX систем.
- 5. Работа с функциями как с данными (комбинаторы).
- Конкретные варианты могут значительно отличаться для разных технологий (к примеру, задания для Си будут сознательно упрощены, так как учащемуся придётся реализовывать базовые вещи вручную). В первую очередь это относится к работам номер 4 и 5.
- ## Порядок сдачи работ
- 1. Все отчеты сдаются в печатном виде. Каждый отчёт должен быть выполнен в едином стиле приближенном к ГОСТ (кроме титульного листа и основной надписи).
- 2. В случае успешной защиты на отчёте делается соответствующая отметка, после чего он хранится вами до конца семестра. Полный комплект отчётов сдаётся вместе с последней лабораторной работой, после чего лабораторный курс можно считать успешно завершённым.
- 3. В процессе сдачи может потребоваться продемонстрировать работу разработанного ПО.
- 4. Вопросы будут задаваться по следующим темам (без фанатизма, ИМХО):
- - используемая технология;
- - используемые приёмы;
- - используемая инструментальная цепочка;
- - аргументация принятых решений;
- - сравнение различных вариантов решения задачи;
- - как проверялась работоспособность (статические и экспериментальные методы);
- - область определения и сложность алгоритмов;
- - предметная область, в рамках которой может решаться задача.
- 5. «Ну ведь работает» - не является критерием успешности реализации.
- ## Варианты технологий
- - Haskell (хорошая система типов, безточечный стиль, лень, квадратно/гнездовое программирование);
- - Clojure (параллельное программирование, eDSL);
- - Common Lisp (eDSL, CLOS, бесконечная гибкость);
- - Erlang/OTP (распределенные системы);
- - Си (низкоуровневое программирование на понимание того, как это работает);
- - Coq (формальное доказательство свойств алгоритмов);
- - Ocaml;
- - Idris;
- - Agda;
- - F#;
- - ваши варианты.
- ## Экзамен
- Устный экзамен по материалам лекций, сдаётся группами (порядка трёх человек).
- Получение оценки за экзамен автоматом возможно, в случае отличного прохождения лабораторного курса (у варианта с «курсовым проектом» больше шансов). Не более 20% учащихся.
- В случае полной сдачи лабораторного курса возможна досрочная сдача экзамена группами не менее 8 человек по предварительной договорённости.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement