Вопросы к экзамену

  1. Основные характеристики и области применения динамических языков.
  2. Интерпретация и компиляция. AOT-, JIT- компиляция. Компиляция в динамических языках.
  3. Виды типизации. Преимущества и недостатки различных видов типизации. Типизация в динамических языках.
  4. Язык Ruby, классификация, основные реализации. Встроенные структуры данных.
  5. Семантика регулярных выражений. Основные операции с регулярными выражениями.
  6. Объектная модель Ruby.
  7. Динамическое изменение объектной модели в Ruby: элементы Meta-Object Protocol.
  8. Основные положения функциональной парадигмы программирования. Неподвижное состояние, преимущества и недостатки.
  9. Понятие лексического контекста. Замыкания.
  10. Побочные эффекты. Чистые функции. Преимущества и недостатки.
  11. Функции как объекты первого класса. Функции высших порядков: функционал, оператор. Примеры. Операторы композиции и частичного применения (каррирования).
  12. Основные функции преобразования коллекций: map, reduce, filter. Отличия от прямой итерации по коллекции. Примеры использования (на Ruby или Clojure).
  13. Язык Clojure. Концепция LISP: код как данные, связь с АСД. Модель компиляции/исполнения. REPL.
  14. Встроенные типы и структуры данных Clojure. Основные операции.
  15. Основные управляющие структуры Clojure: вызов функции, ветвления, цикл. Связь рекурсии и цикла. Хвостовая рекурсия в Clojure. Императивные управляющие структуры: последовательное исполнение, doseq.
  16. Генератор for в Clojure, связь с map/reduce/filter.
  17. Мемоизация. Область и примеры применения.
  18. Реорганизующее присваивание (destructuring) в Clojure. Использование при объявлении/вызове функции, в let.
  19. Отложенные вычисления на примере Clojure. Ленивые последовательности, delay. Основные операции над ленивыми последовательностями.
  20. Потоки данных. Моделирование состояния с помощью потоков. Примеры использования. Бесконечные потоки.
  21. Квотирование (quote). Виды квотирования в Clojure. Обратные операции: unquote, eval.
  22. Специальные формы. Макросы. Модель исполнения. Применение макросов.
  23. Особенности разрешения символов в eval и макросах. Внутренние переменные в макросах.
  24. Разделение ответственностей. Принцип KISS. Связь с модульностью и абстракцией.
  25. Ответственности 2-го класса (cross-cutting concerns). Примеры. Способы разделения ответственностей.
  26. Инверсия управления (принцип Голливуда). Примеры применения.
  27. Внедрение зависимостей (Dependency Injection, DI). Элементарное DI. DI с использованием контейнера. Связь с порождающими шаблонами проектирования.
  28. Формы управления параллелизмом без блокировок.
  29. Atomic-типы. Atomic-ссылка в Clojure, основные операции. Агенты. Future, promise.
  30. Транзакционная память. Multi-Version Concurrency Control. Реализация в Clojure: алгоритм выполнения транзакции, изоляция транзакций.
  31. Понятие распределенной транзакции. CAP-теорема. Транзакции типа Copy-Modify-Merge.
  32. Формы полиморфизма. Полиморфизм в динамических языках. Принцип подстановки Барбары Лисков (строгая формулировка). Интерпретация в контрактном программировании.
  33. Полиморфизм в иерархиях с одиночным и множественным наследованием. Комбинация методов на примере CLOS.
  34. Обобщенные функции и посылка сообщений. Диспетчеризация по нескольким параметрам. Примеры использования.
  35. Вспомогательные методы. Комбинация в иерархии наследования на примере CLOS. Примеры использования для разделения ответственностей.
  36. Command-Query Separation. Применение в функциональных и императивных объектных моделях.
  37. Аспектно-ориентированное программирование. Перехват, способы реализации. Применение для разделения ответственностей.
  38. Понятие динамического лексического контекста. Реализация в Clojure. Связь с АОП. Применение для разделения ответственностей.