# Systems programming

> Mediated Wiki article. Canonical URL: https://mediated.wiki/source/Systems_programming
> Markdown URL: https://mediated.wiki/source/Systems_programming.md
> Source: https://en.wikipedia.org/wiki/Systems_programming
> Source revision: 1352193838
> License: Creative Commons Attribution-ShareAlike 4.0 International (https://creativecommons.org/licenses/by-sa/4.0/)

{{Short description|Developing programs for computer systems}}
{{More citations needed|date=November 2024}}
'''Systems programming''', or '''system programming''', is the activity of programming<ref name=":0" /> [computer](/source/computer) [system software](/source/system_software). The primary distinguishing characteristic of systems programming when compared to [application programming](/source/application_programming) is that application programming aims to produce software which provides services to the user directly (e.g. [word processor](/source/word_processor)), whereas systems programming aims to produce software and [software platform](/source/software_platform)s which provide services to other software, are performance constrained, or both (e.g. [operating system](/source/operating_system)s, [computational science](/source/computational_science) applications, [game engine](/source/game_engine)s, [industrial automation](/source/Automation), and [software as a service](/source/software_as_a_service) applications).<ref name=":0">{{cite web|title=Panel: Systems Programming in 2014 and Beyond|url=https://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2014/Panel-Systems-Programming-Languages-in-2014-and-Beyond|publisher=Microsoft|access-date=4 December 2015}}</ref>

Systems programming requires a great degree of hardware awareness. Its goal is to achieve efficient use of available resources, either because the software itself is performance-critical or because even small efficiency improvements directly transform into significant savings of time or money.

== Overview ==

The following attributes characterize systems programming:
* The [programmer](/source/programmer) can make assumptions about the hardware and other properties of the system that the program runs on, and will often exploit those properties, for example by using an [algorithm](/source/algorithm) that is known to be efficient when used with specific hardware.
* Usually a [low-level programming language](/source/low-level_programming_language) or programming language dialect is used so that:
** Programs can operate in resource-constrained environments
** Programs can be efficient with little [runtime](/source/Run-time_system) overhead, possibly having either a small [runtime library](/source/runtime_library) or none at all
** Programs may use direct and "raw" control over memory access and [control flow](/source/control_flow)
** The programmer may write parts of the program directly in [assembly language](/source/assembly_language)
* Often systems programs cannot be run in a [debugger](/source/debugger). Running the program in a [simulated environment](/source/computer_simulation) can sometimes be used to reduce this problem.{{Dubious|date=April 2024|reason=Most software built using contemporary programming languages can be run in a debugger, but it may not be acceptable to debug software in production or embedded systems.}}

In systems programming, often limited programming facilities are available. The use of [automatic garbage collection](/source/garbage_collection_(computer_science)) is not common and [debugging](/source/debugging) is sometimes hard to do. The [runtime library](/source/runtime_library), if available at all, is usually far less powerful, and does less error checking. Because of those limitations, [monitoring](/source/System_monitoring) and [logging](/source/data_logging) are often used; [operating system](/source/operating_system)s may have extremely elaborate logging subsystems.

Implementing certain parts in [operating systems](/source/Operating_system) and networking requires systems programming, for example implementing paging ([virtual memory](/source/virtual_memory)) or a [device driver](/source/device_driver) for an operating system.

== History ==
Originally systems programmers invariably wrote in [assembly language](/source/assembly_language). Experiments with hardware support in [high level languages](/source/high_level_languages) in the late 1960s led to such languages as [PL/S](/source/IBM_PL%2FS), [BLISS](/source/BLISS), [BCPL](/source/BCPL), and extended [ALGOL](/source/ALGOL) for [Burroughs Large Systems](/source/Burroughs_Large_Systems). [Forth](/source/Forth_(programming_language)) also has applications as a systems language. 
In the 1970s, [C](/source/C_(programming_language)) became widespread, aided by the growth of [Unix](/source/Unix).
More recently a subset of [C++](/source/C%2B%2B) called [Embedded C++](/source/Embedded_C%2B%2B) has seen some use, for instance it is used in the I/O Kit drivers of [macOS](/source/macOS).<ref>{{cite web|author1=Apple Inc|title=I/O Kit Device Driver Design Guidelines|url=https://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/WritingDeviceDriver/CPluPlusRuntime/CPlusPlusRuntime.html#//apple_ref/doc/uid/TP30000695-BAJIBFDE|website=developer.apple.com|publisher=Apple Inc|access-date=16 September 2014|date=14 August 2009}}</ref>
Engineers working at [Google](/source/Google) created [Go](/source/Go_(programming_language)) in 2007 to address developer productivity in large [distributed systems](/source/Distributed_computing), with developer-focused features such as [Concurrency](/source/Concurrency_(computer_science)), [Garbage Collection](/source/Garbage_collection_(computer_science)), and faster program [compilation](/source/Compilation_(computing)) than C and C++.<ref>{{Cite web |title=Go at Google: Language Design in the Service of Software Engineering - The Go Programming Language |url=https://go.dev/talks/2012/splash.article |access-date=2024-04-11 |website=go.dev |language=en}}</ref>
In 2015 [Rust](/source/Rust_(programming_language)) came out, a general-purpose programming language often used in systems programming. Rust was designed with memory safety in mind and to be as performant as C and C++.

== Alternative meaning ==
For historical reasons, some organizations use the term ''systems programmer'' to describe a job function which would be more accurately termed [systems administrator](/source/systems_administrator).  This is particularly true in organizations whose computer resources have historically been dominated by [mainframe](/source/Mainframe_computer)s, although the term is even used to describe job functions which do not involve mainframes. This usage arose because administration of [IBM mainframes](/source/IBM_mainframes) often involved the writing of custom [assembler code](/source/assembler_code) ([IBM's Basic Assembly Language](/source/IBM_Basic_assembly_language_and_successors)  (BAL)), which integrated with the [operating system](/source/operating_system) such as [OS/MVS](/source/OS%2FMVS), [DOS/VSE](/source/DOS%2FVSE) or [VM/CMS](/source/VM%2FCMS).  Indeed, some [IBM](/source/IBM) software products had substantial code contributions from customer programming staff. This type of programming is progressively less common, and increasingly done in C rather than Assembly, but the term ''systems programmer'' is still used as the de-facto job title for staff administering IBM mainframes even in cases where they do not regularly engage in systems programming activities.

== See also ==
* [Ousterhout's dichotomy](/source/Ousterhout's_dichotomy)
* [System programming language](/source/System_programming_language)
* [Scripting language](/source/Scripting_language)
* [Interrupt handler](/source/Interrupt_handler)
* [Computer Programming](/source/Computer_programming)

== References ==
{{Reflist}}

==Further reading==
* [https://catalog.loc.gov/vwebv/holdingsInfo?&bibId=4177732 Systems Programming] by [John J. Donovan](/source/John_J._Donovan)

{{Authority control}}

{{DEFAULTSORT:Systems Programming}}
Category:Computer programming
Category:System software

---
Adapted from the Wikipedia article [Systems programming](https://en.wikipedia.org/wiki/Systems_programming) by Wikipedia contributors ([contributor history](https://en.wikipedia.org/wiki/Systems_programming?action=history)). Available under [Creative Commons Attribution-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/). Changes may have been made.
