Aula 2: Geração das Linguagens de Programação
As linguagens de programação são divididas em cinco gerações principais:
Geração das Linguagens de Programação (Anos 1940-1950)
1ª Geração: linguagens em nível de máquina Os primeiros computadores eram programados
em linguagem de máquina, em notação binária. Cada instrução de máquina é, em geral,
formada por um código de operação e um ou dois endereços de registadores ou de memória.
As linguagens de máquina permitem a comunicação directa com o computador em termos
de “bits”, registadores e operações de máquina bastante primitivas. Um programa em
linguagem de máquina nada mais é que uma sequência de zeros e uns, a programação de um
algoritmo complexo usando esse tipo de linguagem é complexa, cansativa e fortemente
sujeita a erros.
2ª Geração: linguagens de montagem (Assembly) - (Anos 1950-1960)
Esta geração compreende as linguagens simbólicas ou de montagem (Assembly),
projectadas para minimizar as dificuldades da programação em notação binária. Códigos de
operação e endereços binários foram substituídos por mnemónicos (abreviações).
Nas linguagens de montagem, a maioria das instruções são representações simbólicas de
instruções de máquina. O processamento de um programa em linguagem simbólica requer
tradução para linguagem de máquina antes de ser executado. Nesta geração os códigos de
operação e endereços binários foram substituídos por abreviações. Assim, a instrução de
máquina (0010 0001 0110 1100) evoluiu para: ADD R1, TOTAL.
Vantagens e Desvantagens da Linguagem Assembly
Desvantagens com relação as linguagens de alto nível:
1- A linguagem Assembly apresenta um número muito reduzido de instruções, do tipo
operações de movimentação de dados em memória, para registros e para memórias, e
operações lógicas e aritméticas bem simples;
2- Como o programador utiliza diretamente os recursos do processador e memória, ele deve
conhecer muito bem a máquina onde ele está programando;
3- Um programa escrito em linguagem Assembly não é muito legível, por isso ele deve ser
muito bem documentado.
4- Um programa Assembly não é muito portável. Ela é portável apenas dentro de uma família
de processadores. Por exemplo, diferente de um programa C, ele não pode ser executado em
PCs e estações de trabalho.
A linguagem Assembly tem algumas vantagens que são:
1- Ela permite o acesso direto ao programa de máquina. Utilizando uma linguagem de alto
nível, não tem-se o controle do código de máquina gerado pelo compilador (alguns
compiladores permite a otimização de tamanho e de velocidade do programa). Devido a este
acesso, o programador pode gerar um programa mais compacto e eficiente que o código
gerado pelo compilador. Um programa escrito em linguagem Assembly pode ser 0 ou 300
% menor e mais rápido que um programa compilado.
2- linguagem permite o controle total do hardware, por exemplo, permitindo a programação
de portas seriais e paralela de um PC.
Exemplo: Assembly para processadores x86, ARM, etc.
3ª Geração: linguagens orientadas ao usuário ou Alto Nível (Anos 1960-1980)
O período compreendido entre a década de 60 e a de 80 foi bastante produtivo no que diz
respeito ao surgimento de linguagens de programação, o que permitiu o aparecimento de
uma grande quantidade de linguagens as quais podem ser organizadas da seguinte forma:
As linguagens de uso geral, as quais podem ser utilizadas para implementação de programas
com as mais diversas características e independente da área de aplicação considerada;
encaixam-se nesta categoria linguagens como Pascal, Modula-2 e C;
As linguagens especializadas, as quais são orientadas ao desenvolvimento de aplicações
específicas; algumas das linguagens que ilustram esta categoria são Prolog, Lisp e Forth;
As linguagens orientadas a objeto, que oferecem mecanismos sintáticos e semânticos de
suporte aos conceitos da programação orientada a objetos; alguns exemplos destas
linguagens são Smalltalk, Eiffel, C++ e Delphi.
As linguagens orientadas ao usuário surgiram na década de 60. Algumas delas são orientadas
à solução de problemas científicos, tais como FORTRAN, PASCAL e ALGOL; outras, tal
como COBOL, são usadas para aplicações comerciais. Linguagens como PL/I e ADA
contêm facilidades para ambos os tipos de computações (científica e comercial). Podem
também ser classificadas em:
Linguagens procedimentos também chamadas “procedurais” ou imperativas;
Linguagens declarativas.
Nas linguagens procedimentais, um programa específica um procedimento, isto é, uma
sequência de passos a serem seguidos para solucionar um problema. As instruções oferecidas
por essas linguagens pertencem, em geral, a três classes:
Instruções entrada/saída;
Instruções de cálculos aritméticos ou lógicos;
Instruções de controlo de fluxo de execução (desvios condicionais, incondicionais e
processamento iterativo)
Exemplos de linguagens orientadas ao usuário: BASIC, ALGOL, PL/I, PASCAL, ADA, C,
etc.
Exemplos: C, Fortran, Pascal, BASIC, COBOL, Java, Python, C#.
4ª Geração: linguagens orientadas à aplicação ou Alto Nível Especializadas (Anos
1980-1990)
As linguagens de 3ª geração foram projectadas para profissionais de processamento de dados
e não para usuários finais. Sendo assim, a depuração de programas escritos nessas linguagens
consome tempo, e a modificação de sistemas complexos é relativamente difícil.
As linguagens de 4ª geração foram projectadas em resposta a esses problemas. Os programas
escritos em linguagens de 4ª geração necessitam de menor número de linhas de código em
relação aos programas correspondentes codificados em linguagens de programação
convencionais.
As linguagens de 4ª geração variam bastante no número de facilidades oferecidas ao usuário.
Algumas são, meramente, geradores de relatórios ou pacotes gráficos. Outras são capazes de
gerar aplicações completas. Em geral, essas linguagens são projectadas para atender a classes
específicas de aplicações.
Principais objectivos das linguagens da 4ª geração:
Facilitar a programação de computadores de tal maneira que usuários finais possam
resolver seus problemas;
Apressar o processo de desenvolvimento de aplicações;
Facilitar e reduzir o custo de manutenção de aplicações;
Minimizar problemas de depuração; Gerar código sem erros a partir de requisitos de
expressões de alto nível. Exemplos de linguagens da 4ª geração: LOTUS 1-2-3, SQL,
SUPERCALC, VISICALC, DATATRIEVE, VHML, PHP.
Exemplo: SQL (consultas em bancos de dados), MATLAB, ABAP (SAP), R
(estatística).
5ª Geração: linguagens do conhecimento ou Baseadas em IA e Lógica (Anos 1990-
Presente)
São usadas principalmente na área de Inteligência Artificial. Desenvolvidas para facilitar a
representação do conhecimento que é essencial para a simulação de comportamentos
inteligentes. O termo 5ª geração refere-se, especialmente, a sistemas que usam mecanismos
da área de inteligência artificial (IA), ou seja, sistemas especialistas, processadores de língua
natural e sistemas com bases de conhecimento. Um sistema de 5ª geração armazena
conhecimento complexo de modo que a máquina pode obter inferências a partir da
informação codificada.
Exemplos: Prolog, Lisp, R, Python (para IA), Wolfram Language.
2. Níveis das Linguagens de Programação
Cada linguagem de programação foi desenvolvida para solucionar determinado tipo de
problema e cumprir uma função determinada. Uma linguagem pode ser melhor para
execução de cálculos matemáticos complexos, com aplicações na área científica; outra pode
ser melhor para processar uma grande quantidade de dados submetidos a operação simples,
com aplicações na área financeira; e ainda outras exigem uma interface elaborada e fácil
interacção com o usuário.
As linguagens também são classificadas por níveis de abstração, dividindo-se em:
1- Linguagem de Baixo Nível
As linguagens de Baixo Nível são aquelas voltadas para a máquina, ou seja as que são
escritas utilizando as instruções do microprocessador do computador. São mais poderosas
no que diz respeito ao acesso aos recursos do hardware, são bem mais rápidas, mas exigem
um maior esforço de programação.
Vantagens:
Extrema eficiência e velocidade: Como é executado diretamente pelo processador,
não há necessidade de interpretação ou compilação complexa;
Controle absoluto sobre o hardware: Permite acessar diretamente registros,
memória e dispositivos;
Uso otimizado de recursos: Ideal para sistemas embarcados e dispositivos com
pouca capacidade computacional.
Exemplo: Assembly, C ANSI.
Desvantagens: Em geral, difícil de aprender e programar. Programas em Assembly têm
pouca portabilidade, isto é, um código gerado para um tipo de processador não serve para
outro.
Código dependente do hardware (não é portátil);
Códigos Assembly não são estruturados, tornando a programação mais difícil.
Exemplo: Assembly, Código de Máquina.
2- Linguagem de Médio Nível
São linguagens voltadas ao ser humano e a máquina, sendo uma mistura entre as
linguagens de Alto Nível e as de Baixo Nível. Estas linguagens contêm comandos muito
simples e outros muito complexos, o que torna a sua programação “complicada”. Ex:
linguagem C Pode-se acessar aos registos do sistema, trabalhar com endereços de memória
- características de linguagens de baixo nível - e ao mesmo tempo realizar operações de
alto nível (if...else; while; for).
Vantagens: Geralmente são linguagens mais poderosas, permitindo a criação de diversos
softwares, desde jogos a programas com qualidade profissional. O mesmo código pode
rodar em diferentes sistemas operacionais com poucas mudanças.
Desvantagens: Alguns comandos têm uma sintaxe muito difícil de compreender; Ainda
exige um conhecimento razoável do hardware e gerenciamento manual de memória pode
levar a erros como vazamento de memória.
Exemplo: C; C++ (pode manipular memória diretamente).
3- Linguagem de Alto Nível
São linguagens voltadas para o ser humano. Em geral utilizam sintaxe mais estruturada
tornando o seu código mais fácil de entender e de editar programas. Trata-se de linguagens
independentes da arquitectura do computador. São mais fáceis de se programar, e
apresentam (geralmente) maior portabilidade, permitindo fácil migração de um hardware
para outro. Exemplos: Java, C#, Object Pascal (Delphi), Visual Basic. Estas linguagens
permitem ao programador esquecer-se completamente do funcionamento interno da
máquina para que se está desenvolvendo o programa. Somente necessita de um tradutor que
entenda o código fonte como as características da máquina.
Vantagens: Por serem compiladas ou interpretadas, têm maior portabilidade, podendo ser
executados em várias plataformas com pouquíssimas modificações. Em geral, a
programação torna-se mais fácil por causa do maior ou menor grau de estruturação de suas
linguagens. (Próxima à linguagem humana, com sintaxe mais intuitiva); Oferece bibliotecas
e frameworks que agilizam o processo
Desvantagens: Menor controle sobre o hardware e Desempenho menor em comparação com
linguagens de baixo nível.
Exemplo: Python, Java, C#, JavaScript.
Quanto ao paradigma de programação
Um paradigma de programação é um padrão de resolução de problemas que se relaciona
com um determinado género de programas e linguagens. Esta classificação das linguagens
de programação leva em consideração a forma com que é elaborada a solução para o
problema. O paradigma determina o ponto de vista da realidade e como se actua sobre ela,
os quais são classificados quanto ao seu conceito de base, podendo ser: Imperativo,
funcional, lógico, orientado a objectos e estruturado. Cada qual determina uma forma
particular de abordar os problemas e de formular as respectivas soluções. Além disso, uma
linguagem de programação pode combinar dois ou mais paradigmas para potencializar as
análises e soluções. Deste modo, cabe ao programador escolher o paradigma mais adequado
para analisar e resolver cada problema. Cinco paradigmas de programação distintos e
fundamentais evoluíram nas últimas três décadas:
Paradigma/Programação imperativo - A programação imperativa é fundamentada no
modelo computacional clássico de John Von Neumann. Para este paradigma, o programa
contém uma série de comandos para executar cálculos, atribuir valores à variáveis, obter
entradas ou produzir saídas.
Exemplos: Ada; ALGOL; Perl Assembler; Basic; C; Cobol; Fortran; Pascal ; Python;
Lua.
Vantagens: Eficiência (porque embute o modelo de Von Neumann); modelagem “natural ”
de aplicações do mundo real; paradigma dominante e bem estabelecido; e também muito
flexível. Desvantagens: Difícil legibilidade; as instruções são centradas no como e não no
que.
Paradigma/Programação orientada a objectos
A programação Orientada a Objectos é baseada na composição e interacção de diversas
unidades de softwares denominados objectos. O funcionamento de um software orientado a
objectos se dá através do relacionamento e troca de mensagens entre esses objectos. Esses
objectos são classes, e nessas classes os comportamentos são chamados de métodos e os
estados possíveis da classe são chamados de atributos. Nos métodos e nos atributos também
são definidas as formas de relacionamento com outros objectos. Exemplo: Small talk;
Python; Ruby; C++; Object Pascal; Java; C#; Oberon; Eiffel e Simula.
Vantagens: Esse paradigma possui todas as vantagens do paradigma imperativo entre
outras: a alteração de um módulo não incorre na modificação de outros módulos; quanto
mais um módulo for independente, maior a chance de poder ser reutilizado em outra
aplicação.
Desvantagens: Por exigir formas de pensar relativamente complexas, a programação
orientada a objectos até hoje ainda não é bem compreendida ou usada pela maioria
Paradigma/Programação funcional - Este paradigma trata a computação como uma
avaliação de funções matemáticas. Este método enfatiza a aplicação de funções, as quais são
tratadas como valores de primeira importância, ou seja, funções podem ser parâmetros ou
valores de entrada para outras funções e podem ser os valores de retorno ou saída de uma
função.
Paradigma/Programação lógico - Estabelece-se uma relação entre entradas e saídas, entre
os dados, e o sistema simplesmente “obedece” este conjunto de regras, sem se preocupar
com a sequência. Nesse paradigma programas são relações entre Entrada/Saída. Exemplo:
Prolog, Planner, Oz, Mercury e etc.
Vantagens: Possui a princípio todas as vantagens do paradigma funcional. E permite
concepção da aplicação em um alto nível de abstracção (através de associações entre E/S).
Desvantagens: Variáveis de programa não possuem tipos, nem são de alta ordem
Paradigma/Programação estruturado - É quando o programa é escrito tendo em base o
uso principalmente de estruturas: Sequência, Decisão e Iteração (repetição). Foi a forma
dominante na criação de software entre a programação linear e a programação orientada por
objectos. Exemplo: C; Basic; Pascal; Cobol.
Vantagens: Os problemas podem ser quebrados em vários sub problemas, a boa legibilidade
e a boa compreensão da estrutura deste paradigma motivam os programadores a iniciarem a
programação pelo modelo estruturado.
Desvantagens: Os dados são separados das funções e mudanças na estrutura dos dados
acarreta alteração em todas as funções relacionadas.
Quanto a forma de execução
Esta classificação leva em consideração a forma com que as instruções serão executadas.
Linguagens Compiladas (Exemplo: C, C++, Rust, Go, Pascal, Visual Basic, Eiffel,
Fortran )
O código-fonte é escrito pelo programador.
Um compilador traduz todo o código para linguagem de máquina antes da execução.
O arquivo final é um executável (.exe, .out, etc.), que pode rodar sem precisar do código-
fonte.
Vantagens: execução mais rápida porque o código já está convertido em linguagem de
máquina, maior eficiência e desempenho, ideal para softwares de alto desempenho e
Código protegido, pois o usuário final não tem acesso ao código-fonte.
Desvantagens: menos flexível, já que qualquer alteração no código exige recompilação e
dependente do sistema operacional, sendo necessário reescrever partes do código para
diferentes plataformas.
Linguagens Interpretadas (Exemplo: Python, JavaScript, PHP, Ruby, Java, C#)
O código-fonte é executado linha por linha por um interpretador no momento da
execução.
Não gera um executável independente; o interpretador precisa estar instalado no
computador.
Vantagens:
Facilidade de desenvolvimento e depuração (erros aparecem imediatamente).
Portabilidade, pois o mesmo código pode rodar em diferentes sistemas sem necessidade de
recompilação.
Execução interativa, permitindo rodar partes do código sem precisar executar tudo de uma
vez.
Desvantagens:
Mais lento que linguagens compiladas, já que a tradução ocorre durante a execução.
Maior dependência do interpretador, dificultando a distribuição de software.
Linguagens Híbridas (Compiladas + Interpretadas) (Exemplo: Java, C#, Kotlin,
Swift)
O código-fonte é compilado para um código intermediário (bytecode) que não é
diretamente executado pelo processador.
Um interpretador ou máquina virtual (JVM para Java, .NET CLR para C#) lê e executa
esse bytecode.
Vantagens:
Equilíbrio entre desempenho e portabilidade, pois pode rodar em diferentes plataformas
sem precisar recompilar.
Segurança e gerenciamento automático de memória, pois roda dentro de um ambiente
controlado (máquina virtual).
Desvantagens:
Desempenho intermediário, geralmente mais rápido que linguagens puramente
interpretadas, mas mais lento que compiladas nativamente.
Requer uma máquina virtual, como JVM (Java) ou .NET CLR (C#), o que pode aumentar
o consumo de recursos.