Раздел описывает общие принципы создания и выполнения программ: от представления данных и организации исходного кода до компиляции, управления памятью, конкурентного выполнения и взаимодействия с операционной системой.
Материалы раздела рассматривают как универсальные концепции программирования, так и особенности конкретных языков, стандартных библиотек, инструментов разработки и сред выполнения.
Основные направления
- Основы программирования — переменные, типы данных, выражения, операторы, ветвления, циклы, функции и базовые способы организации вычислений.
- Парадигмы программирования — императивное, процедурное, объектно-ориентированное, функциональное, декларативное и событийно-ориентированное программирование.
- Системы типов — статическая и динамическая типизация, сильная и слабая типизация, вывод типов, преобразования, generics и проверка корректности операций.
- Структуры данных языка — массивы, списки, словари, множества, структуры, классы, перечисления и другие встроенные способы представления данных.
- Функции и области видимости — параметры, возвращаемые значения, замыкания, рекурсия, области видимости, время жизни переменных и передача данных между частями программы.
- Модули и организация кода — пакеты, пространства имён, импорт, экспорт, разделение ответственности и формирование программных компонентов.
- Обработка ошибок — коды возврата, исключения, специальные типы результатов, распространение ошибок, восстановление после сбоев и обработка нештатных состояний.
- Компиляция — преобразование исходного кода в машинный код или промежуточное представление, этапы компиляции, оптимизация, сборка и связывание.
- Интерпретация — выполнение исходного или промежуточного кода интерпретатором, динамическая загрузка и особенности интерпретируемых языков.
- Среды выполнения — виртуальные машины, runtime-библиотеки, управление программой во время выполнения и взаимодействие с операционной системой.
- Управление памятью — stack, heap, выделение и освобождение памяти, ссылки, указатели, владение данными и автоматическая сборка мусора.
- Конкурентность — потоки, задачи, goroutines, процессы, синхронизация, блокировки, атомарные операции, состояния гонки и взаимные блокировки.
- Асинхронное программирование — callbacks, promises, futures, async/await, event loop, неблокирующий ввод-вывод и управление асинхронными операциями.
- Ввод и вывод — работа с файлами, потоками, терминалом, стандартными потоками, буферизацией и внешними устройствами.
- Сетевое программирование — сокеты, TCP, UDP, HTTP-клиенты, HTTP-серверы, обработка соединений и сетевых ошибок.
- Сериализация данных — преобразование объектов и структур данных в JSON, XML, Protocol Buffers и другие форматы обмена.
- Управление зависимостями — пакеты, модули, версии, lock-файлы, репозитории, разрешение зависимостей и публикация библиотек.
- Конфигурация программ — аргументы командной строки, переменные окружения, конфигурационные файлы, значения по умолчанию и проверка конфигурации.
- Тестирование программ — модульные, интеграционные, функциональные и системные тесты, тестовые двойники, генерация данных и измерение покрытия.
- Отладка — breakpoints, пошаговое выполнение, исследование состояния программы, stack trace, core dump и анализ ошибок выполнения.
- Профилирование — измерение времени выполнения, потребления процессора и памяти, поиск узких мест и анализ поведения программы под нагрузкой.
- Производительность — вычислительная стоимость операций, управление выделениями памяти, кеширование, конкурентное выполнение и оптимизация критических участков.
- Инструменты разработки — компиляторы, интерпретаторы, линтеры, форматтеры, анализаторы кода, отладчики, профилировщики и средства сборки.
- Стандартные библиотеки — базовые средства языков для работы с коллекциями, файлами, сетью, временем, конкурентностью, кодировками и системными функциями.
- Языки программирования — особенности синтаксиса, модели типов, управления памятью, конкурентности и экосистем конкретных языков.
- Командные приложения — разработка CLI-программ, обработка аргументов, интерактивный ввод, exit codes и интеграция с командной оболочкой.
- Системное программирование — взаимодействие с системными вызовами, памятью, процессами, файловыми дескрипторами, сигналами и ресурсами операционной системы.
- Прикладное программирование — создание серверных, пользовательских, автоматизационных и интеграционных приложений.
Языки и технологии
- Go — компилируемый язык со статической типизацией, встроенной поддержкой конкурентности и развитой стандартной библиотекой для сетевых и инфраструктурных приложений.
- Python — динамический язык для автоматизации, обработки данных, прототипирования, backend-разработки и создания вспомогательных инструментов.
- Java — язык и платформа для корпоративных, серверных и распределённых приложений, выполняемых в виртуальной машине JVM.
- JavaScript — язык браузеров и серверной среды Node.js, основанный на событийной модели и асинхронном выполнении.
- TypeScript — расширение JavaScript со статической системой типов и инструментами для разработки крупных приложений.
- Bash и командные оболочки — языки управления командами, системной автоматизации и объединения инструментов операционной системы.
- Rust — системный язык со статической типизацией, контролем владения памятью и безопасной моделью конкурентности.
Основные вопросы раздела
Материалы раздела должны помогать отвечать на следующие вопросы:
- Как исходный код превращается в выполняющуюся программу?
- Чем компиляция отличается от интерпретации?
- Какую роль выполняет среда выполнения?
- Как язык представляет и проверяет типы данных?
- Где хранятся переменные и объекты программы?
- Как управляется время жизни данных?
- Чем автоматическая сборка мусора отличается от ручного управления памятью?
- Как программа взаимодействует с операционной системой?
- Чем поток отличается от процесса, задачи и goroutine?
- Как возникают состояния гонки и взаимные блокировки?
- Чем асинхронное выполнение отличается от параллельного?
- Как организовать обработку ошибок без потери контекста?
- Как управлять зависимостями и версиями библиотек?
- Как тестировать отдельные компоненты и программу целиком?
- Как найти причину ошибки, утечки памяти или высокой нагрузки?
- Как выбрать язык и среду выполнения для конкретной задачи?
- Какие свойства языка влияют на надёжность, производительность и сопровождение программы?
Границы раздела
Раздел посвящён общим механизмам программирования, особенностям языков и поведению программ во время выполнения.
Аппаратные механизмы процессора и памяти рассматриваются в разделе вычислительных систем. Управление процессами, файлами и ресурсами конкретной операционной системы относится к разделу операционных систем. Математические методы и структуры для решения вычислительных задач рассматриваются в разделе алгоритмов и структур данных. Архитектура приложений и организация программных компонентов относятся к разделу проектирования программного обеспечения.