1.1 What is systems programming?
The term systems programming is a somewhat losely defined term for which several definitions can be found. Here are some definitions from the literature:
- "writing code that directly uses hardware resources, has serious resource constraints, or closely interacts with code that does" ("The C++ programming language", Stroustrup)
- "“systems-level” work [...] deals with low-level details of memory management, data representation, and concurrency" ("The Rust Programming Language", Steve Klabnik and Carol Nichols)
- "a systems programming language is used to construct software systems that control underlying computer hardware and to provide software platforms that are used by higher level application programming languages used to build applications and services" (from a panel on systems programming at the Lang.NEXT 2014 conference)
- "Applications software comprises programs designed for an end user, such as word processors, database systems, and spreadsheet programs. Systems software includes compilers, loaders, linkers, and debuggers." (Vangie Beal, from a 1996 blog post)
From these definitions, we can see that a couple of aspects seem to be important in systems programming:
- Systems programming interacts closely with the hardware
- Systems programming is concerned with writing efficient software
- Systems software is software that is used by other software, as opposed to applications software, which is used by the end-user
These definitions are still a bit ambiguous, especially the third one. Take a database as an example: A user might interact with a database to store and retrieve their data manually. At the same time, a database might be accessed from other software, such as the backend of a web-application. Most databases are developed with efficiency and performance in mind, so that they can perform well even under high load and with billions of entries. Is a database an application or systems software then?
For this course, instead of seeing systems programming and application programming as two disjunct domains, we will instead think of them as two ends of a spectrum. We will see that most software falls somewhere on this spectrum, with aspects from systems programming and aspects from application programming. For the sake of completeness, here are some types of software that will be considered systems software in the context of this course:
- Operating systems (perhaps the prime example of systems software. It even has system in the name!)
- Web-Servers
- Compilers and Debuggers
- Game Engines
Exercise 1.1 Take a look at the software running on your computer. Pick 5 programs and put them onto the systems programming/application programming scale. Try to justify your decision using the criteria for systems programming that you learned in this section.