Versatile. System software communicates with both the specialized hardware it runs on and the higher-level application software installed on the computer. Application software is usually hardware-agnostic, meaning it runs regardless of the installed hardware -- as long as the system software supports it. System software also supports the programs that depend on it as they evolve. Without it, these programs may not work, affecting the computer's operations and impacting user productivity and experiences.
System software is a broad term that includes many types of software. The following are the main types.
Among the best-known types of system software, the OS is the computer's main control program, governing how its hardware, memory, processing power and applications work. The most important functions of any OS are the following:
A part of the OS known as its kernel directly manages hardware and communicates with software. Unlike other types of system software, a computer user may regularly interact with the OS through its GUI or a command-line interface. Microsoft Windows, macOS and Linux are all widely used OSes. They all support many different types of hardware and software and frequently expose system hardware resources to applications through a standardized application programming interface. GUIs are not limited only to OSes. Many modern-day programs also include GUIs for ease of use. These programs, known as application software, sit on top of the OS and support direct user interaction.
Installed as firmware on a chip on the computer's motherboard, the BIOS is integral to the boot process. As the intermediary between the OS and hardware, this system software gets the computer started after it's turned on and then initializes and connects the system's hardware to its OS. This boot program also loads the OS into the computer's main memory or RAM, manages data flows between the OS and attached devices -- the hard drive, keyboard, mouse, printer, scanner and more -- and manages other low-level system functions, like the system clock and time.
An assembler is a type of program that takes basic computer instructions and converts them into a pattern of bits that the computer's processor can use to perform its basic operations. It translates human-readable assembly language code into machine-readable machine code by replacing each assembly instruction into the corresponding machine code bit representation.
Assemblers, which are computer architecture-specific, provide precise control over and direct manipulation of hardware resources, enabling improved system performance. Typically used to write software like OSes and device drivers, they are also used for direct memory manipulation, although they lack built-in memory management features.
A device driver controls a particular type of device attached to a computer, such as a keyboard or mouse. The driver program converts the more general input/output instructions of the OS to messages the device type can understand. It functions as a translator between the OS and device so a user can use it for its specific purpose. Without a device driver, the computer cannot run any applications, and the attached devices don't function.
System software can also include system utilities, such as disk defragmenters, virus scanners, registry cleaners, file managers, file compression, network monitors, and System Restore. These applications perform specific tasks that help optimize the computer's performance and user experience. Most system utilities are bundled with the OS, though users can download utilities separately if necessary.
Development tools, like compilers and debuggers, are types of system software.
A compiler is a software program that translates source code written in a high-level programming language, like Java or C++, into computer-friendly, low-level machine code or bytecode. Besides its role as a translator, a compiler is also responsible for preserving original logic from source code and ensuring final output is correct.
A debugger is an application to remove bugs or errors in software programs. Debuggers are commonly used during the software testing stage of the software development lifecycle but should be used at every stage. More holistic use enables developers to identify and fix the maximum number of issues, increasing their chances of delivering a better-quality application.