Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal do Ceará Campus de Quixadá Linguagens de Programação: Introdução* Flávio R. C. Sousa flaviosousa@ufc.br @flaviosousa www.es.ufc.br/~flavio * Material: George Darmiton da Cunha Cavalcanti Introdução Linguagens de Programação são usadas: Projetos disciplinares Estágio Empresas (Novos e antigos projetos) Existem dezenas de linguagens de programação Linguagens com características diferentes Em 17 de maio de 2013, havia 669 LPs" na lista da Wikipédia. Motivação Quais características de uma linguagem de programação são importantes? Como comparar estas características? Qual linguagem de programação usar? Como comparar diversas linguagens? Como estudar novas linguagens? Como projetar novas linguagens? Qual a melhor linguagem para uma determinada aplicação? Objetivos Análise crítica de paradigmas e linguagens de programação Estudo dos conceitos gerais de linguagens de programação: valores, tipos, bindings, escopo, memória, entre outros. Visão geral dos paradigmas imperativo, funcional, orientado a objetos, lógico e concorrente Razões para estudar os conceitos de LPs Melhorar a capacidade de expressar conceitos de programação Maior embasamento para a escolha de linguagens apropriadas Escolha mais consciente Incrementar a capacidade para aprender novas linguagens Consolidação dos conceitos das linguagens Razões para estudar os conceitos de LPs Entender melhor o significado da implementação Uso de uma linguagem de forma mais inteligente. Aumentar a capacidade de projeção de novas linguagens Avanço global da computação Linguagens de Programação Programa Um conjunto completo de comandos estruturados de forma a especificar um algoritmo. Algoritmo Conjunto de regras e de procedimentos lógicos, perfeitamente definidos, que levam à solução de um problema em um número finito de etapas. Linguagens de Programação É uma ferramenta para instruir máquinas ? Um meio de comunicação entre humanos e máquinas ? Um veículo para expressar modelos de alto- nível? Uma notação para algoritmos? Uma LP de propósito geral deve permitir tudo isto. Uma notação para se ler, escrever e executar computações. Linguagens de Programação Uma linguagem é um conjunto de regras sistemáticas para a comunicação de ideias Linguagens de programação Instrumentos para facilitar a comunicação entre humanos e computadores a fim de solucionar problemas Têm o objetivo de representar alguma informação por meio de uma sequência de símbolos Características das LPs Voltada para a descrição de algoritmos Implementável nos PCs tradicionais Gramática e significado bem definidos Não permite sentenças com significado ambíguo. Características de uma LP Universal Todo problema que pode ser resolvido pelo computador tem que ter uma solução programável na LP Tem que ser implementável num computador Natural para expressar problemas em um certo domínio de aplicação Tem que ser capaz de ter uma implementação aceitável, em termos de eficiência Paradigmas de Programação Modelo, padrão ou estilo de programação suportado por linguagens que agrupam certas características comuns Cada linguagem apresenta uma maneira particular de modelar o que é um programa Cada paradigma agrupa linguagens que representam programas de forma semelhante Paradigmas de Programação A escolha de um determinado paradigma influencia a forma com a qual uma aplicação real é modelada do ponto de vista computacional Principais paradigmas: Imperativo Orientado a objetos Funcional Lógico Concorrente Paradigmas de Programação Imperativo Procedural – Pascal, FORTRAN, COBOL, C, ADA Orientado a Objetos (Smalltalk, objectPascal, C++, Java) Declarativo Funcional – LISP, ML, Haskell Lógico – Prolog Concorrente Paralelo – n processadores + 1 memória (ADA, concurrent Pascal) Distribuído – n processadores + m memórias (Java) Paradigmas Híbridos OOLP (Object-Oriented Logic Programming) Linguagens de Programação: Conceitos Básicos* * Material: George Darmiton da Cunha Cavalcanti Domínios de Programação Aplicações científicas Grande número de operações com números reais Fortran Aplicações comerciais Produção de relatórios, uso de números decimais e texto COBOL Inteligência artificial Uso de computações simbólicas em vez de numéricas LISP Programação de sistemas Precisa de eficiência devido ao uso contínuo C Softwares para a Web Coleção eclética de linguagens: markup (XHTML), scripting (PHP), general-purpose (Java) Critérios de avaliação de LPs Legibilidade (Readability) Quão facilmente um programa pode ser lido e entendido Capacidade escrita (Writability) Quão facilmente uma linguagem pode ser usada para criar programas Confiabilidade (Reliability) Conformidade com as especificações sob todas as condições Custo O custo final de uma linguagem é uma função de suas características Critérios de avaliação de LPs Legibilidade (Readability) Simplicidade Pequeno número de componentes básicos são mais fáceis de aprender Multiplicidade de recursos (mais de uma maneira para realizar uma operação particular) Um exemplo em C para incrementar uma variável inteira simples: cont = cont +1 cont += 1 cont++ ++cont Sobrecarga (overloading) de um operador, ou seja, um único símbolo possui mais de um significado. Legibilidade (Readability) Ortogonalidade Conj. relativamente pequeno de construções primitivas pode ser combinado em um número relativamente pequeno de maneiras. Toda combinação possível é legal e significativa. Possibilidade de combinar entre si, sem restrições, os componentes básicos da LP Exemplo: projeto VAX Uma única operação pode usar registradores ou células de memória como operandos. Legibilidade (Readability) Instruções de Controle Existência de estruturas de controle bem conhecidas (exemplo: while) while (incr < 20) { while (sum <= 100) { sum += incr; } incr++; } loop1: if (incr >= 20) goto out; loop2: if (sum > 100) goto next; sum += incr; goto loop2; next: incr++; goto loop1; out: Legibilidade (Readability) Tipos de Dados e Estruturas A presença de facilidades adequadas para definir tipos de dados e estruturas de dados. Exemplo: Suponha que em uma linguagem não exista um tipo de dado booleano e um tipo numérico seja usado para substituí-lo: timeOut = 1 (significado não claro) timeOut = true (significado claro) Legibilidade (Readability) Considerações sobre a sintaxe Formas identificadoras Restringir os identificadores a tamanhos muito pequenos prejudica a legibilidade Palavras especiais Formas das palavras especiais de uma linguagem (exemplo: while, class, for e begin-end) Palavras especiais de uma linguagem podem ser usadas como nomes de variáveis? Forma e significado Projetar instruções de forma que sua aparência indique sua finalidade Capacidade escrita (Writability) Simplicidade e Ortogonalidade Poucos construtores, um pequeno número de primitivas, um pequeno conjunto de regras para combiná-los. Suporte para abstração A capacidade de definir e de usar estruturas ou operações complexas de maneira que permita ignorar muitosdos detalhes. Expressividade Conjunto relativamente conveniente de maneiras de especificar operadores. Exemplos: count++ é mais conveniente do que count = count + 1 a inclusão do for em muitas linguagens modernas Confiabilidade (Reliability) Verificação de tipos Testar se existem erros de tipos Tratamento de Exceções Capacidade de interceptar erros em tempo de execução e por em prática medidas corretivas Apelidos (Aliasing) Presença de dois ou mais métodos, ou nomes, distintos que referenciam a mesma célula de memória Confiabilidade (Reliability) Legibilidade (Readability) e Capacidade de Escrita (Writability) Uma linguagem que não suporta maneiras naturais de expressar os algoritmos usará, necessariamente, abordagens não-naturais. Assim, a legibilidade será reduzida. A legibilidade afeta a confiabilidade tanto na escrita quanto na manutenção. Custo Treinamento para usar a linguagem Escrita de programas na linguagem Compilação de programas na linguagem Execução dos programas Sistema de implementação da linguagem: Existência de compiladores free Confiabilidade Confiabilidade baixa leva a altos custos Manutenção dos programas Outros Critérios de avaliação Portabilidade Quão facilmente um programa pode ser movido de uma “plataforma” para outra Generalidade Seu uso em uma gama de aplicações Boa definição (Well-definedness) A precisão da definição oficial da linguagem Influência na criação das LPs Arquitetura do Computador Linguagens são desenvolvidas com base na arquitetura mais usada, conhecida como arquitetura von Neumann As Linguagens Imperativas são as dominantes, motivadas por computadores von Neumann Dados e programas armazenados na memória Memória separada da CPU Instruções e dados trafegam da memória para a CPU Metodologias de programação Novas metodologias de desenvolvimento de software (ex. OO) levam a novos paradigmas e, novas linguagens Influência na criação das LPs Arquitetura de von Neumann Gargalo de Von Neumann Velocidade de conexão entre a memória do computador e seu processador determina a velocidade de um computador Instruções geralmente são executadas mais rapidamente do que podem ser transferidas Esta relação é denominada gargalo de von Neumann Fator limitante básico da velocidade dos computadores Influencia as as Linguagens de Programação Metodologia de Programação Década de 50 e início da de 60 Aplicações simples Preocupação era a eficiência da máquina Final da década de 60 Foco agora são as pessoas: legibilidade, melhores estruturas de controle Programação estruturada e projeto top-down e refinamento passo-a-passo Final da década de 70 Orientado para processo ⇒ orientada a dados Abstração de dados Meados da década de 80 Programação orientada a objetos Abstração de dados + herança + polimorfismo Custo/benefício no projeto de LPs Confiabilidade versus Custo de Execução A verificação da validade do índice de um array aumenta a confiabilidade através de mais instruções. Aumenta o custo de execução. Readability versus writability Linguagem compacta é mais simples de escrever Ex: C++ for(;argv;count<< *argv++;); Dificulta a leitura. Writability (flexibility) versus reliability Ponteiros são poderosos e muito flexíveis. Pode causar problemas. Métodos de Implementação Compilação Programas são traduzidos para linguagem de máquina Interpretação pura Programas são interpretados por outro programa conhecido como interpretador Sistemas de Implementação Híbridos Um meio-termo entre compiladores e interpretadores puros Compilação Traduz programas em alto-nível (linguagem fonte) em código de máquina (linguagem de máquina) Tradução lenta, execução rápida O processo de compilação possui várias fases: Análise léxica Converte caracteres de um programa fonte em unidades léxicas Análise sintática Transforma unidades léxicas em parse trees, as quais representam a estrutura sintática do programa Análise semântica Gera código intermediário Geração de código Código de máquina é gerado Interpretação Pura Sem tradução Fácil implementação de programas (erros de execução podem ser facilmente e rapidamente mostrados) Execução lenta (de 10 a 100 vezes mais lenta do que programas compilados) Geralmente requer mais espaço Cada vez mais raro em linguagens de alto-nível Embora não seja uma linguagem simples, JavaScript é puramente interpretado Implementação Híbridos Meio-termo entre compilador e interpretador puro Um programa em uma linguagem de alto-nível é traduzido para uma linguagem intermediária que permite fácil interpretação Mais rápido do que interpretação pura Exemplos Programas em Perl são parcialmente compilados para detectar erros antes da interpretação Implementações de Java: bytecode Métodos de Implementação Sistemas Just-in-Time Inicialmente traduz os programas para uma linguagem intermediária Compila os métodos da linguagem intermediária para linguagem de máquina quando esses são chamados A versão em código de máquina é mantida para chamadas subsequentes Sistemas JIT são agora usados amplamente para programas Java As linguagens .NET também são implementadas com um sistema JIT Pré-processadores Macro instruções são normalmente usadas para especificar que um código de outro arquivo deve ser incluído Um pré-processador processa um programa imediatamente antes do programa ser compilado, expandindo as macros Um exemplo: pré-processador C expande #include, #define, entre outras Ambientes de Programação Uma coleção de ferramentas usadas no desenvolvimento de software UNIX Um sistema operacional e um conjunto de ferramentas Atualmente, normalmente usada através de uma GUI (exemplos: CDE, KDE ou GNOME) que roda em cima do UNIX NetBeans Um ambiente integrado de desenvolvimento para Java Microsoft Visual Studio.NET Um grande e complexo ambiente Usado para programar C#, Visual BASIC.NET, JScript, J# ou C++
Compartilhar