Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagens de Programação Introdução Prof. Otávio Calaça Xavier otavio@inf.ufg.br 2 Tópicos da Anteriores ● Aula 01 ● Razões para estudar conceitos de linguagens de programação ● Domínios de programação ● Critérios de avaliação da linguagem 3 Tópicos da Aula ● Influências sobre o projeto da linguagem ● Categorias de linguagem ● Balanço no projeto de linguagens ● Métodos de implementação 4 Influências sobre o Projeto da Linguagem ● Arquitetura do computador: linguagens são desenvolvidas em função da arquitetura mais atual (hoje von Neumann) 5 Influências sobre o Projeto da Linguagem ● Linguagens imperativas dominantes por causa da arquitetura ● Dados e programas mantidos na memória ● Memória separada da CPU ● Variáveis modelam células de memória ● Instruções e dados canalizados (piped) da memória para a CPU 6 Ciclo Fetch-Execute ● Iteração é eficiente ● Desencoraja o uso de recursão ● Impacto em linguagens funcionais initialize the program counter repeat forever fetch the instruction pointed by the counter increment the counter decode the instruction execute the instruction end repeat 7 Influências sobre o Projeto da Linguagem ● Metodologias de programação: novas metodologias de desenvolvimento levam a novos paradigmas de programação e a extensões, ou mesmo novas linguagens de programação ● Orientação a objetos 8 Influências sobre o Projeto da Linguagem ● Anos 1950 e início dos anos 1960: aplicações simples; preocupação com a eficiência da máquina ● Fim dos anos 1960: eficiência das pessoas torna-se importante; legibilidade, melhores estruturas de controle ● Programação estruturada ● Projeto top-down e refinamento ● Fim dos anos 1970: orientação ao processo para orientação aos dados ● Abstração de dados ● Meados dos anos 1980: programação orientada a objetos ● Abstração de dados + herança + polimorfismo 9 Categorias de Linguagem ● Imperativa ● Características centrais são variáveis, declarações de atribuição, iteração ● Inclui as linguagens que suportam orientação a objetos ● Inclui linguagens de script ● Inclui linguagens visuais ● Exemplos: C, Java, Perl, JavaScript, Visual BASIC .NET, C++ 10 Categorias de Linguagem ● Funcional ● Realiza computações aplicando funções aos parâmetros fornecidos ● Exemplos: LISP, Scheme (defun triple (X) "Compute three times X." ; Inline comments can (* 3 X)) ; be placed here. 11 Categorias de Linguagem ● Lógica ● Baseada em regras (regras são especificadas sem uma ordem particular) ● Exemplo: Prolog luz(acesa) :- interruptor(ligado). ancestral(X,Y) :- mãe(X,Y). ancestral(X,Y) :- pai(X,Y). ancestral(X,Y) :- mãe(X,Z),ancestral(Z,Y). ancestral(X,Y) :- pai(X,Z),ancestral(Z,Y). 12 Categorias de Linguagem ● Marcação/híbrida ● Linguagens de marcação (markup) estendidas para suportar programação ● Exemplos: JSTL, XSLT 13 JSTL <c:choose> <c:when test="${EL_EXPR1}"> ... </c:when> <c:when test="${EL_EXPR2}"> ... </c:when> ... <c:otherwise> ... </c:otherwise> </c:choose> <c:forEach var="x" items="${M}" > ${x.key}: ${x.value} </c:forEach> <c:out value="EL-EXPRESSION" /> <c:set var="x" value="EL-EXPRESSION" /> <c:if test="EL-EXPRESSION" > ... </c:if> 14 Balanço no Projeto de Linguagens ● Confiabilidade vs Custo de execução ● Em Java todas as referências aos elementos de arrays são verificadas quanto à indexação correta. Isso aumenta os custos de execução. 15 Balanço no Projeto de Linguagens ● Legibilidade vs Redigibilidade ● APL fornece operadores muito poderosos (e um grande número de símbolos novos), permitindo que computações complexas sejam escritas em um programa compacto. No entanto, o custo da baixa legibilidade é alto. FATORIAL [ ]⎕ ∇ Z ← FATORIAL N [1] → (N ≠ 0) / A [2] → 0,Z ← 1 [3] A:Z←N×FATORIAL(N-1) 16 Balanço no Projeto de Linguagens ● Redigibilidade vs Confiabilidade ● Ponteiros do C++ são poderosos e muito flexíveis, mas não são confiáveis. Java não adotou ponteiros. ● Alguns conflitos são óbvios, outros são mais sutis. 17 Métodos de Implementação ● Compilação ● Programas são traduzidos para a linguagem de máquina ● Interpretação pura ● Programas são interpretados por outro programa conhecido por interpretador ● Implementação híbrida ● Meio-termo entre os compiladores e os interpretadores. 18 Visão em Níveis 19 Compilação ● Traduz programas de alto nível (código fonte) para o código de máquina (linguagem de máquina) ● Tradução lenta, execução rápida ● Processo de compilação tem várias fases 20 Compilação 21 Compilação 22 Compilação ● Alguns compiladores C++ transformavam o código em C em vez de código intermediário ● Muitos compiladores são self-hosting, i. e., são escritos na própria linguagem que compilam ● Problema do “ovo e a galinha”? ● Técnica de bootstrapping 23 Interpretação Pura ● Não há tradução ● Implementação mais fácil de programas ● Erros em tempo de execução podem ser facilmente e imediatamente mostrados ● Execução mais lenta ● 10 a 100 vezes mais lenta que de programas compilados ● Requer mais espaço ● Atualmente pouco empregadas em linguagens de alto nível ● Uso com algumas linguagens de script para web ● Ex.: JavaScript e PHP 24 Implementação Híbrida ● Meio-termo entre compiladores e interpretadores puros ● Um programa em uma linguagem de alto nível é traduzido para uma linguagem intermediária que permita a interpretação fácil ● Mais rápido que a interpretação pura ● Programas em Perl são parcialmente compilados para detectar erros antes da interpretação ● Em Java, a forma intermediária (byte code) fornece portabilidade para qualquer máquina que tenha um interpretador e um sistema de execução ● Java Virtual Machine 25 Implementação Híbrida 26 JIT – Just-in-Time ● Inicialmente traduz os programas para uma linguagem intermediária ● É feita a compilação dos subprogramas (estão na linguagem intermediária) para código de máquina quando são chamados ● A versão em código de máquina é mantida para chamadas subsequentes ● Java e .NET oferecem compilador JIT ● Outras linguagens estão compilando para essas plataformas a fim de ter ganhos de portabilidade e desempenho 27 Pré-processadores ● Pré-processadores são normalmente usados para especificar que código de outro arquivo deve ser incluído ● Um pré-processador processa um programa imediatamente antes do programa ser compilado ● Exemplo conhecido: pré-processador C ● #include, #define, #if, etc. ● Macros do usuário – Cuidado com efeito colateral! 28 Pré-processadores #define dobro(x) (x + x) x = 2; y = dobro(++x); #define calc(x, y) (x + y * 2) z = calc(2, 1+5); #define inc(x, y) x++; y++; if (z > 10) inc(x, y) 29 Pré-processadores #define dobro(x) (x + x) x = 2; y = dobro(++x); #define dobro(x) (x + x) x = 2; y = (++x + ++x); #define calc(x, y) (x + y * 2) z = calc(2, 1+5); #define calc(x, y) (x + y * 2) z = (2 + 1+5 * 2); #define inc(x, y) x++; y++; if (z > 10) inc(x, y) #define inc(x, y) x++; y++; if (z > 10) x++; y++; 30 Resumo ● Influências sobre o projeto da linguagem ● Arquitetura e metodologia ● Categorias de linguagem ● Imperativa, funcional, lógica e marcação/híbrida ● Balanço no projeto de linguagens ● Combinar características conflitantes ● Métodos de Implementação ● Compilação, interpretação e híbrido Slide 1 Tópicos da Anteriores Tópicos da Aula Influências sobre o Projeto da Linguagem Influências sobre o Projeto da Linguagem Ciclo Fetch-ExecuteInfluências sobre o Projeto da Linguagem Influências sobre o Projeto da Linguagem Categorias de Linguagem Categorias de Linguagem Categorias de Linguagem Categorias de Linguagem JSTL Balanço no Projeto de Linguagens Balanço no Projeto de Linguagens Balanço no Projeto de Linguagens Métodos de Implementação Visão em Níveis Compilação Compilação Compilação Compilação Interpretação Pura Implementação Híbrida Implementação Híbrida JIT – Just-in-Time Pré-processadores Pré-processadores Pré-processadores Resumo
Compartilhar