Modelos de computação - DECLARATIVAS

Propaganda
- aritméticas
- difícil verificação
Modelos de computação
Característica: confiabilidade
- DECLARATIVAS
- Mecanismos que facilitem a produção de
- lógicas
- Pascal
- Recursos de linguagens de programação
- operadores lógicos têm precedência sobre os
- O QUE a máquina vai executar
programas que atendam às sua especificações
- mais próximas do pensamento natural
- Tipagem forte: o processador da linguagem deve - precedência
relacionais
- compiladores tem papel fundamental na eficiência - assegurar que a utilização dos diferentes tipos de - associatividade
- a > 5 or a < 0 (ilegal!!)
- HW está mais distante
dados seja compatível com a sua definição
- Java: contrário, expressão acima é legal
Operadores
- IMPERATIVAS
- evitar que operações perigosas, tal como
- Definidos na linguagem de programação, com
Avaliação “curto circuito”
- COMO a máquina vai executar
aritmética de ponteiros, seja permitida
- Aplicável a expressões lógicas
semântica associada aos tipos de dados dos
- mais próximas do hardware
- Tratamento de exceções: sistemas de tratamento operandos envolvidos
- Objetivo: otimizar desempenho
- dominam pelo desempenho
de exceções permitem construir programas que
- Unários: aplicáveis a um único operando
- A avaliação da expressão pode ser interrompida
Modelos : imperativo e declarativo
- possuam definições de como proceder em caso
quando seu resultado já pode ser definido por parte
- Exemplos: - c , not b
- Modelo imperativo
de comportamento não usual
- Binários: aplicáveis a dois operandos
da expressão
- Linguagens expressam seqüências de comandos
- possibilitem tanto o diagnóstico quanto o
- Adotado em algumas LP: C, C++ (Pascal não
- Exemplos: a - b , a <= b
que realizam transformações sobre dados
tratamento de erros em tempo de execução
- Ternários: aplicáveis a três operandos
adota)
- Base: máquina de Von Neumann
_____________________________________
- Exemplo: a > b ? a : b;
- Exemplo:
- orientadas a procedimentos
Implementação Prática: Diversas Estratégias
Expressões Aritméticas
- expressão: (a < b ) and (b < c)
- orientadas a objetos
- Uso de pré-processadores
- Questões de implementação
- se (a<b) for falso, é desnecessário avaliar (b<c)
- Modelo declarativo
- Remove comentários e espaços, agrupa
- regras de precedência
- Para o código abaixo:
- Linguagens que não possuem os conceitos de
caracteres em tokens (palavras-chave,
- regras de associatividade
while (i <= max_indice) and (A[I] <> chave)
- seqüências de comandos
identificadores, números, etc)
- ordem de avaliação dos operandos
{
- atribuição
- Expande macros
- restrições na avaliação dos efeitos colaterais nos
i = i + 1;
- linguagens funcionais: ênfase em valores
- Identifica estruturas de sintáticas (loops, suboperandos
}
computados por funções
rotinas)
- sobrecarga de operadores definidas pelo usuário - Se implementada, ok.
- linguagens lógicas: ênfase em axiomas lógicos
- compilação condicional (remove trechos de
- mistura de modos (conversões de tipo) permitidas - Senão, erro se chave não presente.
Modelos de execução
código)
Precedência
Avaliação curto-circuito X efeito colateral
Critérios Técnicos e Econômicos
- Objetivo
- Ada
- define uma hierarquia de prioridades para
- Escalabilidade
- Gerar uma forma intermediária que espelhe a
avaliação de operadores ( e funções)
- programador define
- modularidade
estrutura do código fonte mas possa ser interpretada - Normalmente seguem as mesmas prioridades da while (i <= max_indice) and then (A[I] /= chave)
- reusabilidade
de forma mais eficiente.
matemática
loop
- portabilidade
Pré-processador
i = i + 1;
- exponenciação, multiplicação/divisão,
- nível de abstração
- Programa que faz conversões entre linguagens de soma/subtração
end loop;
- confiabilidade
programação de alto nível similares ou para formas - Soma unária = operador identidade
Operadores de Atribuição
- eficiência
padronizadas de uma mesma linguagem de
- Alvos simples ou múltiplos
- Mas, em Java, indica conversão de tipo:
- legibilidade
programação
- a, b = 0;
- char a;
- modelagem de dados
- Possibilita a utilização de extensões da linguagem - +a => a é convertido para int
- Atribuições condicionais
- modelagem de processos
(macros ou mesmo novas construções sintáticas)
- flag ? count1 : count2 = 0;
- Subtração unária
- disponibilidade de compiladores e ferramentas
utilizando os processadores da linguagem original
- C++, Java
- sempre muda o sinal do operando
- familiaridade (custo-benefício do aprendizado)
Pré-processador: exemplo em C++
- necessidade de parêntesis no meio da expressão - Operador composto
Critérios para avaliação de LP
- Programas fonte escritos em C++ são inicialmente - A + - B => A + (-B)
-a=a+b
- Legibilidade
submetidos a um préprocessador que gera uma
- a += b
Associatividade
- Simplicidade
unidade de tradução sobre a qual o compilador irá - Associatividade
- Operador de atribuição unário
- Expressividade
trabalhar
- determina a ordem de avaliação para operadores - a++, -c
- Ortogonalidade
- Finalidades:
Operadores de Atribuição
de igual prioridade. Exemplo: a + b + f
- Confiabilidade
- inclusão de outros arquivos
- Atribuição como expressão
- Geral: esquerda para a direita
- Portabilidade
- definição de constantes simbólicas e macros
- while ((ch=getchar()) != EOF) {…}
- Exceções na exponenciação:
Característica: legibilidade
- compilação condicional do código do programa
- precedência do operador de atribuição é menor que
- Fortran associa da direita para a esquerda
- Facilidade de ler e escrever programas
- execução condicional de diretivas de
(concorda com significado matemático)
do operador relacional
- Legibilidade influi:
préprocessamento
_____________________________________
- a**b**c = a**(b**c)
- desenvolvimento e depuração de programas
- Diretivas para o préprocessador iniciam por #
- Em ADA não é associativo
- manutenção de programas
- Exemplo de macro
- a**b**c (ilegal!)
- desempenho de equipes de programação
#define
- Boa prática: uso de parênteses para explicitar sub- Fatores que melhoram a legibilidade:
CIRCLE_AREA(x) (PI * (x) * (x) )
expressões
- Abstração de dados
- por exemplo o comando:
Operador Ternário
- Comandos de controle
area = CIRCLE_AREA(4);
- Expressões condicionais em C, C++ e Java
- Modularização de programas
- será expandido para:
- expression1 ? expression2 : expression3
- Documentação
area=(3.14159 * (4) * (4));
if (expression1) then
- Convenções léxicas, sintaxe e semântica
- antes da compilação
expression2;
- Exemplo em Java: nomes de classes iniciam por Implementação Prática: Diversas Estratégias
else
letra maiúscula, nomes de campos usam letras
- Uso de Microcódigo
expression3;
minúsculas
- instruções de máquina não executam no HW, mas if (count == 0) then
Característica: simplicidade
sim em um interpretador
average = 0;
- Representação de cada conceito seja simples de - interpretador
else
aprender e dominar
- escrito em linguagem de máquina
average = sum/count;
- Simplicidade sintática exige que a representação - armazenado na ROM (firmware)
average := (count == 0) ? 0 : sum/count
seja feita de modo preciso, sem ambigüidades
- executado pelo HW
Avaliação do Operando
- contra-exemplo: A++; A=A+1; A+=1; ++A.
- comum em máquinas anteriores a década de 80 ou - Se operando tem efeitos colaterais, ordem de
- Simplicidade semântica exige que a representação em ASIPs (Application Specific Integrated
avaliação é importante
possua um significado independente de contexto
Processors)
- Efeito colateral
- contra-exemplo: diretiva static do C
Compilador Pascal
- função muda um ou mais dos seus parâmetros ou
- Simplicidade não significa concisão
- Programas fonte de usuários podem ser traduzidos uma variável global
- A linguagem pode ser concisa mas usar muitos
para linguagem de máquina ou para Pcode
Avaliação do Operando - estratégias
símbolos especiais
- A versão em P-code deve ser interpretada
- Não permitir funções com efeitos colaterais
- Exemplo: linguagens funcionais
- maior tempo de execução
- muito restritivo
Característica: expressividade
- melhores diagnósticos de erros
- retorno de mais de um valor
- Representação clara e simples de dados e
- favorece o processo de alterações e testes
- acesso a variáveis globais
procedimentos a serem executados pelo programa - permite a reexecução completa ou incremental
- Definir na LP uma ordem de avaliação dos
- Exemplo: tipos de dados em Pascal
dentro do próprio ambiente de desenvolvimento
operandos de uma expressão
- Expressividade x concisão
Analisadores
- compiladores usam re-ordenamento de avaliação
- muito concisa: falta expressividade?
- Analisador léxico (parser/scanner): tem por objetivo de operandos para otimização
- muito extensa: falta simplicidade?
separar os símbolos individuais da linguagem
- otimizações só possíveis se expressões não estão
- Linguagens mais modernas:
(tokens)
presentes
- incorporam apenas um conjunto básico de
- identificadores, palavras-chave, operadores, etc - LPs normalmente não definem esta ordem
representações de tipos de dados e comandos
- Analisador sintático: tem por objetivo descobrir a
- Java é exceção: avaliação da esquerda para direita
- aumentam o poder de expressividade com
estrutura de cada construção do programa
Sobrecarga de Operadores
bibliotecas de componentes
- declaração, expressão, atribuição, if, while, ....
- O mesmo operador pode ser usado para dados de
- Exemplos: Pascal, C++ e Java
Analisador semântico
vários tipos
Característica: ortogonalidade
- Análise sintática: processo de aplicar a gramática - Ex: Soma de inteiros, floats, strings, ponteiros
- Possibilidade de combinar entre si, sem restrições, da linguagem para formar a árvore de derivação a - Usos definidos na linguagem
os componentes básicos da LP
partir da seqüência de átomos (tokens)
- operador & em C: E lógico (binário) ou endereço
- Exemplo: permitir combinações de estruturas de - Análise semântica: usa a árvore de derivação para (unário)
dados, como arrays de registros
gerar uma representação interna do programa
- operador - : subtração (binário) ou subtração unária
- Contra exemplo: não permitir que um array seja
Tabela de símbolos
- Problemas
usado como parâmetro de um procedimento
- Tem por objetivo manter um mapeamento entre os - legibilidade
- Componente de primeira ordem: pode ser
identificadores usados no programa e suas
- verificação
livremente usado em expressões, atribuições, como propriedades
- if (A & B) => if (&B)
argumento e retorno de procedimentos
- Exemplo: x := a * (b + c) ;
- A - B => -B
- Influenciada pelo modelo de LP
(1) := (2) * ( (3) + ( 4))
- Diferentes operadores para “mesma” função
- Modelo de Objetos: objeto
Geradores
- float media = soma / num_valores
- Modelo funcional: funções
- Gerador de código: tem por objetivo produzir
- media = float(trunc(soma / num_valores))
Característica: portabilidade
código funcionalmente equivalente de cada
- int media = soma div num_valores
- Multiplataforma:
construção do programa
- float media = soma / num_valores
- capacidade de um software rodar em diferentes
- Otimizador de código: tem por objetivo aplicar um - Porém, há vantagens em LPs que suportam TADs
plataformas sem a necessidade de maiores
conjunto de técnicas sobre o código objeto para
- soma de matrizes
adaptações
torná-lo mais eficiente
- C++
- Sem exigências especiais de hardware/software
- Exemplos: eliminação de expressões redundantes, Expressões Relacionais e Lógicas
- Exemplo: aplicação compatível com sistemas Unix substituição de funções in-line, etc
- Operadores lógicos no mesmo nível de precedência
e Windows
_____________________________________
e não associativos
Expressões
- Longevidade:
- Ada: A > B and A < C or K = 0 (ilegal!)
- ciclo de vida útil do software e o do hardware não - Combinação de operandos e operadores, cuja
-C
precisam ser síncronos; ou seja, é possível usar o avaliação resulta em um valor
- não tem tipo lógico
mesmo software após uma mudança de hardware - Principais tipos de expressões:
- usa associatividade à esquerda
Download