Domínios de Programação • • • • • • Aplicações Científicas Aplicações Comerciais Inteligência Artificial Programação de Sistemas Linguagens de Scripting Linguagens para Propósitos Especiais Domínios de Programação Aplicações Científicas • • • • Estruturas de dados simples: matrizes Operações aritméticas em ponto flutuante FORTRAN, ALGOL 60 Nenhuma linguagem é significativamente melhor do que o FORTRAN até hoje Domínios de Programação Aplicações Comerciais • Facilidade para produzir relatórios • Exemplo: COBOL (60) • Há pouco desenvolvimento nas linguagens de aplicação comercial, além do que foi feito para COBOL (usado ainda hoje) Domínios de Programação Inteligência Artificial • Computações simbólicas, e não numéricas • LISP • PROLOG Domínios de Programação Programação de Sistemas • Desenvolvimento de software básico (sistemas operacionais) • Linguagens para programação de sistemas exigem execução rápida • PL/S (IBM), BLISS (Digital), Extended ALGOL (Burroughs) • Unix e C (poucas restrições de segurança) Domínios de Programação Linguagens de Scripting • Script é uma lista de comandos em um arquivo, para serem executados “em lote” • sh • ksh (Bell Labs) • awk (Aho, Wienberger e Kernighan) • tcl • Perl Critérios de Avaliação de Linguagens • • • • Legibilidade Facilidade de Escrita (“writability”) Confiabilidade Custo Critérios de Avaliação de Linguagens Legibilidade • Simplicidade: poucos componentes básicos, cuidado com a multiplicidade de recursos, overloading inteligente de operadores • Ortogonalidade: conjunto consistente de regras para combinar construções primitivas, com poucas exceções • Instruções de controle • Tipos e estruturas de dados • Sintaxe Critérios de Avaliação de Linguagens Facilidade de escrita • Simplicidade: grande número de construções diferentes leva a dificuldades para escrever programas • Suporte para abstração: capacidade de definir estruturas/operações complexas ignorando detalhes. Abrstração pode ser em dados e em código. • Expressividade: adequação das formas de especificar computações Critérios de Avaliação de Linguagens Confiabilidade • • • • Verificação de tipos Tratamento de exceções Aliasing Pouca legibilidade ou pouca facilidade de escrita tendem a gerar programas pouco confiáveis Critérios de Avaliação de Linguagens Custo • • • • • • • Treinamento Escrita de código Compilação Execução Implementação Manutenção da má confiabilidade Influências sobre o Projeto de Linguagens • Arquitetura dos computadores • Metodologias de programação ao longo da história Influências sobre o Projeto de Linguagens Arquitetura dos computadores • Últimos 40 anos: imensa maioria das linguagens de programação foi projetada em função da arquitetura Von Neumann • As linguagens baseadas nesta arquitetura são denominadas linguagens imperativas Influências sobre o Projeto de Linguagens Arquitetura dos computadores Modelo da arquitetura de Von Newmann MEMÓRIA resultados (“piped”) GARGALO de Von Newmann ULA instruções e dados (“piped”) UC CPU E/S Influências sobre o Projeto de Linguagens Arquitetura dos computadores • Execução de código numa máquina Von Newmann: ciclo “fetch-execute” • Programas: residem na memória mas são executados na CPU (cada instrução é transferida da memória para o processador) • Endereço da próxima instrução: mantido num registro chamado “program counter” Influências sobre o Projeto de Linguagens Arquitetura dos computadores EXECUÇÃO • inicialize o program counter • repeat forever – fetch – decode – execute Influências sobre o Projeto de Linguagens Metodologias de Programação • Final anos 60: Programação Estruturada • Anos 70: projeto “top-down”, refinamento, modularidade, verificação de tipos, mais instruções de controle • Final anos 70: abstração de dados • Anos 80: programação orientada a objetos • Anos 90: concorrência, internet Categorias de Linguagens • Imperativas: Pascal, C... – Ordem específica das instruções é importante • Orientadas a Objetos: C++, Delphi, Java... – Hierarquização, classificação, extrema modularização/abstração (código e dados) • Funcionais (LISP) e Lógicas (Prolog) – Baseadas na computação de funções ou regras de inferência. A recursão é um conceito natural nestas linguagens “Trade-offs” no Projeto de Linguagens • Confiabilidade vs. Custo de manutenção • Expressividade vs. Legibilidade • Flexibilidade vs. Segurança Métodos de Implementação • Compilação • Interpretação Pura • Sistemas híbridos Interface de computadores virtuais Comp. Comp.Pascal FORTRAN Comp. C Sistema Operacional Interpretador de Macroinstruções Comp. Ada Núcleo da Máquina Interp. LISP Interp. comandos SO ... Assembler O processo de compilação Programa-fonte alto nível Analisador Léxico tokens Analisador Sintático parse trees Tabela de símbolos Analisador Semântico Gerador de código intermediário Gerador de código ling. máquina - baixo nível dados de entrada Máquina Resultados Otimização cód. intermediário Interpretação pura • Programas são interpretados por outro programa (interpretador), sem conversão • Interpretador = simulador de software, máquina virtual cujas instruções são um programa em ling. alto nível • vantagem: facilidade de depuração • desvantagem: lentidão, muito espaço de memória • Exemplos: Linguagens de scripting, LISP... Sistemas Híbridos • Perl • Implementações iniciais de Java – – – – – código intermediário de Java = “código de bytes” portabilidade cód. bytes + interpretador = Java Virtual Machine hoje: tradução do cód. bytes p/ cód. máquina applets Java = são baixados em código de bytes