Системное программирование
Системное программирование (англ. systems programming) — это область программирования, связанная с разработкой системного программного обеспечения. Ключевое отличие системного программирования от прикладного программирования состоит в том, что прикладное программирование создаёт программы, непосредственно предоставляющие услуги пользователю (например, текстовый процессор), в то время как целью системного программирования является создание программ и программных платформ, предоставляющих услуги другим программам, работающим в условиях ограниченных ресурсов или с особыми требованиями к производительности (например, операционные системы, приложения для вычислительной науки, игровые движки, промышленная автоматизация и приложения по модели программное обеспечение как услуга)[1].
Системное программирование требует высокого уровня понимания аппаратного обеспечения. Главной целью является эффективное использование доступных ресурсов, что особенно важно в производительно-критичных задачах или когда даже незначительное повышение эффективности ведёт к существенным экономическим или временным сбережениям.
Обзор
Для системного программирования характерны следующие особенности:
- Программист может делать предположения относительно аппаратного обеспечения и других свойств системы, на которой выполняется программа, и часто использует эти особенности, применяя, например, специфичные для оборудования эффективные алгоритмы.
- Обычно используется низкоуровневый язык программирования или его диалект, что позволяет:
- создавать программы для работы в условиях ограниченных ресурсов,
- обеспечивать высокую производительность с минимальными накладными расходами на исполняемую среду, вплоть до отсутствия или минимального объёма библиотеки времени выполнения,
- осуществлять непосредственный и «сырой» контроль за доступом к памяти и управлением потоком исполнения,
- реализовывать части программы прямо на языке ассемблера.
- Часто системные программы нельзя выполнить в отладчике. Запуск программы в симулированной среде иногда снижает остроту этой проблемы.
В системном программировании возможности языков программирования часто ограничены. Автоматический сборщик мусора применяется редко, а отладка бывает затруднена. Библиотека времени выполнения, если присутствует, существенно менее функциональна и реализует минимальную проверку ошибок. В связи с этим часто используются мониторинг и журналирование; современные операционные системы могут содержать весьма сложные подсистемы журналирования.
Реализация ряда компонентов операционных систем и сетевых функций невозможна без системного программирования, например, при создании механизма подкачки (виртуальная память) или драйвера устройств.
История
Изначально системные программисты практически всегда работали на языке ассемблера. Эксперименты по поддержке системных задач в языках высокого уровня во второй половине 1960-х привели к появлению таких языков, как PL/S, BLISS, BCPL, а также расширенного ALGOL для больших компьютеров Burroughs. Язык Forth также нашёл применение в качестве системного. В 1970-х годах широкое распространение получил язык C, чему способствовал рост популярности Unix. Позднее появился подмножество языка C++ — Embedded C++, который, например, применяется в драйверах I/O Kit для macOS[2]. В 2007 году инженеры компании Google разработали язык Go для повышения продуктивности программистов при создании крупных распределённых систем. В языке реализованы такие возможности, как параллелизм, сборка мусора и быстрая компиляция, превосходящая по скорости C и C++[3]. В 2015 году был представлен язык Rust, который часто применяется в системном программировании. Rust был разработан с приоритетом обеспечения безопасности управления памятью, сохраняя производительность на уровне C и C++.
Альтернативное значение
По историческим причинам в ряде организаций под термином «системный программист» понимается должность, правильнее обозначаемая как системный администратор. Это особенно характерно для организаций, в вычислительных ресурсах которых традиционно доминируют мэйнфреймы. Однако иногда этот термин используется и для должностей, не связанных с мэйнфреймами. Такое значение возникло потому, что администрирование мейнфреймов IBM часто требовало написания пользовательского ассемблерного кода (на языке IBM Basic Assembly Language (BAL)), взаимодействующего с операционными системами такими как OS/MVS, DOS/VSE или VM/CMS. Некоторые программные продукты IBM содержали значительный вклад кода со стороны заказчиков. Такой тип программирования стал встречаться всё реже, его вытесняет использование языка C вместо ассемблера, однако термин «системный программист» продолжает оставаться де-факто обозначением должности для сотрудников, управляющих мэйнфреймами IBM, даже если их регулярная деятельность не связана с системным программированием.
Примечания
Литература
- Systems Programming / Джон Дж. Донован (John J. Donovan)