- 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