Baixe o app para aproveitar ainda mais
Prévia do material em texto
GCC 105 – LINGUAGENS DE PROGRAMAÇÃO I AULA 2 – Aspectos Preliminares 1º Semestre de 2015 Prof. Janderson Rodrigo de Oliveira Universidade Federal de Lavras Departamento de Ciência da Computação Por que estudar LPs? • Capacidade aumentada para expressar ideias. – A profundidade com a qual as pessoas podem pensar é influenciada pelo poder de expressividade da linguagem que elas usam para comunicar seus pensamentos. – A linguagem na qual se desenvolve um software impõe restrições nos tipos de estruturas de controle, estruturas de dados e abstrações que podem ser utilizadas. – Conhecer uma variedade mais ampla de recursos das linguagens de programação pode reduzir as limitações no processo de desenvolvimento de software. Por que estudar LPs? • Embasamento para escolher linguagens adequadas. – Conhecer uma faixa mais ampla de linguagens e construções de linguagens, torna o programador mais capacitado a escolher a que inclui os recursos melhor adaptados às características do problema a ser resolvido. – Evitar o comodismo das linguagens “já conhecidas”. Por que estudar LPs? • Habilidade aumentada para aprender novas linguagens. – O processo de aprender uma nova linguagem de programação pode ser difícil, especialmente quando uma pessoa não possui conhecimento sobre os conceitos de linguagens de programação de um modo geral. – Uma vez que o entendimento dos conceitos fundamentais das linguagens tenha sido adquirido, é mais fácil compreender como esses conceitos são incorporados no projeto da linguagem aprendida. Exemplo: Orientação a Objetos e Java. Por que estudar LPs? • Melhor entendimento da importância da implementação. – Aprender os conceitos de linguagens de programação leva a habilidade de usar uma determinada linguagem de maneira mais inteligente, utilizando-a da forma como ela foi projetada para ser utilizada. – Exemplo: um pequeno subprograma recursivo chamado frequentemente pode ser uma decisão de projeto altamente ineficiente. Por que estudar LPs? • Melhor uso de linguagens já conhecidas. – Muitas linguagens de programação são grandes e complexas. – Ao utilizar os conceitos de linguagens de programação, os programadores podem aprender sobre partes antes desconhecidas e não utilizadas das linguagens que eles já trabalham. Por que estudar LPs? • Avanço geral da computação. – É fundamental que programadores em atividade conheçam os conceitos fundamentais das linguagens de programação para poderem ler e entender descrições e avaliações de novas linguagens de programação. Domínios de Aplicação • Computadores têm sido aplicados a uma grande variedade de áreas. Por causa dessa diversidade, linguagens de programação com objetivos muito diferentes têm sido desenvolvidas. • Principais áreas de aplicação: – Aplicações científicas; – Aplicações empresarias; – Inteligência Artificial; – Programação de sistemas; – Software para a Web. Domínios de Aplicação • Aplicações científicas – Início em 1940. – Aplicações científicas têm estruturas de dados relativamente simples, mas requerem diversas computações aritméticas de ponto flutuante. – Estruturas de dados: vetores e matrizes. Estruturas de controle: laços de contagem e seleção. – A primeira linguagem para aplicações científicas foi o Fortran. Domínios de Aplicação • Aplicações empresariais – Início em 1950. – A primeira linguagem de alto nível para negócios a ser bem- sucedida foi o COBOL (1960). – Linguagens de negócios são caracterizadas por facilidades para a produção de relatórios elaborados, maneiras precisas de descrever e armazenar números decimais e caracteres, e a habilidade de especificar operações aritméticas decimais. Domínios de Aplicação • Definições: – Linguagem de alto nível: linguagem com um nível de abstração elevado, longe do código de máquina e mais próxima a linguagem humana. As características da arquitetura do computador são abstraídas nas linguagens de alto nível. – Linguagem de baixo nível: linguagem de programação que compreende as características da arquitetura do computador. Assim, utiliza instruções do processador, conhecendo os registradores da máquina. Domínios de Aplicação • Inteligência Artificial (IA) – IA é uma ampla área de aplicações computacionais caracterizada pelo uso de computações simbólica em vez de numéricas. – Computações simbólicas são aquelas nas quais símbolos, compostos de nomes em vez de números, são manipulados. – A primeira linguagem de programação desenvolvida para IA foi a linguagem funcional LISP (1959). – Em 1970, uma abordagem alternativa surgiu: programação lógica usando a linguagem Prolog. Domínios de Aplicação • Programação de sistemas – O sistema operacional e todas as ferramentas de suporte à programação de um sistema de computação são coletivamente conhecidos como seu software de sistema. – O sistema operacional UNIX é escrito quase todo em C. Algumas características de C fazem com que ele seja uma boa escolha para a programação de sistemas. Domínios de Aplicação • Software para Web – A World Wide Web é mantida por uma eclética coleção de linguagens. Exemplos: • Linguagens de marcação: XHTML. • Linguagem de programação de propósito geral: Java. • Linguagem de scripting: JavaScript ou PHP. Domínios de Aplicação • Definições: – Linguagens de marcação: conjunto de códigos aplicados a um texto ou a dados, com o fim de adicionar informações particulares sobre esse texto ou dado, ou sobre trechos específicos. – Linguagem de scripting: linguagens de programação executadas no interior de programas e/ou outras linguagens de programação. Critérios de Avaliação • Critérios: – Legibilidade; – Facilidade de escrita; – Confiabilidade; – Custo. Critérios de Avaliação • Legibilidade: – Facilidade com a qual programas pode ser lidos e entendidos. – Antes de 1970, as construções de linguagens foram projetadas mais do ponto de vista do computador do que do usuários. – Nos anos 1970, a manutenção foi reconhecida como uma parte principal do ciclo de desenvolvimento de software. – Como a facilidade de manutenção é determinada, em grande parte, pela legibilidade, esta característica se tornou uma medida importante de qualidade. Critérios de Avaliação • Fatores que influenciam a legibilidade: 1. Simplicidade geral – Uma linguagem com muitas construções básicas é mais difícil de aprender do que uma com poucas. – Outro ponto desfavorável: multiplicidade de recursos, ou seja, existir mais de uma maneira de realizar uma operação: Exemplo: incremento de uma variável inteira em Java e C/C++. – Outro ponto desfavorável: sobrecarga de operadores - recurso no qual um operador tem mais de um significado. Critérios de Avaliação • Fatores que influenciam a legibilidade: 2. Ortogonalidade – Significa que um conjunto relativamente pequeno de construções primitivas pode ser combinado a um número relativamente pequeno de formas para construir as estruturas de controle e de dados da linguagem. – Além disso, cada possível combinação de primitivas é legal e significativa. Critérios de Avaliação • Fatores que influenciam a legibilidade: 2. Ortogonalidade – Exemplo: Tipos primitivos de dados (inteiro, ponto flutuante, ponto flutuante com precisão dupla e caractere). Operadores de tipo (vetor e ponteiro). – A ortogonalidade vem da simetria de relacionamentos entre primitivas. Uma falta de ortogonalidade leva a exceções às regras de linguagem. Critérios de Avaliação • Fatores que influenciam a legibilidade: 2. Ortogonalidade – Exemplo de falta de ortogonalidade: em C, os registros(structs) podem ser retornados por funções, mas os vetores não. Parâmetros são passados por valor, a menos que sejam vetores, o que faz com que sejam passados por referência. – Muita ortogonalidade também pode causar problemas. Um alto grau de ortogonalidade resulta em uma explosão de combinações. Mesmo se as combinações forem simples, seu número eleva a complexidade. Critérios de Avaliação • Fatores que influenciam a legibilidade: 3. Tipos de dados – A presença de mecanismos adequados para definir tipos e estruturas de dados é outro auxílio significativo a legibilidade. – Exemplo: tipo numérico como um tipo booleano. Critérios de Avaliação • Fatores que influenciam a legibilidade: 4. Projeto de sintaxe – Formato dos identificadores. – Palavras especiais. – Forma e significado. Critérios de Avaliação • Facilidade de escrita: – Medida do quão facilmente uma linguagem pode ser usada para criar programas para um domínio. – A maioria das características de linguagem que afetam a legibilidade também afeta a facilidade de escrita. Critérios de Avaliação • Outros fatores que influenciam a facilidade de escrita: 1. Suporte à abstração – Abstração significa a habilidade de definir e usar estruturas ou operações “complicadas” de forma a permitir que muitos detalhes sejam ignorados. – Exemplo: uso de um subprograma para ordenação. Sem o subprograma, o código de ordenação teria de ser replicado em todos os lugares onde fosse preciso, o que tornaria o programa muito longo e tedioso de ser escrito. Critérios de Avaliação • Outros fatores que influenciam a facilidade de escrita: 2. Expressividade – Em geral, uma linguagem de programação expressiva especifica computações de forma conveniente. – Exemplo: Em C, a notação count++ é mais conveniente e menor do que count = count + 1. Critérios de Avaliação • Confiabilidade: – Um programa é dito confiável quando está de acordo com suas especificações em todas as condições. – A maioria das características de linguagem que afetam a legibilidade e a facilidade de escrita também afeta a confiabilidade. Critérios de Avaliação • Outros fatores que influenciam a confiabilidade: 1. Verificação de tipos – A verificação de tipos é a execução de testes para detectar erros de tipos em um programa, tanto por parte do compilador quanto durante a execução de um programa. – Quanto mais cedo os erros dos programas forem detectados, menos caro é fazer todos os reparos necessários. Critérios de Avaliação • Outros fatores que influenciam a confiabilidade: 2. Tratamento de exceções – A habilidade de um programa de interceptar erros em tempo de execução, tomar medidas corretivas e então continuar a execução é uma ajuda óbvia para a confiabilidade. Critérios de Avaliação • Custo 1. O custo de treinar programadores para usar a linguagem; 2. O custo de escrever programas na linguagem; 3. O custo de compilar programas na linguagem; 4. O custo de executar programas na linguagem; 5. O custo do sistemas de implementação da linguagem; 6. O custo de uma confiabilidade baixa; 7. O custo de manter programas, que inclui tanto as correções quanto as modificações para adicionar novas funcionalidades. Métodos de Implementação • As linguagens de programação podem ser implementadas por um de três métodos gerais: – Compilação – Interpretação pura – Sistemas de implementação híbridos Compilação Compilação • Programas podem ser traduzidos para linguagem de máquina, a qual pode ser executada diretamente no computador. • Exemplos de linguagens compiladas: C, COBOL e Ada. • A linguagem que um compilador traduz é chamada de linguagem fonte. • O analisador léxico agrupa os caracteres do programa fonte em unidades léxicas, que são identificadores, palavras especiais, operadores e símbolos de pontuação. Compilação • O analisador sintático constrói estruturas hierárquicas chamadas de árvores de análise sintática (parse trees) que representam a estrutura sintática do programa. • O gerador de código intermediário produz um programa em uma linguagem diferente, em um nível intermediário entre o programa fonte e o programa em linguagem de máquina. Em muitos casos, o código intermediário são linguagens de montagem. Compilação • Programa fonte: – Linguagem de alto nível. – Características: laços, variáveis, objetos, independente de máquina. • Linguagem de montagem: – Linguagem de baixo nível. – Sequência de instruções, registradores, posições de memória, dependente de máquina. • Linguagem de máquina: – Código binário (0s e 1s). Compilação • O analisador semântico é parte do gerador de código intermediário, que verifica erros difíceis de serem detectados na análise sintática, como erros de tipos. • O gerador de código traduz a versão de código intermediário otimizado do programa em um programa equivalente em linguagem de máquina. • A tabela de símbolos contém informações de tipos e atributos de cada um dos nomes definidos pelo usuário no programa. Compilação • Apesar da linguagem de máquina gerada por um compilador poder ser executada diretamente no hardware, ela praticamente sempre precisa rodar com algum outro código. • A maioria dos programas de usuário utiliza programas do sistema operacional (exemplo: entrada e saída). • Antes dos programas de usuários serem executados, aqueles requeridos do sistema operacional devem ser encontrados e ligados com o programa do usuário. Tal tarefa é realizada por um programa de sistema chamado de ligador (linker). Interpretação Pura Interpretação Pura • Nesta abordagem, os programas são interpretados por outro, chamado interpretador, sem tradução. • O interpretador age como uma simulação de uma máquina que trata de sentenças de programa de alto nível em vez de instruções de máquina. • Essa simulação fornece uma máquina virtual para a linguagem. Interpretação Pura • A interpretação pura tem a vantagem de permitir uma fácil implementação de muitas operações de depuração em código fonte. • Em contrapartida, esta abordagem é de 10 a 100 vezes mais lenta do que os sistemas compilados. Motivo: decodificação das sentenças em linguagens de máquina. • Linguagens puramente interpretadas: – Anos 1960: APL, SNOBOL e LISP. – Anos 1980: praticamente extintas. – Retorno: linguagens de scripting – JavaScript e PHP. Sistemas de Implementação Híbridos Sistemas de Implementação Híbridos • Meio termo entre os compiladores e interpretadores puros. • Traduzem programas em linguagem de alto nível para uma linguagem intermediária projetada para facilitar a interpretação. • Os sistema de implementação híbridos são mais rápidos do que a interpretação pura, porque as sentenças de linguagem fonte são decodificadas apenas uma vez. Sistemas de Implementação Híbridos • Linguagens híbridas: – Perl – Primeiras implementações de Java • Formato intermediário: bytecode, fornece portabilidade para qualquer máquina que tenha um interpretador de bytecodes e um sistema de tempo de execução associado (Máquina Virtual Java).
Compartilhar