что такое системное программирование?

26

Я никогда не понимал, что означает системное программирование. Обычно дается следующее определение: «... делать что-то близкое к Os или расширять возможности Os ...».

Использует ли Windows API напрямую, а не некоторые библиотеки, чтобы сказать, делает ли файловый ввод / вывод системным программированием? Пишет системное программирование Android OS? Если я напишу что-нибудь, что откроет ядро ​​Linux через консоль, как приложение на Android, я занимаюсь системным программированием? Если я пишу программное обеспечение для управления стиральной машиной, пишу ли я системное программирование?

Я новичок в программировании, и это не смущает меня до конца. Пожалуйста, объясните, противопоставляя это "прикладному программированию".

kentjh
источник
2
Это определение изменилось, и сами системные программисты сегодня не уверены в уникальном определении. Эта проблема обычно возникает, когда люди спорят о том, удобен ли язык X для системного программирования ...
Денис Сегюре
@Denys Séguret - иронично, если никто не может договориться о том, с чего начать «системное программирование».
Джон

Ответы:

19

Мне лично нравится определение из Википедии :

Системное программирование (или системное программирование) - это деятельность по программированию системного программного обеспечения. Основная отличительная характеристика системного программирования по сравнению с прикладным программированием состоит в том, что прикладное программирование направлено на создание программного обеспечения, которое предоставляет услуги пользователю (например, текстовый процессор), тогда как системное программирование нацелено на создание программного обеспечения, которое предоставляет услуги компьютерному оборудованию (например, дефрагментатор диска). ). Это требует большей степени аппаратной осведомленности.

Неманья Трифунович
источник
12

Есть несколько вопросов, которые вы можете задать себе, чтобы практиковаться в решении этого вопроса.

  • Была ли система изначально продана без этой программы? Angry Birds может быть «приложением-убийцей» для смартфона (причина, по которой его кто-то покупает), но это все еще отдельное стороннее приложение, написанное спустя долгое время после появления телефона. Написание этого было бы программированием приложений. Но драйвер дисплея того же смартфона крайне важен для его использования, так что это было бы системное программирование.
  • Можете ли вы представить перенос кода на другую платформу без переписывания? TeX и troffбыли портированы практически на любую систему с небольшими изменениями, поэтому они являются приложениями, даже если они расположены в нижней части цепочки инструментов, которую обычно используют люди. Файловая система, в которую TeX записывает свои выходные данные, например UFS или VFAT, является пограничным случаем. Вы могли бы портировать файловую систему на другую ОС, если она была совершенно потрясающей, но обычно люди просто берутся за потрясающие идеи и пишут свои собственные файловые системы для своих собственных ОС. Это делает системное программное обеспечение файловых систем.
  • Реализована ли функциональность в ядре или в отдельных двоичных файлах? (Файловые системы также занимают здесь промежуточное положение. Многие части многих файловых систем фактически являются кодом ядра, но многие имеют существенную часть в пространстве пользователя.) Драйверы графического дисплея в принципе могут быть подключаемыми внешними компонентами, но они часто реализуются в ядре или, по крайней мере, с привилегированным прямым доступом к ядру (или даже к оборудованию). Это было бы системное программирование. С другой стороны, компьютерные игры, использующие стек графического дисплея, являются приложениями.

На ваши вопросы, написание ОС Android было определенно системным программированием. Написание программы, использующей вызовы API Windows, является прикладным программированием. Он не так переносим, ​​как если бы вы использовали кросс-платформенные библиотеки, такие как SDL или OpenGL, но в принципе его можно портировать, он является сторонним кодом и работает в пространстве пользователя. Консольное приложение, отображающее состояние ядра Linux, представляет собой интересный мысленный эксперимент. Я бы определенно сказал, что это связано с системным программированием, поскольку вам нужно много знать о структуре Linux (обратите внимание, что «Linux» - это, по сути, только ядро, а не дистрибутив), чтобы писать и, возможно, даже использовать его!

Килиан Фот
источник
4

Вкратце: написание программного обеспечения, которое расширяет или улучшает функционирование ОС, например, драйверов, обновлений системных утилит для ОС или даже совершенно новых ОС.

В основном это касается управления памятью; Операции ввода-вывода в широком смысле этого слова, такие как работа в сети, доступ к файлам и управление устройствами; управление процессами (многозадачность, администрирование процессов и т. д.); user <-> методы взаимодействия с системой (как внутри, так и снаружи) и администрирование пользователей. В основном все, что является частью ОС, а не приложением, является системным программированием.

О нет
источник
3

Использование Windows API напрямую было, в какой-то момент, обычным способом написания приложений для Windows. Так что нет, это не системное программирование.

Системное программирование - это не просто «близость к ОС», это нечто важное для функционирования ядра компьютерной системы. Поэтому написание ОС - это системное программирование. Написание видеодрайверов, драйверов файловых систем, сетевых драйверов для этой ОС - системное программирование. Написание компилятора для конкретной комбинации языка / чипсета - системное программирование.

Консоль 80x24
источник
1

Обычно это относится к «низкоуровневым вещам, которые нетехнические конечные пользователи не знают, существуют или не очень четко знают, что они используют или что они делают».

Некоторые примеры, которые часто рассматриваются как системное программирование:

  • операционные системы и драйверы
  • составители
  • эмуляторы и виртуализация
  • создание дистрибутива, т. е. создание пользовательских изображений.

    Это обычно включает в себя выбор стандартной библиотеки C, системы инициализации и базовых пользовательских компонентов, таких как оболочка.

Системное программирование часто делается в нижней скомпилированных языках уровня без автоматической сборки мусора , как C или сборки, и , как правило, доступ реже система часто вызывает через интерфейсы POSIX C .

Я продолжаю практическое руководство, которое охватывает несколько тем системного программирования здесь .

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
0

При определении этого я бы держался подальше от любых технических деталей. Тогда это становится легко.

Приложение позволяет пользователю делать что-то полезное с некоторыми технологиями. Таким образом, прикладное программирование нацелено на предоставление функций пользователю, напрямую.

Системное программирование, с другой стороны, заложило бы основу, чтобы сделать возможным прикладное программирование. Он предоставляет функции для прикладного программиста, а не для пользователя.

Это определение сохранится, но это вопрос перспективы, контекста и ролей. Для программиста инструменты программирования являются приложениями. Для конечного пользователя они бессмысленны, просто вне картины.

Мартин Маат
источник
-3

Короче говоря, системное программирование по сравнению с прикладным программированием заключается в том, что SP обрабатывает программное обеспечение ОС для работы с аппаратными ресурсами, а точка доступа - действиями конечных пользователей.

Tushar
источник
4
кажется, это не дает ничего существенного по сравнению с замечаниями, сделанными и объясненными в предыдущих 4 ответах
комнат