6


Capítulo 3 – Linguagens de Programação



  1. Programação de Computadores

  2. Níveis de Linguagens de Programação

  1. Desenvolvimento de Programas

  1. Execução de Programas



  1. Programação de Computadores


Um sistema computacional pode ser visto como uma associação entre dois conceitos utilizados na terminologia de informática:








  1. Níveis de Linguagens de Programação


Uma linguagem de programação pode ser definida como sendo um conjunto limitado de instruções (vocabulário), associado a um conjunto de regras (sintaxe) que define como as instruções podem ser associadas, ou seja, como se pode compor os programas para a resolução de um determinado problema.


As linguagens de programação podem ser classificadas em níveis de linguagens, sendo que as linguagens de nível mais baixo estão mais próximas da linguagem interpretada pela processador e mais distante das linguagens naturais.




Na linguagem de máquina, a representação dos dados e das operações (instruções) que constituem um programa, é baseada no sistema binário, que é a forma compreendida e executada pelo hardware do sistema. Torna-se inviável escrever ou ler um programa codificado na forma de uma string de bits.




Para simplificar a compreensão e a programação de computadores, foi adotado (num primeiro momento) a notação hexadecimal para representar programas em linguagens de máquina. Mas a programação e leitura usando a linguagem hexadecimal continuou impraticável.




A linguagem de máquina de cada processador é acompanhada de uma versão “legível” da linguagem de máquina que é a chamada linguagem simbólica Assembly. Simbólica pois esta linguagem não é composta de números binários ou hexadecimais, como nas duas linguagens anteriores. A linguagem Assembly é na realidade uma versão legível da linguagem de máquina. Ela utiliza palavras abreviadas, chamadas mnemônicos, indicando a operação a ser realizada pelo processador.


Exemplos de instruções Assembly:


mnemônico MOV (abreviação de MOVE) e dois registradores como parâmetro: R1 e R2. Quando o processador executa essa instrução, ele comanda o movimento do conteúdo de R2 para R1.

No Pascal : R1: = R2.


Mnemônico ADD (abreviação de ADDITION) e dois registradores como parâmetro: R1 e R2. Quando o processador executa essa instrução ele comanda a adição do conteúdo de R1 ao conteúdo de R2 e o resultado é armazenado em R1

No Pascal : R1 : = R1 + R2.







A linguagem Assembly facilitou significativamente a leitura de sequências de instruções de máquina. A linguagem Assembly é apenas uma versão legível da linguagem de máquina, a passagem de um programa escrito em Assembly para a linguagem de máquina é quase sempre direta, não envolvendo muito processamento. Essa passagem é chamada de Montagem, e o programa que realiza esta operação é chamado de montador (Assembler). A linguagem Assembly é orientada para a máquina (ou melhor, para processador), é necessário conhecer a estrutura do processador para poder programar em Assembly. Essa linguagem utiliza instruções de baixo nível que operam diretamente com registros e memórias, ou seja, as instruções são diretamente executadas pelo processador.


Seguindo a evolução das linguagens de programação, procurou-se aproximar mais a linguagem de programação à linguagem natural que utilizamos no dia-a-dia. Surgiram então, as linguagens de alto nível, com o Pascal, C, C++, etc.



Vantagens e Desvantagens da Linguagem Assembly (com relação as linguagens de alto nível)


Desvantagens:


Vantagens:



Aplicações da Linguagem Assembly


Nesse tipo de aplicação, o processador deve executar um conjunto de instruções em um tempo limitado;

Nesse tipo de aplicação é utilizada a linguagem Assembly, devido a possibilidade de acessar diretamente o hardware;

Um programa não precisa somente ser escrito em linguagem Assembly ou linguagem de alto nível. Podemos ter programas de alto nível com sub-tarefas escritas em Assembly, para o caso de tarefas tempo-real ou para a programação do hardware do computador.



As linguagens de alto nível são assim denominadas por apresentarem um sintaxe mais próxima da linguagem natural, fazendo uso de palavras reservadas extraídas do vocabulário corrente (com READ, WRITE, TYPE, etc.) e permitem a manipulação dos dados nas mais diversas formas (números inteiros, reais, vetores, etc.), enquanto a linguagem Assembly trabalha com bits, bytes, palavras, armazenadas em memória.


A passagem de um programa escrito em linguagem de alto nível para o programa em linguagem de máquina é bem mais complexa comparado com a linguagem Assembly. Essa passagem é feita utilizando compiladores e linkadores.


Um programa escrito em linguagem de alto nível pode, teoricamente, ser usado em qualquer máquina, bastando escolher o compilador correspondente. O que não acontece com um programa escrito em Assembly.




Nessa classe estão as linguagens de programação de alto nível, criadas pela necessidade da produção de código de programa de forma clara, aparecendo o conceito de estruturação do código (endentação, utilização de letras maiúsculas ou minúsculas nos identificadores, eliminação de instruções com “go to”, etc.).


Nas décadas de 60 a 80 surgiram diversas linguagens que podem ser organizadas da seguinte forma:




  1. Desenvolvimento de Programas


O desenvolvimento de programas está associado ao uso de ferramentas ou ambiente de desenvolvimento que acompanham o programador desde a etapa de codificação até a geração e teste do código executável. A seguir, será apresentado as principais etapas de geração de um programa, além das ferramentas utilizadas.



A codificação é escrita, utilizando uma linguagem de programação, das instruções que o computador deve realizar para alcançar um resultado. Para realização dessa tarefa são utilizados os chamados editores. O editor é a primeira ferramenta que o programador utiliza na etapa de codificação, pois é através dela que será gerado o arquivo (ou o conjunto de arquivos) que vai conter o código-fonte do programa. É possível utilizar qualquer editor de linha (como o EDIT do DOS) para gerar o arquivo de programa. Mas ambientes mais recentes oferecem ferramentas de edição mais poderosas.



Independente da linguagem de programação utilizada e da arquitetura do sistema computacional, o código-fonte não é executável diretamente pelo processador. O código-fonte permite apenas que o programador consiga definir o programa em uma forma legível aos humanos. Para que o programador consiga definir o programa executável, é necessário que o código-fonte seja traduzido para o código de máquina do processador que compõe a arquitetura da sistema. A tradução é feita de forma automática graças a existência de ferramentas como os Montadores (ou Assembler, para programas escritos em Assembly) e os Compiladores, construídos para gerar o código de programas escritos em linguagens de alto nível. O código gerado por essas ferramentas é representado segundo o sistema de numeração binária e é denominado código-objeto.


O código-objeto é o código produzido pelo compilador, é uma forma intermediária similar a linguagem de máquina do computador. Apesar de estar representado em binário, não é executável diretamente pelo processador, pois normalmente, o código-objeto referencia partes de programa que não estão necessariamente definidas no mesmo arquivo que o gerou, por exemplo, arquivos de bibliotecas de sub-rotinas.




A tarefa do editor de ligação ou linker é rearranjar o código do programa, incorporando a ele todas as partes referenciadas no código original, resultando num código executável pelo processador. Essa tarefa pode ser realizada também pelos chamados carregadores.




Os debuggers possuem uma função essencial que é auxiliar o programador a eliminar (ou reduzir) a quantidade de erros (bugs) de execução no programa. Possibilita um análise efetiva do código devido à:




Para que um programa possa ser executado, é preciso que seja transferido para a memória principal. A maioria dos programas ficam armazenados em disco, mas a CPU não pode executar nenhum programa diretamente a partir do disco. O programa precisa ser antes lido do disco e carregado na memória principal.