| |||||||||
System programming (or systems programming) is the activity of building and maintaining, low-level, system software for computers, including operating systems, system utilities, compilers, and so forth.
System programming is usually a very different kind of activity from application programming, and most programmers tend to specialize in one or the other areas. Its most distinctive characteristic is the awareness of hardware upon which the software runs, which may range from the explicit form of writing device drivers, to the use of assembly language, to the design of compiler algorithms that best exploit hardware characteristics.
In system 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.
Originally system programmers invariably wrote in assembly language. Experiments with hardware support in high-level languages in the late 1960s led to such languages as BLISS and BCPL, but C, helped along by the growth of UNIX, became ubiquitous in the 1980s. More recently C++ has seen some use, for instance in the IOKit drivers of Mac OS X.
The simplified instructional computer (SIC) is a hypothetical computer that is often used in teaching. The goal is to allow the student to learn how an assembler works without getting caught up on the particular quirks of one specific type of hardware.