Capítulo 3 – Linguagens de Programação
Programação de Computadores
Níveis de Linguagens de Programação
Linguagem de Máquina
Linguagem Hexadecimal
Linguagem Assembly
Linguagem de Alto Nível
Linguagens estruturadas
Desenvolvimento de Programas
Geração de código fonte (codificação)
Tradução do código fonte (código objeto)
Editores de ligação
Depuradores ou debuggers
Execução de Programas
Programação de Computadores
O hardware, que está associado à parte física do sistema (os circuitos e dispositivos) que suporta o processamento da informação;
O software, que corresponde ao conjunto de programas responsáveis pela execução das tarefas.
Software de sistema (ou sistema operacional) : facilita o acesso aos recursos do computador, através de comandos ou serviços especiais ativados a nível de programa. O sistema operacional administra os arquivos, controla os periféricos e executa utilitários;
Software utilitário : são programas desenvolvidos para facilitar a realização de certas atividades como detecção de virus, programas de comunicação em redes, compressão de arquivos, etc...)
Software aplicativo : são programas desenvolvidos ou adquiridos pelos usuários para algum fim específico (de natureza profissional, educacional ou de lazer – jogos).
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.
Linguagem de Máquina
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.
Linguagem Hexadecimal
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.
Linguagem Assembly
Exemplos de instruções Assembly:
MOV R1, R2
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.
ADD 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:
A linguagem apresenta um número muito reduzido de instruções;
O programador deve conhecer muito bem a máquina;
O programa Assembly não é muito legível, precisa ser bem documentado;
O programa Assembly não é portável (pode ser usado apenas em um tipo de computador). É portável apenas dentro de uma família de processadores;
A programação Assembly tem um custo de desenvolvimento maior;
Vantagens:
Permite acesso direto ao programa de máquina. Utilizando uma linguagem de lato nível, não se tem o controle de código de máquina gerado pelo compilador. Um programa escrito em linguagem Assembly pode ser de 0 a 300% menor e mais rápido que um programa compilado;
Essa linguagem permite o controle total do hardware.
Aplicações da Linguagem Assembly
Controle de processos com resposta em tempo real
Nesse tipo de aplicação, o processador deve executar um conjunto de instruções em um tempo limitado;
Comunicação e transferência de dados
Nesse tipo de aplicação é utilizada a linguagem Assembly, devido a possibilidade de acessar diretamente o hardware;
Otimização de sub-tarefas da programação de alto nível
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.
Linguagem de Alto Nível
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.
Linguagem Estruturada
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:
Linguagens de uso geral: Pascal, Modula-2 eC;
Linguagens especializadas: Prolog, Lisp e Forth;
Linguagens orientadas a objetos: Smalltalk, Eiffel, C++ e Delphi.
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.
Geração do código fonte (codificação)
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.
Tradução do código-fonte (código-objeto)
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.
Editores de ligação
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.
Depuradores ou debuggers
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 à:
Execução passo-a-passo (instrução por instrução) de partes do programa;
Visualização dos valores das variáveis e dos conteúdos dos registros internos do processador;
Alteração em tempo de execução de conteúdos de memória, de variáveis ou de instruções; etc.
Execução de programas
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.