Вопросы к экзамену
- Основные характеристики и области применения динамических языков.
- Интерпретация и компиляция. AOT-, JIT- компиляция. Компиляция в
динамических языках.
- Виды типизации. Преимущества и недостатки различных видов типизации.
Типизация в динамических языках.
- Язык Ruby, классификация, основные реализации. Встроенные структуры данных.
- Семантика регулярных выражений. Основные операции с регулярными
выражениями.
- Объектная модель Ruby.
- Динамическое изменение объектной модели в Ruby: элементы Meta-Object
Protocol.
- Основные положения функциональной парадигмы программирования. Неподвижное
состояние, преимущества и недостатки.
- Понятие лексического контекста. Замыкания.
- Побочные эффекты. Чистые функции. Преимущества и недостатки.
- Функции как объекты первого класса. Функции высших порядков: функционал,
оператор. Примеры. Операторы композиции и частичного применения
(каррирования).
- Основные функции преобразования коллекций: map, reduce, filter. Отличия от
прямой итерации по коллекции. Примеры использования (на Ruby или Clojure).
- Язык Clojure. Концепция LISP: код как данные, связь с АСД. Модель
компиляции/исполнения. REPL.
- Встроенные типы и структуры данных Clojure. Основные операции.
- Основные управляющие структуры Clojure: вызов функции, ветвления, цикл.
Связь рекурсии и цикла. Хвостовая рекурсия в Clojure. Императивные управляющие
структуры: последовательное исполнение, doseq.
- Генератор for в Clojure, связь с map/reduce/filter.
- Мемоизация. Область и примеры применения.
- Реорганизующее присваивание (destructuring) в Clojure. Использование при
объявлении/вызове функции, в let.
- Отложенные вычисления на примере Clojure. Ленивые последовательности,
delay. Основные операции над ленивыми последовательностями.
- Потоки данных. Моделирование состояния с помощью потоков. Примеры
использования. Бесконечные потоки.
- Квотирование (quote). Виды квотирования в Clojure. Обратные операции:
unquote, eval.
- Специальные формы. Макросы. Модель исполнения. Применение макросов.
- Особенности разрешения символов в eval и макросах. Внутренние переменные в
макросах.
- Разделение ответственностей. Принцип KISS. Связь с модульностью и
абстракцией.
- Ответственности 2-го класса (cross-cutting concerns). Примеры. Способы
разделения ответственностей.
- Инверсия управления (принцип Голливуда). Примеры применения.
- Внедрение зависимостей (Dependency Injection, DI). Элементарное DI. DI с
использованием контейнера. Связь с порождающими шаблонами проектирования.
- Формы управления параллелизмом без блокировок.
- Atomic-типы. Atomic-ссылка в Clojure, основные операции. Агенты. Future,
promise.
- Транзакционная память. Multi-Version Concurrency Control. Реализация в
Clojure: алгоритм выполнения транзакции, изоляция транзакций.
- Понятие распределенной транзакции. CAP-теорема. Транзакции типа
Copy-Modify-Merge.
- Формы полиморфизма. Полиморфизм в динамических языках. Принцип подстановки
Барбары Лисков (строгая формулировка). Интерпретация в контрактном
программировании.
- Полиморфизм в иерархиях с одиночным и множественным наследованием.
Комбинация методов на примере CLOS.
- Обобщенные функции и посылка сообщений. Диспетчеризация по нескольким
параметрам. Примеры использования.
- Вспомогательные методы. Комбинация в иерархии наследования на примере CLOS.
Примеры использования для разделения ответственностей.
- Command-Query Separation. Применение в функциональных и императивных
объектных моделях.
- Аспектно-ориентированное программирование. Перехват, способы реализации.
Применение для разделения ответственностей.
- Понятие динамического лексического контекста. Реализация в Clojure. Связь с
АОП. Применение для разделения ответственностей.