Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmos e Linguagem I
Aula 1
Conteúdo:
1. Apresentação da disciplina
2. Contextualização e definições:
2.1. Algoritmos
2.2. Programas
2.3. Linguagens de programação
2.4. Sintaxe e semântica
2.5. Desenvolvimento de programas
1. Apresentação da disciplina
Apresentação do professor
a. Formação acadêmica
b. Experiência acadêmica
c. Experiência profissional
Apresentação dos alunos
a. Identificar familiaridade com a disciplina
b. Verificar conhecimento de algoritmos e lógica
c. Identificar experiência com programação e linguagens
Apresentação do plano de aula e bibliografia
a. Anexo “Plano de Aula”
Apresentação dos critérios de avaliação
a. Freqüência: obrigatória, mínimo de 75%
b. Aproveitamento: provas e trabalhos
1o GQ = Prova 1 + Trabalho 1
2o GQ = Prova 2 + Trabalho 2
Valores: 0,0 – 10,0
Pesos: Provas* = 70% / Trabalhos** = 30%
M = (1o GQ + 2o GQ) / 2
M ≥ 7,0 ⇒ Aprovado
3.0 ≤ M < 7,0 ⇒ Exame final
M < 3,0 ⇒ Reprovado
MF = (F + M) / 2
M ≥ 5,0 ⇒ Aprovado
M < 5,0 ⇒ Reprovado
2. Contextualização
O computador, diferentemente de outras máquinas, é uma máquina de propósito geral, isto é, serve a
diversas finalidades. Por exemplo, um microondas, por mais que possa ser "programado", só serve para
esquentar, descongelar e assar alimentos. Já um computador, pode sevir tanto de tela de artista, como
máquina de calcular, prancha de um arquiteto, entre outras. Para tal, é necessário que sejam introduzidas
dentro dele diretrizes bem específicas, para que sirva a propósitos diferentes. Estas diretrizes são, na
verdade, uma seqüência de instruções, que quando executadas produzem um efeito desejado. A esta
seqüência de instruções sob uma ordem prescrita, dá-se o nome de algoritmo.
O uso de algoritmos é quase tão antigo quanto a matemática. Com o passar do tempo, entretanto, ele foi
bastante esquecido pela matemática. Com o advento das máquinas de calcular e mais tarde os
computadores, o uso de algoritmos ressurgiu com grande vigor, como uma forma de indicar o caminho para
a solução dos mais variados problemas.
Algoritmo não é a solução do problema, pois, se assim fosse, cada problema teria um único algoritmo.
Algoritmo é o caminho para a solução de um problema, e em geral, os caminhos que levam a uma solução
são muitos.
Ao longo dos anos surgiram muitas formas de representar os algoritmos, alguns utilizando linguagens
semelhantes às linguagens de programação e outras utilizando formas gráficas.
2.1. Algoritmos
A automação é o processo em que uma tarefa deixa de ser desempenhada pelo homem e passa a ser
realizada por máquinas, sejam estas dispositivos mecânicos (como as máquinas industriais), eletrônicos
(como os computadores), ou de natureza mista (como os robôs).
Para que a automação de uma tarefa seja bem-sucedida é necessário que a máquina que passará a realizá-la
seja capaz de desempenhar cada uma das etapas constituintes do processo a ser automatizado com
eficiência, de modo a garantir a repetibilidade do mesmo. Assim, é necessário que seja especificado com
clareza e exatidão o que deve ser realizado em cada uma das fases do processo a ser automatizado, bem
como a seqüência em que estas fases devem ser realizadas.
À especificação da seqüência ordenada de passos que deve ser seguida para a realização de uma tarefa,
garantindo a sua repetibilidade, dá-se o nome de algoritmo.
Embora esta definição de algoritmo seja correta, podemos definir algoritmo, de maneira informal e
completa como:
“Algoritmo é um conjunto finito de regras, bem definidas, para a solução de um problema em um tempo
finito e com um número finito de passos.”
Informalmente, um algoritmo é qualquer procedimento computacional bem definido que toma algum valor
ou conjunto de valores como entrada e produz algum valor ou conjunto de valores como saída.
Na prática não é importante ter-se apenas um algoritmo, mas sim, um bom algoritmo. O mais importante de
um algoritmo é a sua correção, isto é, se ele resolve realmente o problema proposto e o faz exatamente.
Para que um computador possa desempenhar uma tarefa é necessário que esta seja detalhada passo a passo,
numa forma compreensível pela máquina, utilizando aquilo que se chama de programa. Neste sentido, um
programa de computador nada mais é que um algoritmo escrito numa forma compreensível pelo
computador.
2.2. Programas
Os programas de computador nada mais são do que algoritmos escritos em uma linguagem de computador
(Pascal, C, Cobol, Fortran, Delphi, Java, entre outras) e que são interpretados e executados por um
computador.
Linguagens de programação são usadas para descrever algoritmos; isto é, seqüências de passos que levam à
solução de um problema. Uma linguagem de programação precisa suportar a definição de ações e prover
meios para especificar operações básicas de computação, além de permitir que os usuários especifiquem
como estes passos devem ser seqüenciados para resolver um problema. Uma linguagem de programação
pode ser considerada como sendo uma notação que pode ser usada para especificar algoritmos com
precisão.
2.3.1. Classificação
As linguagens de programação podem ser agrupadas em dois grandes grupos: linguagens de baixo
nível e linguagens de alto nível.
As linguagens de baixo nível são restritas a linguagem de máquina e tem uma forte relação entre as
operações implementadas pela linguagem e as operações implementadas pelo hardware.
As linguagens de alto nível por outro lado, aproximam-se das linguagens utilizadas por humanos para
expressar problemas e algoritmos. Cada declaração numa linguagem de alto nível equivale a várias
declarações numa linguagem de baixo nível.
A vantagem principal das linguagens de alto nível é a abstração. Isto é o processo em que as
propriedades essenciais requeridas para a solução do problema são extraídas enquanto esconde os
detalhes da implementação da solução adotada pelo programador. Com o nível de abstração
Estas linguagens são ditas de baixo nível porque existe um baixo nível de comunicação (entendimento)
entre os programas escritos e o ser humano. Realmente, os programas escritos neste tipo de linguagem
são difíceis de serem feitos e entendidos.
Linguagem de Máquina
As instruções de linguagem de máquina são representadas por códigos que correspondem a números
binários cuja extensão pode variar de 8 a 64 bits. Dependendo da operação considerada, o código de
uma instrução pode simbolizar a operação a ser executada e os dados envolvidos na operação.
Exemplo de Programa:
01001001110101110110
100100100100001101111
Por uma questão de custo de hardware, as operações representadas pelas instruções de linguagem de
máquina são bastante elementares, como por exemplo, a transferência de dados entre memória e
registro da CPU, a adição de dois valores, o teste de igualdade entre dois valores, etc...
A linguagem de máquina é impraticável para escrita ou leitura. É 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, num primeiro tempo foi adotada a
notação hexadecimal para representar programas em linguagem de máquina, onde a seqüência de bits é
representada por números hexadecimais.
Linguagem Assembly
Escolhendo nomes descritivos para as variáveis do programa, e usando mnemônicos para representar
códigos de operação, a linguagem assembly facilitou significativamente a leitura de seqüências de
instrução de máquina. Como exemplo, supomos a operação de dois números inteiros: A:=B+C. Esta
operação, em um PC, em notação hexadecimal ficaria: A1000203060202A30402. Se associarmos o
nome B à posição de memória 200h, C à posição 202h e A à posição 204h, usando a técnica
mnemônica, a mesma rotina poderá ser expressa da seguinte forma:
A maioria concorda que a segunda forma, embora ainda incompleta, é melhor que a primeira para
representar a rotina. Apesar de oferecer uma representação mais próxima do que o programador está
acostumado a manipular, a linguagem Assembly apresenta certas dificuldades para a realização dos
programas, tais como a necessidade de definição de um conjunto relativamente grande de instruções
para a realização de tarefas que seriam relativamente simples (se representadas através de outras
linguagens) e a exigência do conhecimento de detalhes do hardware do sistema (arquitetura interna do
processador, endereços e modos de operação de dispositivos de hardware, etc...).
Por outro lado, a utilização da linguagem Assembly proporciona um maior controle sobre os recursos
do computador, permitindo também se obter bons resultados em termos de otimização de código.
Como 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. Esta passagem de um programa Assembly para linguagem de
máquina é chamada de Montagem, e o programa que realiza esta operação é chamado de montador
(Assembler).
A linguagem Assembly é orientada para máquina (ou melhor, para processador), é necessário conhecer
a estrutura do processador para poder programar em Assembly. A linguagem Assembly utiliza
instruções de baixo nível que operam com registros e memórias diretamente. Assim ela é muito
orientada às instruções que são diretamente executadas pelo processador. Na seqüência da 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, tipo Pascal, C, C++, etc.
As linguagens de alto nível são assim denominadas por apresentarem uma sintaxe mais próxima da
linguagem natural, fazendo uso de palavras reservadas extraídas do vocabulário corrente (como
READ, WRITE, TYPE, etc...) e permitirem a manipulação dos dados nas mais diversas formas
(números inteiros, reais, vetores, listas, etc...); enquanto a linguagem Assembly trabalha com bits,
bytes, palavras, armazenados em memória.
Linguagens como Fortran, Cobol, Algol e Basic, com todas as deficiências que se pode apontar
atualmente, foram linguagens que marcaram presença no desenvolvimento de programas, sendo que
algumas delas têm resistido ao tempo e às críticas, como por exemplo Fortran, que ainda é visto como
uma linguagem de implementação para muitas aplicações de engenharia. Cobol é um outro exemplo de
linguagem bastante utilizada no desenvolvimento de aplicações comerciais.
Com o desenvolvimento das linguagens de alto nível, o objetivo da independência de máquina foi
amplamente alcançada. Dado que os comandos das linguagens de alto nível não referenciam os
atributos de uma dada máquina, eles podem ser facilmente compilados tanto em uma máquina como
em outra. Assim, um programa escrito em linguagem de alto nível poderia, teoricamente, ser usado em
qualquer máquina, bastando escolher o compilador correspondente.
Em realidade, no entanto, esta independência de máquina não é tão simples. Quando um compilador é
projetado, certas restrições impostas pela máquina subjacente são, em última instância, refletidas como
características da linguagem a ser traduzida. Por exemplo, o tamanho do registrador e as células de
memória de uma máquina limitam o tamanho máximo dos inteiros que nela podem ser
convenientemente manipulados. Disso resulta o fato de que, em diferentes máquinas, uma “mesma”
linguagem pode apresentar diferentes características, ou dialetos.
As linguagens de alto nível podem oferecer muito mais vantagens que as linguagens de baixo nível. A
principal motivação para o uso de linguagens de alto nível é que os problemas podem ser solucionados
muito mais rapidamente e com muito mais facilidade, pois apresenta um considerável numero de tipos
de dados definidos, além das facilidades da programação estruturada.
Os programas em linguagem de alto nível são muito mais fáceis de serem desenvolvidos, entendidos e
depurados por diversas razões:
Obs: as linguagens de marcação (markup) como o HTML, não são linguagens de programação, pois
elas não especificam computações, elas apenas descrevem a aparência de documentos.
2.3.3. Histórico
A primeira geração de linguagens remonta aos dias da codificação em linguagem de máquina, surgidas
com o início da computação na década de 50, especificamente de 1950 a 1962. A Linguagem de
máquina e Assembly representam esta primeira geração das linguagens de programação.
Essas linguagens totalmente dependentes da máquina exibem o mais baixo nível de abstração que uma
linguagem pode ser representada.
Essas linguagens somente devem ser usadas quando as linguagens de mais alto nível não satisfizerem
as necessidades ou não forem suportadas.
A segunda geração de linguagens de programação foi desenvolvida de 1962 a 1974 e serviu de base
para o desenvolvimento das modernas linguagens de programação.
As características marcantes das linguagens de segunda geração foram o amplo uso com grande
familiaridade e aceitação no mercado e a grande quantidade de bibliotecas de software, permitiram a
programação multiusuário, sistemas de execução em tempo real e desenvolvimento de gerenciadores
de base de dados.
Fortran é uma linguagem ainda muito utilizada na área de engenharia e pela comunidade científica.
Cobol é uma linguagem que foi aceita e ainda continua em uso para aplicações comerciais. Algol foi o
precursor de muitas linguagens de terceira geração, por oferecer ricamente estruturas de controle e
tipos de dados. Basic foi uma linguagem originalmente criada para o aprendizado e teve seu uso
bastante reduzido já na década de 70.
As linguagens especializadas são caracterizadas pela forma sintática não usual com que foram
desenvolvidas para uma aplicação distinta. Centenas de linguagens especializadas estão em uso
atualmente. Dentre as linguagens que encontram aplicações na área de engenharia de software
podemos destacar a linguagem Lisp desenvolvida especialmente para manipular símbolos e listas,
Prolog desenvolvida para tratar e representar conhecimentos, Smalltalk criada para representar os
dados em forma de objetos, sendo a primeira a ser puramente orientada a objetos, APL desenvolvida
para manipular vetores, e a linguagem Forth desenvolvida para desenvolver softwares para
microprocessadores.
A quarta geração das linguagens de programação foi desenvolvida a partir de 1986 e teve como
características principais a geração de sistemas especialistas, o desenvolvimento de inteligência
artificial e a possibilidade de execução dos programas em paralelo.
No decorrer da história temos percebido uma evolução para uma abstração maior na geração de
programas, usando linguagens de mais alto nível.
As linguagens de quarta geração, conhecidas também como linguagens artificiais contém uma sintaxe
distinta para representação de estruturas de controle e dos dados. Essas linguagens por combinarem
características procedurais e não procedurais, representam estas estruturas com um alto nível de
abstração, eliminando a necessidade de especificar algoritmicamente esses detalhes.
As linguagens geradoras de programas representam uma sofisticada classe das linguagens 4GL.
Permitem ao usuário ou programador criar facilmente programas complexos em linguagens de terceira
geração, utilizando bem menos declarações e comandos. Estas linguagens possuem um nível bem mais
alto que as de terceira geração.
Enquadradas como outras linguagens de quarta geração temos as linguagens usadas em sistemas de
apoio à decisão, linguagens utilizadas para modelagem de sistemas, linguagens de prototipação, e
linguagens de especificação formal que produzem código de máquina.
Linguagens desenvolvidas
As novas direções das linguagens de programação, especialmente das linguagens de quarta geração é a
sua aplicação com metodologias orientadas a objetos. Essas linguagens são baseadas nos conceitos de
objetos, que agrupam comandos de programação com dados em objetos que podem ser usados o tempo
todo durante a execução do programa, o que é muito útil em ambientes de execução paralela.
Outra tendência dos ambientes de desenvolvimento de programas é fornecer além das linguagens de
programação, um ambiente de geração automática de código, onde o programador especifica através de
ferramentas visuais as características do programa e a ferramenta se encarrega de gerar a codificação
na linguagem específica.
Estas ferramentas são muito difundidas na programação para Windows, e são também chamados de
RAD (Desenvolvimento Rápido de Aplicativos).
A nova geração das linguagens de programação, que já é chamada por muitas pessoas de quinta
geração, é baseada em métodos de consulta e utilizam comandos escritos em linguagens naturais,
permitindo uma fácil comunicação com o computador.
A semântica de uma linguagem de programação se refere ao significado dos programas e comandos, como
eles se comportam quando são executados em um computador. A especificação semântica de uma
A sintaxe da linguagem influencia como os programas são escritos pelo programador, lidos por outros
programadores e analisado pelo computador. A semântica da linguagem determina como o programa é
composto pelo programador, entendido por outros programadores e interpretado pelo computador. A
sintaxe é importante, pois é necessário que um programa esteja com os comandos corretamente escritos,
mas a semântica é mais importante ainda, pois não basta ter um programa sem erros de sintaxe, mas com os
comandos combinados de maneira correta.
Apesar de muito convenientes para o ser humano, os programas elaborados em linguagem de alto nível não
são executáveis pela máquina. Os programas produzidos por estas linguagens deverão sofrer um processo
de tradução em que serão convertidas as instruções criadas em linguagem de alto nível para os respectivos
códigos de operação em linguagem de máquina.
A tarefa de tradução de programas será apropriadamente feita por outros programas denominados
genericamente de Programas Tradutores. Vale dizer que cada linguagem de programação possui um
tradutor próprio.
A codificação é a escrita, utilizando uma linguagem de programação, das instruções que o computador
deve realizar para alcançar um resultado. Para a realização desta tarefa são utilizados os chamados
editores. Os editores são a primeira ferramenta à qual o programador recorre 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 a ser desenvolvido.
Apesar de que é possível utilizar qualquer editor de linha (como por exemplo, o EDIT do DOS) para
gerar o arquivo de programa, alguns ambientes oferecem ferramentas de edição mais poderosas
(orientadas à sintaxe ou de coloração de sintaxe). Alguns ambientes mais recentes oferecem a
possibilidade de projeto de interfaces gráficas e gerenciadores de eventos, com geração automatizada
do código fonte.
O código objeto é o código produzido pelo compilador. Ele se trata de uma forma intermediária similar
à linguagem de máquina do computador. O código objeto, apesar de estar representado em binário, não
é auto-contido, ou seja, não é executável diretamente pelos processadores. A principal razão disto é
Compiladores - São programas que traduzem outros programas escritos em linguagem de alto nível,
para linguagem de máquina.
Linguagem de Linguagem de
Tradutor
alto nível máquina
Programa Programa
Compilador
fonte objeto
Interpretadores: - São programas que traduzem e executam outros programas, escritos em linguagem
de alto nível, linha por linha. Como os interpretadores são responsáveis também pela execução dos
programas, eles deverão sempre estar presentes na memória da máquina junto com o programa a ser
utilizado.
Linguagem de
Tradutor Execução
alto nível
Programa
Interpretador Execução
fonte