Escolar Documentos
Profissional Documentos
Cultura Documentos
O paradigma imperativo é aquele no qual os programas são sequências de instruções (ordens) e estão
associados ao conceito de algoritmo. Nem toda sequência de instruções é um algoritmo e nem todo programa
é uma sequência de instruções. Os paradigmas da programação declarativa, que serão vistos mais à frente,
são conjuntos de declarações de relacionamentos, usados para descrever uma solução ou resultado de um
problema.
Os temas abordados aqui (variáveis, tipos de dados, avaliação de expressões e subprogramas – com a
exceção de controle de fluxo) não são específicos da programação imperativa, eles aparecem em todos os
paradigmas de programação. Porém, estão organizados desta forma para ficar em acordo com a ementa da
disciplina. Todos na disciplina já têm alguma experiência com programação imperativa, portanto resta
apresentar apenas alguns detalhes.
1. Variáveis
As variáveis são associações que identificam informações. Elas podem ser caracterizadas por:
• nome: as linguagens possuem regras a respeito de quais sequências de caracteres podem ser usadas
como nomes, essas regras não variam muito nas linguagens modernas, mas cabe destacar que a
possibilidade usar caracteres acentuados vem ganhando força;
• endereço: toda informação precisa ficar guardada em algum lugar na memória e para isso, variáveis
precisam ser associadas a endereços, que podem ser usados para acesso à informação mesmo na
ausência de um nome;
• valor: toda posição da memória contém um valor mas algumas linguagens de programação fazem
um controle que permite usar variáveis como se elas pudessem não ter valor, essa ausência de valor
pode ser usada como um valor especial;
• tipo: toda variável precisa ser associada a um tipo de dados, porém algumas linguagens fazem um
controle que permite usar variáveis como se elas não tivessem um tipo, isso é feito modificando o
tipo associado durante a execução do programa;
• tempo de vida: o tempo de vida de uma variável é período da execução em que a variável está
associada com uma posição de memória, se uma variável não está associada, então ela não pode ser
usada (não existe);
• escopo: é trecho do código fonte em que um nome está associado à variável, variáveis podem ser
usadas mesmo sem um nome associado, desde possam ser identificada por ponteiros (endereços).
Essas características já foram mais variáveis no passado, em especial, as regras de escopo das linguagens de
programação eram muito diferentes até a década de 90 (mais ou menos).
2. Tipos de Dados
Os tipos de dados são apresentados na disciplina inicial de programação e não precisam ser apresentados
novamente. Porém, serão reforçados alguns casos mais importantes no contexto do nosso curso.
3. Avaliação de Expressões
As linguagens costumam permitir que se escreva conjuntos de vários operadores para representar um valor,
mas os operadores precisam ser processados um de cada vez. As linguagens possuem regras diferentes para
determinar qual a ordem de avaliação dos operadores. Existem dois elementos importantes nessas regras:
precedência e associatividade. O uso de parênteses é importante para produzir ordens diferentes e para evitar
a necessidade de se decorar tais regras.
Para produzir resultados mais rápidos, é comum que a avaliação termine sem que todos os operadores
tenham sido avaliados, nos casos em que é possível. Esse recurso é conhecido como avaliação em curto-
circuito. É comum que os operadores booleanos sejam avaliados em curto-circuito e os aritméticos não
sejam. De qualquer forma é bom estar atento às regras de cada linguagem; a mesma expressão pode estar
certa ou errada dependendo da forma como é avaliada.
4. Controle de Fluxo
As instruções de controle de fluxo são aquelas que definem qual a sequência de instruções a ser seguida na
execução do programa.
Os tipos mais comuns de controle de fluxo são os seletores (comandos que servem para escolher um entre
vários caminhos de execução) e os comandos de repetição. Quanto aos comandos de repetição, existem
quatro tipos e as linguagens oferecem um ou mais comandos de alguns desses tipos:
• Repetição controlada por contador: são aquelas em que não há um teste, ao invés disso o
programador informa quantas vezes a repetição deve ocorrer, possivelmente, com quais valores a
variável de controle estará associada.
• Repetição controlada por teste: são aquelas em que o programador precisa pensar num teste que
define se a repetição deve parar ou continuar. Existem quatro variações, segundo dois subtipos:
◦ teste no início (repete zero ou mais vezes) versus teste no fim (repete uma ou mais vezes)
◦ teste positivo (teste indica se repete) versus teste negativo (teste indica se para de repetir)
Nas linguagens declarativas puras, não existem instruções de controle de fluxo, porém é comum existir
operadores de seleção, em que um teste determina se o valor de uma expressão é esse ou aquele.
5. Subprogramas
Para lidar com a complexidade de programas grandes, é importante dividi-los em pedaços independentes, ou
seja, que possam ser entendidos, modificados e corrigidos sem que seja necessário levar em consideração os
outros pedaços que ele usa ou os que o usam.
Existem vários tipos diferentes de subprogramas: sub-rotinas, corrotinas e threads. As sub-rotinas podem ser
divididas em funções e procedimentos, várias linguagens seguem o modelo de C, em que a sintaxe das duas
tem os mesmos elementos. As corrotinas são um recurso antigo para programação concorrente e não são
comuns nas linguagens modernas. Threads são um recurso mais moderno para programação concorrente e
geralmente não aparecem com uma sintaxe diferente de subprogramas, mas sim como uma forma diferente
de ativar subprogramas, geralmente disponibilizada por meio de bibliotecas.
Na Orientação a Objetos, os subprogramas estão associados aos tipos de dados e são chamados de
"métodos". Na programação lógica, os subprogramas têm um significado um pouco diferente e são
chamados de "predicados".
As linguagens variam bastante em relação à flexibilidade que apresentam para declarar e para usar
subprogramas. A possibilidade e a forma como subprogramas podem ser associados à variáveis ou passados
como parâmetros para outros subprogramas é um ponto de destaque na expressividade das linguagens.
Existem ainda recursos diversos em relação à passagem de parâmetros.
5.2 Sobrecarga
A sobrecarga é criação de subprogramas diferentes com o mesmo nome. Não é uma forma de reuso
propriamente dita porque consiste na declaração de novos subprogramas; porém é um recurso que aumenta a
facilidade de escrita e, se bem usado, aumenta a legibilidade do código. Por exemplo, a comparação entre
valores de tipos diferentes (inteiro, string, funcionários) não deveria ter nomes diferentes. É desejável que o
programador ative o subprograma "menor" para ver se um valor é menor que outro, sem ter que se preocupar
se ele está comparando um outro tipo. Preferencialmente, esses subprogramas devem se chamar "<" em
todos os casos e a linguagem deve ter implementações pré-definidas para os tipos primitivos da linguagem,
permitindo que o programador crie outras implementações de "<" para os tipos que ele criar. Subprogramas
com nomes especiais e sintaxe especial como o "<" são chamados de operadores, mas não deixam de ser
subprogramas.
Comparar dois inteiros ou comparar dois nomes não é algo que compartilhe a mesma sequência de
instruções. É por isso que um recurso de flexibilidade em que é necessário "escrever de novo" faz sentido.