System Software
System Software
Examples of
system software include operating systems (OS) (like macOS, Linux, Android, and Microsoft
Windows).[1]
Application software is software that allows users to do user-oriented tasks such as create text
documents, play or develop games, create presentations, listen to music, draw pictures, or browse
the web. Examples are: computational science software, game engines, search engines, industrial
automation, and software as a service applications.[2]
In the late 1940s, application software was custom-written by computer users to fit their specific
hardware and requirements. System software was usually supplied by the manufacturer of the
computer hardware and was intended to be used by most or all users of that system.
Many operating systems come pre-packaged with basic application software. Such software is
not considered system software when it can be uninstalled without affecting the functioning of
other software. Examples of such software are games and simple editing tools supplied with
Microsoft Windows, or software development toolchains supplied with many Linux
distributions.
Some of the grayer areas between system and application software are web browsers integrated
deeply into the operating system such as Internet Explorer in some versions of Microsoft
Windows, or ChromeOS where the browser functions as the only user interface and the only way
to run programs (and other web browser their place).
Operating systems or system control program
edit
The operating system (prominent examples being Microsoft Windows, macOS, Linux,
and z/OS), allows the parts of a computer to work together by performing tasks like
transferring data between memory and disks or rendering output onto a display device. It
provides a platform (hardware abstraction layer) to run high-level system software
and application software.
A kernel is the core part of the operating system that defines an application programming
interface for applications programs (including some system software) and an interface to device
drivers.
Device drivers and firmware, including computer BIOS or UEFI, provide basic functionality to
operate and control the hardware connected to or built into the computer.
A user interface interact with a computer.[3] It can either be a command-line interface (CLI) or,
since the 1980s, a graphical user interface (GUI). This is the part of the operating system the user
directly interacts with, it is considered an application and not system software.
Utility software or system support programs
edit
Some organizations use the term systems programmer to describe a job function that is more
accurately termed systems administrator. Software tools these employees use are then called
system software. This utility software helps to analyze, configure, optimize and maintain the
computer, such as virus protection. The term system software can also include software
development tools (like a compiler, linker, or debugger).[4]
Systems programming, or system programming, is the activity of
programming[1] computer system software. The primary distinguishing
characteristic of systems programming when compared to application
programming is that application programming aims to produce software
which provides services to the user directly (e.g. word processor), whereas
systems programming aims to produce software and software
platforms which provide services to other software, are performance
constrained, or both (e.g. operating systems, computational
science applications, game engines, industrial automation, and software as a
service applications).[1]
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.
The following attributes characterize systems programming:
The 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 that is
known to be efficient when used with specific hardware.
Usually a low-level programming language or programming language dialect is used so that:
o Programs can operate in resource-constrained environments
o Programs can be efficient with little runtime overhead, possibly having either a small runtime
library or none at all
o Programs may use direct and "raw" control over memory access and control flow
o The programmer may write parts of the program directly in assembly language
Often systems programs cannot be run in a debugger. Running the program in a simulated
environment can sometimes be used to reduce this problem.[dubious – discuss]
In systems programming, often limited programming facilities are available. The use
of automatic garbage collection is not common and debugging is sometimes hard to do.
The runtime library, if available at all, is usually far less powerful, and does less error checking.
Because of those limitations, monitoring and logging are often used; operating systems may have
extremely elaborate logging subsystems.
Implementing certain parts in operating systems and networking requires systems programming,
for example implementing paging (virtual memory) or a device driver for an operating system.
History
edit
Originally systems programmers invariably wrote in assembly language. Experiments with
hardware support in high level languages in the late 1960s led to such languages
as PL/S, BLISS, BCPL, and extended ALGOL for Burroughs large systems. Forth also has
applications as a systems language. In the 1970s, C became widespread, aided by the growth
of Unix. More recently a subset of C++ called Embedded C++ has seen some use, for instance it
is used in the I/O Kit drivers of macOS.[2] Engineers working at Google created Go in 2007 to
address developer productivity in large distributed systems, with developer-focused features such
as Concurrency, Garbage Collection, and faster program compilation than C and C++.[3] In
2015 Rust 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
edit
For historical reasons, some organizations use the term systems programmer to describe a job
function which would be more accurately termed systems administrator. This is particularly true
in organizations whose computer resources have historically been dominated by mainframes,
although the term is even used to describe job functions which do not involve mainframes. This
usage arose because administration of IBM mainframes often involved the writing of
custom assembler code (IBM's Basic Assembly Language (BAL)), which integrated with
the operating system such as OS/MVS, DOS/VSE or VM/CMS. Indeed, some 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.
Ousterhout's dichotomy is computer scientist John Ousterhout's
categorization[1] that high-level programming languages tend to fall into two
groups, each with distinct properties and uses: system
programming languages and scripting languages – compare programming in
the large and programming in the small.
System programming languages (or applications languages) usually have the
following properties: