Linguagens de Programação 1 – Introdução Vítor E. Silva Souza ([email protected]) http://www.inf.ufes.br/~vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Este obra foi licenciada sob uma Licença Creative Commons Atribuição 3.0 Não Adaptada. Conteúdo do curso • • • • • Introdução; Amarrações; Valores e tipos de dados; Variáveis e constantes; Expressões e comandos; • • • • • Modularização; Polimorfismo; Exceções; Concorrência; Avaliação de linguagens. • Estes slides foram baseados em: – Slides do prof. Flávio M. Varejão; – Livro “Linguagens de Programação – Conceitos e Técnicas” (Varejão); – Livro “Linguagens de Programação – Princípios e Paradigmas, 2a edição” (Tucker & Noonan). Agosto 2014 Linguagens de Programação -­‐ Introdução 2 Por que estudar LPs • Maior capacidade de desenvolver soluções computacionais para problemas; • Maior habilidade ao usar uma LP; • Maior capacidade para escolher LPs apropriadas; • Maior habilidade para aprender novas LPs; • Maior habilidade para projetar novas LPs. Agosto 2014 Linguagens de Programação -­‐ Introdução 3 Contexto Processo de Desenvolvimento de Software Agosto 2014 Linguagens de Programação -­‐ Introdução 4 Papel das LPs no PDS • O objetivo de LPs é tornar mais efetivo o processo de desenvolvimento de software (PDS); • PDS visa geração e manutenção de software de modo produtivo e garantia de padrões de qualidade; • Principais Propriedades Desejadas em um Software: – Confiabilidade; – Manutenibilidade; – Eficiência. Agosto 2014 Linguagens de Programação -­‐ Introdução 5 Papel das LPs no PDS • Requisitos: análise da viabilidade tecnológica; • Projeto: utilização de métodos e modelos adequados à linguagem; • Implementação: papel essencial da LP; • Validação: podem facilitar o processo (ex.: depuradores); • Manutenção: modularização, legibilidade, etc. influenciam. Agosto 2014 Linguagens de Programação -­‐ Introdução 6 Objetivos de projeto • Segundo Tucker & Noonan: – Simplicidade e legibilidade: fácil de escrever, ler, aprender, ensinar; – Clareza nas ligações (amarrações, parte 2 do curso); – Confiabilidade: tratamento de exceções, restringir vazamento de memória, tipagem forte, sintaxe/semântica bem definidas, verificação & validação; – Suporte: compiladores acessíveis (baratos, muitas plataformas), cursos, livros, comunidade; – Abstração: não ter que reinventar a roda; Agosto 2014 Linguagens de Programação -­‐ Introdução 7 Objetivos de projeto • Segundo Tucker & Noonan (continua): – Ortogonalidade: menor número de regras excepcionais possível, cidadãos de primeira classe; – Implementação eficiente: implementações iniciais de Java, Ada e Algol sofreram críticas. Agosto 2014 Linguagens de Programação -­‐ Introdução 8 Propriedades desejáveis em LPs • Segundo Varejão: – Legibilidade; – Redigibilidade; – Confiabilidade; – Eficiência; – Facilidade de aprendizado; – Modificabilidade; – Reusabilidade; – Portabilidade. Agosto 2014 Linguagens de Programação -­‐ Introdução 9 Legibilidade • Marcadores de bloco: if (x > 1) if (x == 2) x = 3; else x = 4; • Desvios incondicionais: goto; • Duplicação de significado de vocábulos: – Java: this; – C/C++: *p = (*p)*q; Agosto 2014 Linguagens de Programação -­‐ Introdução 10 Legibilidade • Efeitos colaterais: int x = 1; int retornaCinco() { x = x + 3; return 5; } void main() { int y; y = retornaCinco(); y = y + x; } Agosto 2014 Linguagens de Programação -­‐ Introdução 11 Redigibilidade • Tipos de Dados Limitados (FORTRAN); • Ausência de Tratamento de Exceções; • Conflito Ocasional com Legibilidade: void f(char *q, char *p) { for (;*q=*p; q++,p++); } O que faz o código acima? Agosto 2014 Linguagens de Programação -­‐ Introdução 12 Confiabilidade • Declaração de tipos: boolean u = true; int v = 0; while (u && v < 9) { v = u + 2; if (v == 6) u = false; } Algo de errado no código acima? Em Java, compila? E em C? Agosto 2014 Linguagens de Programação -­‐ Introdução 13 Tratamento de exceções // Abre uma conexão com um banco de dados. Connection conn = null; try { Class.forName(driver); conn = DriverManager.getConnection(url, usu, senha); } catch (ClassNotFoundException | SQLException ex) { System.out.println("Problemas ao abrir conexão..."); } return conn; Separa o código de tratamento de erro. Agosto 2014 Linguagens de Programação -­‐ Introdução 14 Eficiência • Verificação dinâmica de tipos; • Controle de índice de vetor: – Java o faz; – C/C++ não. Agosto 2014 Linguagens de Programação -­‐ Introdução 15 Facilidade de aprendizado • Excesso de características pode ser prejudicial: c = c + 1; c+=1; c++; ++c; • C++ vs. Java: – Herança múltipla; – Herança pública e privativa; – Ligação tardia ativada ou desativada; – Qual linguagem é mais fácil de aprender? Agosto 2014 Linguagens de Programação -­‐ Introdução 16 Modificabilidade • Uso de constantes: const float pi = 3.14; • Em C, pi seria de fato constante? • E em C++? Agosto 2014 Linguagens de Programação -­‐ Introdução 17 Reusabilidade • Criação de bibliotecas de função: void troca (int *x, int *y) { int z = *x; *x = *y; *y = z; } • Frameworks e plataformas de desenvolvimento. Agosto 2014 Linguagens de Programação -­‐ Introdução 18 Portabilidade • Rigor no projeto; • Pode constrastar com eficiência. Agosto 2014 Linguagens de Programação -­‐ Introdução 19 Especificação de LPs • Três componentes: léxico, sintaxe e semântica: • Por exemplo: a = b; – Léxico: a, =, b, ; fazem parte da linguagem; – Sintaxe: a seguido de =, seguido de b, seguido de ; é um comando válido de atribuição; – Semântica: o valor de b deve ser copiado para a posição de memória definida por a. Agosto 2014 Linguagens de Programação -­‐ Introdução 20 Especificação de LPs • Sintaxe é geralmente definida em BNF: <expressão> ::= <valor> | <valor><operador><expressão> <valor> ::= <número> | <sinal><número> <número> ::= <semsinal> | <semsinal>.<semsinal> <semsinal> ::= <dígito> | <dígito><semsinal> <dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <sinal> ::= + | <operador> ::= + | - | / | * Esse assunto será retomado na disciplina de Compiladores. Agosto 2014 Linguagens de Programação -­‐ Introdução 21 Especificação de LPs • Semântica: – Descrição informal em linguagem natural; – Enfoque operacional: usar LP mais elementar. • Necessidade de padronização: – ISO, IEEE, ANSI, NIST, etc.; – Auxilia na portabilidade e na aceitação da LP; – Timing é importante. Exemplos: ANSI/ISO Cobol 2002, ISO Fortran 2004, ISO Haskell 1998, ISO Prolog 2000, ANSI/ISO C 1999, ANSI/ISO C++ 2003, ANSI/ISO Ada (2005), ANSI Smalltalk 2002, ISO Pascal 1990. Agosto 2014 Linguagens de Programação -­‐ Introdução 22 Implementação de LPs • Compilação, interpretação ou híbrido? • Compilação: Agosto 2014 Linguagens de Programação -­‐ Introdução 23 Implementação de LPs • Interpretação: Agosto 2014 Linguagens de Programação -­‐ Introdução 24 Implementação de LPs • Híbrido: Agosto 2014 Linguagens de Programação -­‐ Introdução 25 Implementação de LPs • Compilação: – Eficiência; – Problemas com portabilidade e depuração; • Interpretação pura: – Flexibilidade, portabilidade, facilidade para prototipação e depuração; – Problemas com eficiência e maior consumo de memória; – Raramente usada; • Híbrido: – Une vantagens (e desvantagens) dos outros métodos; – JVM, JIT-­‐compiler. Agosto 2014 Linguagens de Programação -­‐ Introdução 26 Paradigmas de LPs • Segundo Varejão: Paradigmas de LPs Imperativo Estruturado Declarativo Concorrente Funcional Lógico Orientado a objetos Agosto 2014 Linguagens de Programação -­‐ Introdução 27 Paradigmas de LPs • Segundo Tucker & Noonan, há quatro paradigmas: – Imperativo; – Orientado a objetos; – Funcional; – Lógico. • Outras características tratadas como tópicos especiais: – Manipulação de eventos; – Concorrência; – Correção (especificação formal). Agosto 2014 Linguagens de Programação -­‐ Introdução 28 Paradigma imperativo • • • • Processo de mudança de estados; Variável, valor e atribuição; Células de memória; Arquitetura de von Neumann-­‐Eckert: entrada-­‐ processamento-­‐saída. Agosto 2014 Linguagens de Programação -­‐ Introdução 29 Paradigma estruturado • • • • • Refinamentos sucessivos; Blocos aninhados de comandos; Desestímulo ao uso de desvio incondicional; Abordagem top-­‐down, organizando o fluxo de controle. Exemplos: Pascal, C, Fortran, Cobol, Perl, etc. Agosto 2014 Linguagens de Programação -­‐ Introdução 30 Paradigma Orientado a Objetos • Abstração, encapsulamento, modularização; • Herança e polimorfismo; • Exemplos: Smalltalk, Java, C++, C#, Python, etc. Agosto 2014 Linguagens de Programação -­‐ Introdução 31 Paradigma declarativo • Especificação sobre a tarefa a ser realizada; • Abstrai-­‐se como o computador é implementado; • “Faça isso” (imperativo) vs. “É preciso chegar neste estado” (sem dizer como, declarativo); • Em alguns aspectos mais próximo do que aprendemos na matemática, por exemplo: x = x + 1 – Atribuição ou equação sem solução? Agosto 2014 Linguagens de Programação -­‐ Introdução 32 Paradigma funcional • Programa composto por funções; • Funções compostas por outras funções; • Exemplos: Lisp, Haskell. (defun fatorial (n) (if (= n 0) 1 (* n (fatorial (- n 1))))) Agosto 2014 Linguagens de Programação -­‐ Introdução 33 Paradigma lógico • Dedução automática, baseado em regras; • Cláusulas definem predicados e relações factuais; • Exemplo: Prolog. % Fatos: progenitor(maria,joao). progenitor(jose,joao). progenitor(joao,mario). % Regras: descendente(Y,X) :- progenitor(X,Y). descendente(Y,X) :- progenitor(A,Y), descendente(A,X). % Questões: q1 :- descendente(mario,jose). Agosto 2014 Linguagens de Programação -­‐ Introdução 34 Evolução das LPs • Dificuldade de programação em linguagem de máquina; • Foco de primeiras LPs era eficiência de processamento e consumo de memória; • A medida que o hardware evoluiu, o foco mudou para a baixa produtividade de programação, surgindo: – Programação estruturada; – Tipos abstratos de dados; – Orientação a objetos. Agosto 2014 Linguagens de Programação -­‐ Introdução 35 Origem das LPs • Fortran (Formula Translator) – 1957, IBM: – Aplicações numéricas; – Eficiência computacional (ex.: não há alocação dinâmica); • Lisp (List Processor) – 1959, MIT: – Programação funcional; – Processamento simbólico (IA); – Common Lisp, Scheme; Agosto 2014 Linguagens de Programação -­‐ Introdução 36 Origem das LPs • Algol (Algorithmic Language) – 1960, ETH Zurich: – Programação estruturada; – 1ª LP com sintaxe formal definida; – Importância teórica (ALGOL-­‐like); • Cobol (Common Business Oriented Lang.) – 1960, DoD: – Aplicações comerciais; – Muitos dados, pouca computação; • Basic – 1964, Darthmouth University: – Ensino para leigos; – Estudantes de artes e ciências humanas; – Precursora do Visual Basic, da Microsoft; Agosto 2014 Linguagens de Programação -­‐ Introdução 37 Origem das LPs • Pascal – 1964, Niklaus Wirth (Stanford University): – Ensino de programação estruturada; – Simplicidade; – Precursora do Object Pascal e Delphi; • C – 1972, Dennis Ritchie (AT&T Bell Labs): – Desenvolvimento de SOs / Unix; – Precursora do C++; • Prolog – 1972, Unv. Aix-­‐Marselha / Univ. Edinburgo: – Programação lógica; – Inteligência artificial; Agosto 2014 Linguagens de Programação -­‐ Introdução 38 Origem das LPs • Smalltalk – 1972, Xerox PARC: – Programação OO (1ª LP OO pura); – Inovações em GUIs; • Ada (Lovelace) – 1983, DoD: – Programação concorrente; – Centenas de pessoas envolvidas durante 8 anos; – Grande e complexa; – Sistemas de tempo real; • C++ – 1985, Bjarne Stroustrup (AT&T Bell Labs): – Disseminação da programação OO; – Linguagem complexa. Agosto 2014 Linguagens de Programação -­‐ Introdução 39 Origem das LPs • Java – 1995, James Gosling (Sun Microsystems): – Hoje pertence à Oracle; – Criada com foco na Internet; – Mais simples e confiável que C++; • Linguagens modernas: • • • • • Agosto 2014 C#; Groovy; Go; Haskell; Lua; • • • • • Perl; PHP; Python; Ruby; Scala; Linguagens de Programação -­‐ Introdução • Shell Script; • Swift; • E muitas outras... 40 Origem das LPs Agosto 2014 Linguagens de Programação -­‐ Introdução 41 http://nemo.inf.ufes.br/ Agosto 2014 Linguagens de Programação -­‐ Introdução 42