Систе́мне програмува́ння (або програмування систем) — це вид програмування, який полягає у розробці програм, які взаємодіють з системним програмним забезпеченням (операційною системою), або апаратним забезпеченням комп'ютераКоноваленко І. В., Федорів П. С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012.. Головною відмінністю системного програмування в порівнянні з прикладним програмуванням є те, що прикладне програмне забезпечення призначене для кінцевих користувачів (наприклад, текстові процесори, графічні редактори), тоді як результатом системного програмування є програми, які обслуговують апаратне забезпечення або операційну систему (наприклад, дефрагментація диска) що обумовлює значну залежність такого типу ПЗ від апаратної частини. Слід зазначити, що «звичайні» прикладні програми можуть використовувати у своїй роботі фрагменти коду, характерні для системних програм, і навпаки; тому чіткої межі між прикладним та системним програмуванням немаєХарт Джонсон М. Системное программирование в среде Windows / Джонсон М. Харт ; пер. с англ. — М. : Издательский дом «Вильямс», 2005.. Оскільки різні операційні системи відрізняються як внутрішньою архітектурою, так і способами взаємодії з апаратним та програмним забезпеченням, то принципи системного програмування для різних ОС є відмінними. Тому розробка прикладних програм, які здійснюватимуть одні і ті ж дії на різних ОС, може суттєво відрізнятися.

В загальному для системного програмування характерні такі особливості (одна або кілька): програміст повинен враховувати особливості операційної системи та/або апаратного забезпечення, на яких передбачається запуск програми, та використовувати ці особливості (наприклад, застосовуючи оптимізовані алгоритми для певної архітектури) зазвичай використовуються низькорівневі мови програмування або діалекти які: можуть працювати у ресурсо-обмеженому середовищі максимально раціональні та мають мінімальні затримки за часом виконання мають малі бібліотеки бібліотеки періоду виконання (RTL), або взагалі їх не мають дозволяють виконувати прямий доступ до пам'яті та керівної логіки дозволяють програмісту писати частини програми на асемблері зневадження може бути складним, якщо неможливо запустити програму у відповідному режимі через обмеження у ресурсах. Виконання програми у імітованому середовищі може зняти цю проблему.

Системне програмування суттєво відрізняється від прикладного програмування, що змушує програмістів спеціалізуватися в одній із цих галузей.

Для системного програмування часто доступна тільки обмежена кількість інструментів. Зневадження інколи має підвищену складність. Бібліотеки періоду виконання, якщо взагалі доступні, мають набагато менші можливості, і роблять менше перевірок на помилки. Через ці обмеження, часто використовуються моніторинг та реєстрація даних; операційні системи мають бути забезпечені дуже якісними підсистемами реєстрації даних.

Історія Спочатку системні програмісти неодмінно використовували асемблер. Експерименти з підтримкою апаратної частини у високорівневих мовах програмування у кінці 60-х призвели до появи таких мов як BLISS та BCPL, але С, яка допомогла росту Unix, набула поширення вже у 1980-х. Віднедавна деяке використання знайшлось і для Embedded C++, наприклад у системі вводу/виводу драйверів у Mac OS X. Станом на 2022-й в експериментальному режимі функціонує підтримка мови Rust для програмування ядра Linux.

Приклади Прикладами програмного забезпечення, розробленого в результаті системного програмування, є реалізація основних частин операційної системи та програм для мережевої роботи. Наприклад, розробка віртуальної пам'яті або драйверів для операційної системи.

Джерела