Серия скринкастов «Вычисления» — это насыщенное введение в ключевые концепции теории вычислений, представленное в практическом формате с использованием реального кода. От машин Тьюринга до иерархии Хомского, от лямбда-исчисления до фундаментальных ограничений вычислимости — курс помогает сформировать цельное понимание того, как работают вычислительные системы на самом базовом уровне.
Чему вы научитесь
Скринкасты структурированы так, чтобы постепенно провести вас от базовых идей к более сложным вычислительным моделям. Каждый урок — это сочетание теории, демонстраций и анализа ключевых примеров.
1. Введение в вычисления
Краткий обзор основных тем серии: машины Тьюринга, лямбда-исчисление, проблема остановки, эквивалентность Тьюринга и иерархия Хомского. Этот модуль задаёт фундамент для дальнейшего изучения.
2. Вычисление путем изменения
Создаем базовый симулятор машины Тьюринга и запускаем на нем первую простую программу. В процессе разбираем элегантные упрощения, предложенные Аланом Тьюрингом.
3. Мощность машин Тьюринга
Показываем, как машины Тьюринга реализуют знакомые программистам концепции: циклы, условия, составные структуры данных. На основе этих возможностей выполняем сложение целых чисел и демонстрируем построение массивов, строк и вложенных структур.
4. Вычисление путем построения
Шаг за шагом превращаем функцию на Python в форму лямбда-исчисления, постепенно отказываясь от встроенных возможностей языка. В итоге получаем чистую модель вычислений на основе функций одного аргумента.
5. Мощность исчисления лямбда
Строим числа и логические значения с нуля — исключительно через функции. Реализуем факториал без использования Python-примитивов. Обсуждаем преобразование Church numerals и оптимизацию выражений.
6. Пределы вычислений
Изучаем проблемы, которые не может решить никакой компьютер — ни теоретический, ни реальный. Рассматриваем последствия неразрешимости для компиляторов, анализа кода и систем типов.
7. Распознавание простых языков
Погружаемся в регулярные языки: регулярные выражения, регулярные грамматики и конечные автоматы. Пошагово преобразуем одно и то же выражение через все три системы, показывая их эквивалентность.
8. Распознавание языков программирования
Разбираем контекстно-свободные языки — основу синтаксиса Python, Lua и многих других. Анализируем примеры кода, сравнивая структурирование программы глазами человека и компилятора.
9. Самые сложные языки
Завершаем разбор иерархии Хомского контекстно-зависимыми и неограниченными грамматиками. Показываем связь неразрешимых проблем с языковыми уровнями и приводим примеры реальных языков с теоретически неразрешимой грамматикой.
10. Заключительные замечания по вычислениям
Обсуждаем удивительные вопросы «граммарности»: как описать синтаксис регулярных выражений или грамматик с помощью грамматик? Завершаем серией концептуальных связей между моделями Тьюринга, лямбда-исчислением и парадигмами программирования.
Почему этот курс важен
Курс помогает программистам, инженерам и любителям теории глубже понять природу вычислений. Эти знания:
- усиливают понимание принципов работы языков и компиляторов;
- расширяют кругозор за счёт изучения фундаментальных моделей;
- улучшают способность мыслить абстрактно и проектировать сложные системы;
- формируют основу для дальнейшего изучения теории сложности, логики и формальных методов.
Кому подойдет серия скринкастов
Материал будет полезен:
- начинающим и опытным программистам;
- студентам технических направлений;
- инженерам, интересующимся теорией вычислений и устройством языков;
- всем, кто хочет понять, что происходит «под капотом» программирования.