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

Overview of systems software and applications software

🔤 Exercise 1.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. Justify your decisions using the criteria for systems programming that you learned in this section.

💡 Need help? Click here
SoftwareSystems Programming (0) vs. Applications Programming (5)Reasons
Browser2High performance and security demands, needs to run JavaScript code (and potentially WASM, WebGL etc.)
Terminal3Seems low-level, but most of the heavy lifting is done by the OS, making the terminal more of a GUI for typing commands and displaying text
Mail Client5Not particularily resource-constrained, needs to make some network calls and maybe uses a database internally, but mostly this is a user-facing GUI application
systemd (on Linux)0Its main purpose is to control other software, and it interacts closely with the OS
IDE (e.g. VS Code)4A fancy text editor that acts as a GUI for all the actual development components (compiler, linker etc.)