Um programa, desde sua criação em uma linguagem de alto nível, é manipulado por um grande conjunto de outros programas que traduzem seu código para linguagem de máquina e controlam sua execução no computador. Este conjunto de programas recebe a denominação genérica de software de sistema e é o objeto de estudo deste texto.
No desenvolvimento de programas, o software de sistema é extensamente utilizado, com as várias etapas inter-relacionadas para a criação e execução de um programa (Fig. 1.7). Tipicamente, esse relacionamento dá-se de forma transparente para o programador.
Programas são usualmente descritos em linguagens de alto nível. O compilador é o programa do sistema que traduz um programa descrito através de uma linguagem de alto nível específica para um programa equivalente em linguagem assembly. Esse processo de tradução é denominado compilação.
O montador (assembler) é o programa do sistema responsável por traduzir um programa assembly para o código de máquina. Esse processo de tradução de um programa-fonte assembly para um programa em código de máquina é denominado montagem; o resultado da montagem é um módulo objeto contendo pelo menos o código binário que será posteriormente executado.
Programas complexos raramente são descritos através de um único arquivo-fonte, mas sim organizados em módulos objetos interrelacionados. Tais módulos podem agregar funcionalidades da aplicação sendo desenvolvida ou recursos comuns do sistema que devem ser integrados à aplicação. O programa do sistema ligador é o responsável por interligar os diversos módulos de um programa para gerar o programa que será posteriormente carregado para a memória. Essa etapa de preparação de um programa para sua execução é denominada ligação.
Para que um programa possa ser executado, seu código de máquina deve estar presente na memória. O carregador é o programa do sistema responsável por transferir o código de máquina de um módulo objeto para a memória e encaminhar o início de sua execução. O processo de transferir o conteúdo de um módulo objeto para a memória principal é denominado carregamento. A execução de qualquer programa deve ser precedida por seu carregamento.
A execução de cada programa se dá sob o controle do sistema operacional. A um programa em execução dá-se o nome de processo. Além das instruções do programa, um processo necessita de todo um conjunto de informações adicionais para o controle de sua execução. O estado corrente dessas informações associadas a cada programa em execução constitui o estado do processo. O sistema operacional é o responsável por gerenciar cada processo no computador, estabelecendo como será realizada sua execução. Ele também atua como um programa supervisor que estabelece uma camada de controle entre o hardware do computador e as aplicações de usuários. Uma de suas funções é estabelecer uma interface de software uniforme entre o computador, outros programas do sistema e programas de aplicação de usuários. Outra função fundamental de um sistema operacional é gerenciar os recursos de um computador de forma a promover sua eficiente utilização. Exemplos de sistemas operacionais são MS-DOS, Windows NT, OS/2, Linux e Solaris -- estes dois implementações do sistema operacional Unix.