Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1. Programação
Programação requer o uso de uma linguagem, cuja sintaxe geralmente é mais restrita do
que a de uma linguagem natural como o Português. Apesar disso, uma linguagem de
programação é poderosa o suficiente para resolver qualquer problema, que envolva
computação e flexível o bastante para permitir resolver um mesmo problema por
programas diferentes. O leitor interessado em aprender mais sobre os tópicos abordados
nesta apostila deve consultar as referências bibliográficas [1-4].
O sistema operacional (SO) cria um ambiente onde usuários podem
confeccionar programas e executá-los sem se preocupar com detalhes de hardware.
Podemos imaginar o SO como um intermediário entre o programador e o hardware, o
qual oferece bibliotecas com funções de alto nível para ler e escrever dados nestes
dispositivos. Exemplos de SOs são o Linux, o Windows, e o MS-DOS.
Na hipótese de existir mais de um programa para solucionar um problema, uns
podem ser mais eficientes do que outros. Esta eficiência está relacionada
principalmente ao tempo de CPU e à quantidade de memória necessários a execução do
programa. Logo, espaço de memória e tempo de execução precisam ser conciliados em
computação.
A correção dos códigos é muito importante e o ideal é que um programa
funcione corretamente para qualquer dado de entrada válido. A correção e a eficiência
são objetivos fundamentais de qualquer programa, porém é impossível testar um com
todas as entradas possíveis. Provar matematicamente a correção de um programa é
difícil. Outro fator complicador é que não são conhecidos algoritmos eficientes para
resolver vários problemas importantes.
O primeiro passo, em se tratando de programação, inicia-se com a confecção de
um programa ou código fonte (PF) e termina com a geração de um programa
executável (PE) ou código executável .
Normalmente, o PF é formado por uma sequência de instruções, cujo formato é
especificado por alguma linguagem de programação e deve ser criado num editor de
textos (com ou sem formatação, dependendo do ambiente de desenvolvimento). Depois,
o PF é submetido a um compilador, para ser analisado e convertido num código-
objeto (ou programa-objeto; PO). O PO é a versão em linguagem de
máquina (números binários) do PF.
Caso o programa contenha chamadas a funções das libraries ou bibliotecas
(função cosseno, por exemplo), o linker ou ligador combina o PO com a(s)
respectiva(s) biblioteca(s) e gera um PE.
Para cada linguagem de programação, a máquina pode ser vista como um sistema
dedicado à execução de programas. Diferentes linguagens fazem com que
aparentemente tenhamos diferentes máquinas virtuais, cuja implementação não interessa
ao usuário, na maioria dos casos. Em princípio, pelo menos, para quem executa um
programa escrito em FORTRAN não faz diferença se o hardware da máquina executa o
código FORTRAN diretamente, ou se uma tradução é feita para o código que é
finalmente executado (a linguagem da máquina), possivelmente em vários passos.
A máquina virtual de uma linguagem de programação pode sempre ser vista
como a implementação de uma interface entre o usuário e a máquina. Essa
implementação pode ser, até certo ponto, estendida ou modificada pelo usuário.
Na prática, a implementação de uma máquina virtual nunca é totalmente
transparente (invisível): alguns aspectos da forma pela qual foi feita podem ficar
aparentes para seus usuários, através do tempo gasto para a execução, ou de mensagens
provenientes de etapas intermediárias da implementação, aspectos esses que deveriam
ser invisíveis.
Montador: Assembly
Compilador: Ling. de
Programação
Principais Termos:
Para cada arquivo de PF, é gerado um arquivo com um PO, o qual é ligado a
outros, através de um ligador, resultando num PE ou biblioteca. Um PO não só contém
código objeto, mas também informações sobre alocação de memória, os símbolos do
programa e também informações sobre depuração ou debug.
Há vários formatos de PO. Originalmente, cada computador possuía formato
próprio, mas com o advento de SOs portáveis (como por exemplo o UNIX), outros
formatos, foram padronizados e utilizados em diferentes sistemas. É comum o mesmo
formato de PO servir tanto para entrada, quanto para saída do ligador, sendo portanto
utilizado no PE ou biblioteca gerada.
O formato dos POs é parte importante no projeto de um SO: uma vez que afeta o
tempo que os programas levam para serem acionados e, assim, afeta o tempo de
desenvolvimento dos sistemas. Além disso, se o formato também é utilizado para os
PEs, ele influi no tempo que o programa leva para começar a executar (responsividade
do programa sob o ponto de vista do usuário final). A maioria dos formatos é
estruturada como blocos do mesmo tipo, podendo ser mapeados conforme necessário
pelo sistema de gerenciamento de memória virtual do SO, sem necessidade de mais
processamento antes de serem utilizados.
O tipo mais simples de código objeto executável é o .COM do DOS, que contém
apenas bytes, sempre carregados no mesmo endereço da memória. Outros formatos,
cuja especificação abrange várias páginas, contém várias estruturas e sub-estruturas. Os
programas cuja extensão é .EXE também contem código em linguagem de máquina
executável.
1.2.1 Montador
Resultados
(Tela)
A razão principal para exigir uma segunda passagem do montador é permitir que
símbolos possam ser usados no programa antes de serem definidos. Após a primeira
passagem, o montador terá identificado todos os símbolos e os colocado na TS. Na
segunda passagem, gerará código de máquina, inserindo os identificadores dos símbolos
os quais são conhecidos agora.
1.2.2 Interpretador
Programa que lê e executa as tarefas do programa fonte linha a linha, ou seja, cada linha
implica em executar uma ação, sem gerar código-objeto explicitamente. Em geral é
lento devido à execução passo a passo. A grande vantagem de um interpretador é o
maior controle sobre o programa em execução, tornando possível detectar situações de
erro invisíveis ou imprevisíveis. Esse tipo de tradução aparece em linguagens de
comandos (scripts como os do MATLAB); ou em linguagens de programação, que
permitem construções de tamanho não determinado antecipadamente.
1.2.3 Compilador
1.4 Carregadores
O MS-DOS indica que está preparado para receber comandos através do aviso de
comando ou "prompt". Ex.:
a>
Os comandos digitados a partir de um prompt como o acima especificam as
tarefas a serem realizadas pelo MS-DOS.
Referências
[1] http://producao.virtual.ufpb.br/books/camyle/introducao-a-computacao-
livro/livro/livro.chunked/ch05s03.html
[2] Stroustrup, Bjarne. (2002). Linguagem de Programação C++. Lisboa. 3. ed. Porto
Alegre: Bookman.
[3] Patterson, D.A., Hennessy, J.L. (2008). Computer Organization and Design, Fourth
Edition: The Hardware/Software Interface (The Morgan Kaufmann Series in Computer
Architecture and Design).