Baixe o app para aproveitar ainda mais
Prévia do material em texto
Paradigmas de Programação UNIFACS Prof. Sergio Martins Fernandes sergio.fernandes@unifacs,br 71 99958-0897 (WhatsApp) Sobre a disciplina • Objetivos – Apresentar os conceitos fundamentais de linguagens de programação – Fornecer elementos que permitam avaliar uma linguagem de programação, bem como a sua aplicabilidade de acordo com a natureza do problema • Ementa – Visão Geral Sobre o Tema; – Evolução das Principais Linguagens de Programação; – Nomes, Vinculações, Verificação de Tipos e Escopos; – Tipos de Dados; – Expressões e Instruções de Atribuição; – Estruturas de Controle; – Subprogramas; – Tipos de Dados Abstratos; – Programação Orientada a Objeto; – Programação Funcional; – Programação Lógica, Bibliografia básica Avaliações • Avaliação intermediária – Prova individual (valendo 8) + trabalho em dupla (valendo 2) • Avaliação de final de período – Prova individual (valendo 8) + trabalho em dupla (valendo 2) Paradigmas de Linguagens de Programação – Sergio Fernandes Roteiro da Aula • Introdução • Plankalkül de Zuse • Programação de hardware mínima: pseudocódigos • O IBM 704 e Fortran • Programação funcional: LISP • O primeiro passo em direção à sofisticação: ALGOL 60 • Informatizando os registros comerciais: COBOL • Programação de Sistemas: C • Tudo para todos: PL/I • Linguagem dinâmica: APL • O início da abstração de dados: SIMULA 67 • Projeto ortogonal: ALGOL 68 • Programação baseada em lógica: Prolog • Programação orientada a objetos: Smalltalk • Combinando recursos imperativos e orientados a objetos: C++ • Uma linguagem orientada a objetos baseada no paradigma imperativo: Java • Linguagens de scripting • Uma linguagem baseada em C para o novo milênio: C# • Linguagens híbridas de marcação/programação Computador ENIAC – novembro 1945 • Electronic Numerical Integrator and Computer • 18 mil válvulas • 70 mil resistores • 10 mil capacitores • 6 mil switches • 1500 relays • 162 m2 • 5000 operações por segundo Paradigmas de Linguagens de Programação – Sergio Fernandes Contexto •Computadores dos anos 40 e 50 eram MUITO menos utilizáveis que os atuais – Lentos, não confiáveis, caros, memórias extremamente pequenas, – Sem software para suportar a programação – Programação feita exclusivamente em código de máquina • Tedioso • Sujeito a erros • Baixa legibilidade • Uso de endereços absolutos de memória – Caso o programa foi alterado, com inclusão ou exclusão de linhas, todos os endereços tinham que ser modificados Paradigmas de Linguagens de Programação – Sergio Fernandes Genealogia das principais linguagens de programação Paradigmas de Linguagens de Programação – Sergio Fernandes Por que tantas linguagens? • Propósitos diferentes • Avanços tecnológicos • Interesses comercias • Cultura e conhecimento científico 9 Evolução centrada em níveis crescentes de abstração • Linguagens de máquina – Endereços físicos e códigos de operações • Linguagens Assembly (de montagem) – Mnemônicos e labels (rótulos) simbólicos • Linguagens de “alto nível” – Variáveis e atribuição (versus acesso direto à memória) – Estruturas de dados (versus estruturas de armazenamento) 10 Linguagens de máquina • Programacão em linguagens de máquina üUma forma de escrever um programa é atribuir um valor binário a cada instrução e representar o programa como uma sequência dessas instruções binárias üUm programa desse tipo é chamado Programa em Linguagem de Máquina, ou programa objeto Exemplo: 0011 1110 ; Carregue o registrador A com o 0000 0101 ; valor 5 0000 0110 ; Carregue o registrador B com o 0000 0110 ; valor 10 1000 0000 ; A <- A + B 0011 1010 ; armazene o resultado 0110 0100 ; na posição de memória 0000 0000 ; cujo endereço é 100 0110 0110 ; encerre o processamento Linguagem de programação de montagem (assembly) • Uso de símbolos na programação para melhorar a legibilidade • Dar nomes simbólicos a cada instrução • Esses nomes são chamados mneumônicos e um programa escrito usando esses símbolos é chamado programa em linguagem de máquina Exemplo: • LOAD A, 5 ; load reg A com 5 • LOAD B, 10 ; load reg B com 10 • ADD A, B ; A = A + B • LOAD (100), A ; salvar o resultado no end. 100 • HALT ; Encerrrar o processamento Paradigmas de Linguagens de Programação – Sergio Fernandes Evolução centrada em níveis crescentes de abstração – Estruturas de controle (versus jumps e gotos) – Estrutura de blocos como forma de encapsulamento – Generalização e parametrização (abstração de tipos de valores) 15 Plankalkül de Zuse • Plankalkül = programas de cálculos em alemão • Autor da linguagem: Konrad Zuse • Desenvolvida em 1945, mas não publicada até 1972 • Nunca foi implementada • Estruturas de dados avançadas – Ponto flutuante, vetores, registros (que poderiam incluir registros aninhados) • Comando semelhante ao FOR (iteração) • A descrição da linguagem contemplava também diversos algoritmos escritos em Plankalkül – Ordenação de vetores de números – Operações com inteiros e ponto flutuante, inclusive raiz quadrada – ... Paradigmas de Linguagens de Programação – Sergio Fernandes Sintaxe de Plankalkül • Sentenças em Plankalkül possuiam duas a três linhas de código • Uma sentença de atribuição que atribui o valor da expressão A[4] + 1 para A[5] | A + 1 => A V | 4 5 (índices) S | 1.n 1.n (tipos de dados) Paradigmas de Linguagens de Programação – Sergio Fernandes Programação de Hardware Mínima: Pseudocódigos • Pseudocódigo é o nome genérico de linguagens de programação surgidas no final dos anos 40, começo dos anos 50 – Não o significado que atualmente se atribui ao termo • Antes das linguagens Pseudocódigo: O que estava errado ao usar código de máquina? – Baixa legibilidade • Instruções eram especificadas através de códigos numéricos • Exemplo: código 14 = Add – Endereçamento de memória em termos absolutos tornava as modificações de programas tediosas e passíveis de erros • Inserir uma instrução no meio do programa tornavam necessário corrigir os endereços referenciados por todas as outras instruções subsequentes – Deficiências de máquina – sem indexação ou ponto-flutuante • Recursos necessários pela maior parte dos programas da época • Motivação para o desenvolvimento de linguagens um pouco mais alto nível Paradigmas de Linguagens de Programação – Sergio Fernandes Pseudocódigos: Short Code • Short Code foi desenvolvida por John Mauchly em 1949 para o computador BINAC – Posteriormente portada para o UNIVAC 1, o primeiro computador comercial vendido nos Estados Unidos – Expressões foram codificadas • E não mais escritas em código binário de baixo nível • Exemplo: 01 - 06 abs value 1n (n+2)nd power 02 ) 07 + 2n (n+2)nd root 03 = 08 pause 4n if <= n 04 / 09 ( 58 print and tab – Variáveis eram denominadas em códigos de dois bytes (X0, Y0, por exemplo) – A Linguagem era interpretada, não compilada, o que a tornava 50 vezes mais lenta que a execução em código de máquina – Exemplo: • Dadas as variáveis X0 e Y0, a expressão X0 = SQRT(ABS(Y0)) seria codificada assim 00 X0 03 20 06 Y0 Paradigmas de Linguagens de Programação – Sergio Fernandes Pseudocódigos: Speedcoding • Speedcoding foi desenvolvido por John Backus em 1954 para o IBM 701 – Transformava o computador numa calculador virtual de ponto flutuante de 3 endereços • Resolvia problema fundamental das linguagens de máquina – Pseudoinstruções para operações aritméticas e funções matemáticas – Desvios condicionais e incondicionais – Facilidade para incrementar os registradores de endereço automaticamente – Memória usável restante após carregar o interpretador de apenas 700 palavrasParadigmas de Linguagens de Programação – Sergio Fernandes Pseudocódigos: Trabalhos relacionados • O sistema de “compilação” da UNIVAC – Desenvolvido por uma equipe liderada por Grace Hopper – Pseudocódigo expandido em código de máquina • Da mesma forma que as macros são expandidas em linguagem de montagem – Abordava baixo desempenho das linguagens interpretadas pseudocódigo • David J. Wheeler (Universidade de Cambridge) – Desenvolveu um método de usar blocos de endereços realocáveis para resolver parcialmente o problema do endereçamento absoluto Paradigmas de Linguagens de Programação – Sergio Fernandes IBM 704 e Fortran • Fortran 0: 1954 – não implementado • Fortran I: 1957 – Primeira linguagem de alto nível, compilada, para ambiente comercial – Desenvolvido para o IBM 704, que tinha registros de indexação e cálculo de ponto-flutuante em hardware • Até então, cálculo de operações de ponto flutuante era efetuado em software – Isso demandava um tempo enorme, em relação a qual o tempo gasto com a interpretação do código se tornava insignificante – por isso a demanda por compilação das linguagens não era significativa – Levou à ideia de linguagens de programação compiladas, porque não havia o “esconderijo” para o custo da interpretação – Ambiente no qual a linguagem Fortran foi desenvolvida: • Computadores com memórias pequenas, e não confiáveis • Aplicações eram científicas • Não havia maneiras eficientes de programar computadores • Velocidade do código objeto era o objetivo principal – Pois o custo dos computadores era muito superior ao custo dos programadores Paradigmas de Linguagens de Programação – Sergio Fernandes Visão geral de Fortran I • Primeira versão implementada do Fortran – Nomes de variáveis podem ter até seis caracteres – Sentença de repetição (DO) – Formatação de entrada e saída – Sub-rotinas definidas pelos usuários – Sentença de seleção IF – Não há declaração de tipos de variáveis • Variáveis cujo nome começa com i, j, k, l, m, n são inteiras • As demais são de ponto flutuante Paradigmas de Linguagens de Programação – Sergio Fernandes Visão geral de Fortran I • Primeira versão implementada do FORTRAN – Sem compilação separada para os subprogramas – Compilador lançado em abril de 1957 – Programas com mais de 400 linhas raramente são compilados corretamente, especialmente devido à pouca confiabilidade do 704 – O código era muito rápido – para a época – Rapidamente se tornou amplamente usada Paradigmas de Linguagens de Programação – Sergio Fernandes Fortran II • Distribuído em 1958 – Compilação independente de subrotinas / subprogramas • Evolução mais importante, porque, sem esse recurso, qualquer alteração em um programa implicaria em que todo ele deveria ser recompilado • Essa capacidade reduziu consideravelmente o processo de compilação – Muito relevante, devido também ‘a baixa confiabilidade do hardware – Corrigiu falhas Paradigmas de Linguagens de Programação – Sergio Fernandes Fortran IV • Evoluiu entre 1960-62 – Declarações de tipo explícitas – Sentenças de controle de laços lógicos (if) – Nomes de subprogramas podem ser parâmetros – Padrão ANSI em 1966 Fortran 77 • Tornou-se o novo padrão em 1978 – Manipulação de cadeias (strings) de caracteres – Sentenças de controle de laços lógicos – Um If com uma cláusula opcional Else Exemplo de código em Fortran 77 SUBROUTINE SUB1(X,DUMSUB) INTEGER N, X, Y EXTERNAL DUMSUB COMMON /GLOBALS/ N Y = 0 IF(X .LT. N)THEN X = X + 1 Y = X**2 PRINT *, 'x = ', X, ', y = ', Y CALL DUMSUB(X,DUMSUB) PRINT *, 'x = ', X, ', y = ', Y END IF END • Exemplo de código PROGRAM MAIN INTEGER N, X EXTERNAL SUB1 COMMON /GLOBALS/ N X = 0 PRINT *, 'Enter number of repeats' READ (*,*) N CALL SUB1(X,SUB1) END Paradigmas de Linguagens de Programação – Sergio Fernandes Fortran 90 • Drasticamente diferente do Fortran 77 – Módulos – Vetores dinâmicos • A alocação dinâmica é feita em tempo de execução • Isto permite que o espaço em memória seja alocado apenas quando necessário • Além disso, a alocação dinâmica permite aumentar ou até diminuir a quantidade de memória alocada. – Ponteiros – Registros – Sentença CASE – Parâmetro de verificação de tipo • Houveram versões posteriores ao Fortran 90, mas alterações não foram muito significativas Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação de Fortran • Compiladores altamente otimizados (todas as versões antes de 90) – Tipos e armazenamento para todas as variáveis são fixados antes da execução • Mudou drasticamente para sempre a forma como os computadores são usados • Caracterizada como a língua franca do mundo da computação Paradigmas de Linguagens de Programação – Sergio Fernandes O Primeiro Passo em Direção à Sofisticação: ALGOL • Ambiente de desenvolvimento – FORTRAN chegou (apenas) para IBM 700 – Várias outras linguagens foram desenvolvidas, todas para máquinas específicas, e arquiteturas específicas • A comunicação entre os usuários se tornou difícil – Nenhuma linguagem universal para comunicação de algoritmos – Nenhuma linguagem portátil; todas eram dependentes das máquinas • ALGOL foi o resultado dos esforços para criar uma linguagem universal Paradigmas de Linguagens de Programação – Sergio Fernandes Processo do projeto inicial • ACM (americana) e GAMM (européia) se reuniram por quatro dias em Zurique (de 27 de maio a 1º de junho de 1958) • Essa reunião definiu os objetivos da linguagem: – Ser o mais próxima possível da notação padrão matemática – Programas legíveis, com necessidade de pouca explicação adicional – Boa para a descrição de algoritmos em publicações acadêmicas ou da indústria – Ser traduzível em código de máquina Paradigmas de Linguagens de Programação – Sergio Fernandes ALGOL 58 • Descendente do Fortran – Generalizou muitos recursos do Fortran – Adicionou novas construções e conceitos • Para não amarrar a linguagem a nenhuma máquina em particular • Para torná-la mais flexível e poderosa • Formalizou o conceito de tipo de dados • Mas apenas variáveis que não fossem de ponto flutuante deveriam ser explicitamente declaradas • Identificadores podiam ter qualquer tamanho • O limite inferior dos vetores podia ser especificado pelo programador • Sentenças de seleção aninhadas eram permitidas • Declarações compostas (begin ... end) • Vírgula como separador de declarações • Operador de atribuição era := • if tinha uma cláusula else-if Paradigmas de Linguagens de Programação – Sergio Fernandes Implementação do ALGOL 58 • Não pretendia ser um produto finalizado para implementação, mas variações dele foram (MAD, JOVIAL) • Embora a IBM tenha sido inicialmente entusiasta, todo o suporte foi descontinuado em meados de 1959 – Por conta do investimento já efetuado na linguagem Fortran Paradigmas de Linguagens de Programação – Sergio Fernandes Visão geral do ALGOL 60 • Modificação do ALGOL 58 em seis dias de encontros em Paris • Novos recursos – Estrutura de bloco (escopo local) – Duas formas diferentes de passagem de parâmetros a subprogramas • Por nome e por valor – Procedimentos recursivos – Vetores dinâmicos na pilha • Dimensões do vetor definidas em variáveis, e alocação só ocorre em tempo de execução – Ainda sem sentenças de entrada e saída e sem manipulação de strings • Consequentemente, entrada e saída dependentes de implementação Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação do ALGOL 60 • Sucessos – Única maneira formal aceitável de comunicar algoritmos por mais de 20 anos – Todas as linguagens de programação imperativas desde 60 são baseadas nela – Primeira linguagem independente de máquina – Primeira linguagem cuja sintaxe foi formalmentedescrita em Backus-Naur Form (BNF) • Meta linguagem criada naquale momento por Backus e levemente modificada por Naur, para descrição formal de linguagens de programação Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação do ALGOL 60 • Fracassos – Nunca atingiu uso disseminado, especialmente nos Estados Unidos – Motivos • Entrada e saída dependentes de implementação fizeram com que os programas tivessem uma portabilidade ruim • Muito flexível – difícil de implementar • Forte estabelecimento de Fortran • Descrição formal de sintaxe – Hoje vista como um ponto forte da linguagem, mas na época considerada complexa • Falta de apoio da IBM Exemplo de código em ALGOL 60 procedure Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k); value n, m; array a; integer n, m, i, k; real y; comment The absolute greatest element of the matrix a, of size n by m is transferred to y, and the subscripts of this element to i and k; begin integer p, q; y := 0; i := k := 1; for p:=1 step 1 until n do for q:=1 step 1 until m do if abs(a[p, q]) > y then begin y := abs(a[p, q]); i := p; k := q end end Absmax Paradigmas de Linguagens de Programação – Sergio Fernandes Informatizando os Registros Comerciais: COBOL • Ambiente de desenvolvimento – UNIVAC estava começando a usar FLOW-MATIC • Linguagem comercial compilada para aplicações comerciais • Linguagem proprietária da UNIVAC, concorrente da IBM • FLOW-MATIC influenciou a linguagem COBOL – USAF (força aérea americana) estava começando a usar AIMACO – IBM estava desenvolvendo COMTRAN • Havia o design, mas não ainda a implementação Paradigmas de Linguagens de Programação – Sergio Fernandes Perspectiva história do COBOL • Baseado em FLOW-MATIC • Características de FLOW-MATIC – Nomes com mais de 12 caracteres, com hifens – Nomes em inglês para operações aritméticas (sem expressões aritméticas) • Com base na premissa que linguagens científicas deveriam ter notação matemática, e linguagens comerciais deveriam ser notação em inglês – Premissa revolucionária na época – Dados e código eram completamente separados – A primeira palavra em cada sentença era um verbo Paradigmas de Linguagens de Programação – Sergio Fernandes O processo do projeto do COBOL • Primeira reunião (no Pentágono) – Maio de 1959 • Objetivos – Utlizar o inglês o máximo possível – Ser fácil de usar, mesmo ao custo de ser menos poderosa • Ampliar a base de usuários de computador – Não ser orientada pelos problemas atuais do compilador • Membros da comissão do projeto foram fabricantes de computadores e membros do Departamento de Defesa Americano (DoD) Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação do COBOL • Contribuições – Primeira construção para macros de uma linguagem de alto nível • Trecho de código definido num ponto do programa e referenciado em outros pontos • Ao se referenciar a macro, o código definido previamente é incorporado no ponto em que é referenciado, em tempo de compilação – Estruturas de dados hierárquicas (registros) – Sentenças de seleção aninhadas – Nomes longos (até 30 caracteres), com hifens – Divisão de dados (data division) • Nesta divisão são definidos os registros dos arquivos manipulados pelo programa • E variáveis internas, que também podem ser estruturas de dados Paradigmas de Linguagens de Programação – Sergio Fernandes COBOL: influência do DoD • Primeira linguagem requerida pelo DoD – Teria falhado sem o DoD • Pois os primeiros compiladores eram muito ineficientes • Posteriormente os compiladores foram aprimorados • Ainda assim, o idioma mais utilizado em aplicações de negócios Exemplo de código COBOL $ SET SOURCEFORMAT"FREE" IDENTIFICATION DIVISION. PROGRAM-ID. Seq2Rel. AUTHOR. MICHAEL COUGHLAN. * Creates a Relative file from a sequential file. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SupplierFile ASSIGN TO "RELSUPP.DAT" ORGANIZATION IS RELATIVE ACCESS MODE IS RANDOM RELATIVE KEY IS SupplierKey FILE STATUS IS Supplierstatus. SELECT SupplierFileSeq ASSIGN TO "SEQSUPP.DAT" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD SupplierFile. 01 SupplierRecord. 02 SupplierCode PIC 99. 02 SupplierName PIC X(20). 02 SupplierAddress PIC X(50). FD SupplierFileSeq. 01 SupplierRecordSeq. 88 EndOfFile VALUE HIGH-VALUES. 02 SupplierCodeSeq PIC 99. 02 SupplierNameSeq PIC X(20). 02 SupplierAddressSeq PIC X(50). WORKING-STORAGE SECTION. 01 SupplierStatus PIC X(2). 1 SupplierKey PIC 99. Exemplo de código COBOL PROCEDURE DIVISION. Begin. OPEN OUTPUT SupplierFile. OPEN INPUT SupplierFileSeq. READ SupplierFileSeq AT END SET EndOfFile TO TRUE END-READ PERFORM UNTIL EndOfFile MOVE SupplierCodeSeq TO SupplierKey MOVE SupplierRecordSeq TO SupplierRecord WRITE SupplierRecord INVALID KEY DISPLAY "Supplier status = " SupplierStatus END-WRITE READ SupplierFileSeq AT END SET EndOfFile TO TRUE END-READ END-PERFORM. CLOSE SupplierFile, SupplierFileSeq. STOP RUN. Paradigmas de Linguagens de Programação – Sergio Fernandes Programação funcional: LISP • List Processing Language – Projetada no MIT por McCarthy • Pesquisa de inteligência artificial (IA) precisava de uma linguagem para – Processar dados em listas (em vez de vetores) • Mais fácil inserir ou eliminar elementos da lista do que de vetores – Computação simbólica (em vez de numérica) • Algoritmos que manipulam expressões matemáticas / simbólicas – Computação de expressões que contêm variáveis que não possuem valores específicos e são, portanto, manipuladas como símbolos • Apenas dois tipos de dados: átomos e listas • Lista – Especificada pela delimitação dos elementos em parêntesis Paradigmas de Linguagens de Programação – Sergio Fernandes Programação funcional: LISP • Lisp é uma linguagem orientada a expressões simbólicas – Não há distinção entre expressões e comandos – Código e data são escritos como expressões – Expressão avaliada produz um valor, que pode ser embutido em outras expressões • Programação funcional – Todas as computações em um programa puramente funcional são realizadas por meio de aplicações de funções a argumentos • LISP é usada para IA porque suporta manipulação de símbolos e expressões simbólicas • Áreas da IA que demandam computação simbólica – Prova de teoremas – Representação e avaliação de conhecimento – Sistemas especialistas Paradigmas de Linguagens de Programação – Sergio Fernandes Representação interna de duas listas em LISP Representando as listas (A B C D) e (A (B C) D (E (F G))) Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação de LISP • Pioneira na programação funcional – Sem necessidade de variáveis ou atribuição – Controle por recursão e expressões condicionais • Recursão elimina a necessidade de estruturas de laços • Ainda a linguagem dominante em IA • COMMON LISP e Scheme são dialetos contemporâneos de LISP • ML, Miranda e Haskell são linguagens relacionadas Paradigmas de Linguagens de Programação – Sergio Fernandes Exemplo de código LISP • Função para cálculo de fatorial (define factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))))) • Função para reverter uma lista (define -reverse (list) (let ((return-value '())) (dolist (e list) (push e return-value)) return-value)) Paradigmas de Linguagens de Programação – Sergio Fernandes Exemplo de código LISP • Função que compara duas listas e retorna true se forem idênticas ; LISP Example function ; The following code defines a LISP predicate function ; that takes two lists as arguments and returns True ; if the two lists are equal, and NIL (false) otherwise (DEFUN equal_lists (lis1 lis2) (COND ((ATOM lis1) (EQ lis1 lis2))((ATOM lis2) NIL) ((equal_lists (CAR lis1) (CAR lis2)) (equal_lists (CDR lis1) (CDR lis2))) (T NIL) ) ) Paradigmas de Linguagens de Programação – Sergio Fernandes Tudo para todos: PL/I • Desenvolvida por IBM e SHARE • Situação da computação em 1964 (do ponto de vista da IBM) – Aplicação científica • Computadores IBM 1620 e 7090 • FORTRAN • Grupo de usuário SHARE – Aplicação de negócios • Computadores IBM 1401 e 7080 • COBOL • Grupo de usuário GUIDE Paradigmas de Linguagens de Programação – Sergio Fernandes Perspectiva histórica • Em 1963 – Programadores científicos passaram a precisar de recursos mais elaborados de entrada e saída, como COBOL tinha; as aplicações de negócios precisavam de dados de ponto-flutuante e vetores para sistemas de gerenciamento de informação – Começou a parecer que as instalações de computação logo precisariam de duas equipes técnicas e de computadores diferentes • A solução óbvia – Construir um novo computador para fazer os dois tipos de aplicações – Projetar uma nova linguagem para as aplicações Paradigmas de Linguagens de Programação – Sergio Fernandes O processo de projeto • Desenvolvido em cinco meses pelo Comitê 3 x 3 – Três membros da IBM, três membros do SHARE • Projeto inicial – Uma extensão do Fortran IV • Inicialmente chamado de NPL (New Programming Language - Nova Linguagem de Programação) • Nome mudado para PL/I em 1965 Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação de PL/I • Contribuições – Permitido aos programas criar subprogramas executados concorrentemente – Possível detectar e manipular exceções – Permitida a utilização de subprogramas recursivamente – Ponteiros foram incluídos como um tipo de dados – Porções de uma matriz podiam ser referenciadas • Preocupações – Muitos dos novos recursos foram mal concebidos – Muito grande e muito complexa Paradigmas de Linguagens de Programação – Sergio Fernandes Uma das primeiras linguagens dinâmicas: APL • Caracterizada por tipagem dinâmica e alocação dinâmica de armazenamento • Variáveis são essencialmente não tipadas – Uma variável adquire um tipo quando é atribuído um valor a ela • O armazenamento é alocado a uma variável apenas quando é atribuído um valor a ela Paradigmas de Linguagens de Programação – Sergio Fernandes APL: A Programming Language • Projetada na IBM por Ken Iverson, em torno de 1960 • Alta expressividade (grande número de operadores, grande número de operações unitárias em vetores) – Programas difíceis de ler • Influência importante para o desenvolvimento de planilhas eletrônicas, programação funcional e pacotes de funções matemáticas • Ainda em uso; mudanças mínimas Teclado com caracteres especiais APL Paradigmas de Linguagens de Programação – Sergio Fernandes APL: exemplos de código • A função apresentada a seguir calcula todos os números primos entre 1 e R (~R∊R∘.×R)/R←1↓ιR • A seguir, uma função que extrai todas as tags HTML da expressão inicial, apresentando apenas o texto que a expressão formata txt←'<html><body><p>This is ''emphasized'' text</p></body></html>'⎕←{⍵/⍨~{⍵∨≠\⍵}⍵∊'<>'}txt This is emphasized text. Paradigmas de Linguagens de Programação – Sergio Fernandes O Início da abstração de dados: SIMULA 67 • Projetada inicialmente para simulação, na Noruega, por Nygaard e Dahl • Nunca foi muito utilizada • Baseada no ALGOL 60 e no SIMULA I • SIMULA I era voltada exclusivamente para simulações • SIMULA 67 estendeu SIMULA I tornando-se uma linguagem de propósitos gerais • Contribuições – Corrotinas – espécie de subprograma – Classes, objetos e herança • Importante historicamente, como a primeira linguagem orientada a objetos Paradigmas de Linguagens de Programação – Sergio Fernandes Projeto ortogonal: ALGOL 68 • A partir do desenvolvimento continuado do ALGOL 60 • Fonte de uma série de novas ideias (embora a própria linguagem nunca tenha alcançado grande uso) • Projeto baseado no conceito de ortogonalidade – Alguns conceitos primitivos mais o uso irrestrito de mecanismos de combinação – Exemplo: • Conceitos primitivos – tipos de dados definidos pela linguagem • Combinação: criação de estruturas de dados pelos usuários da linguagem – Essas estruturas de dados permitem criar na linguagem abstrações de conceitos / entidades do mundo real – Todas as linguagens criadas posteriormente incorporaram esses recursos Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação do ALGOL 68 • Contribuições – Estruturas de dados definidas pelo usuário • Já citadas – Tipos de referência – Vetores dinâmicos (vetores flex) • Dimensão do vetor definida em tempo de execução, através de alocação dinâmica de valores • Comentários – Menos uso do que o ALGOL 60 – Teve forte influência nas linguagens subsequentes, especialmente Pascal, C e Ada Paradigmas de Linguagens de Programação – Sergio Fernandes Pascal - 1971 • Projetada por Wirth (ex-membro do comitê do ALGOL 68) • Projetada para ser usada como veículo educacional • Pequena, simples, nada realmente novo • O maior impacto foi no ensino de programação – Do meio dos anos 1970 até o fim dos 1990, foi a linguagem mais usada para o ensino de programação Paradigmas de Linguagens de Programação – Sergio Fernandes C - 1972 • Projetada para a programação de sistemas (no Bell Labs, por Dennis Richie) • Evoluída a partir de BCLP, B e ALGOL 68 • Poderoso conjunto de operadores, mas verificação de tipos pobre – Por exemplo, parâmetros passados para funções poderiam não ter os tipos checados • Primeira linguagem de alto padrão implementada no UNIX • Muitas áreas de aplicação • Eficiente, por isso usada em sistemas embarcados Paradigmas de Linguagens de Programação – Sergio Fernandes Programação baseada em lógica: Prolog • Projetada, por Comerauer e Roussel (Universidade de Aix-Marseille), com ajuda de Kowalski (Universidade de Edimburgo) • Não procedural • Pode ser resumida como sendo um tipo de base de dados inteligente • Altamente ineficiente, pequenas áreas de aplicação, como IA Paradigmas de Linguagens de Programação – Sergio Fernandes Programação baseada em lógica: Prolog • A linguagem Prolog comporta fatos, regras, e um mecanismo de inferência • Exemplo – Fatos: • Mother (Joanne, Jake), Father (Vander, Joanne) – Regra: • Grandparent(X, Z) := Parent (X, Y), Parent (Y, Z). • Uma execução do programa poderia consultar algo como • Granfather (Bob, Darcy) Paradigmas de Linguagens de Programação – Sergio Fernandes Programação orientada a objetos: Smalltalk • Projetada na Xerox PARC, inicialmente por Alan Kay, depois por Adele Goldberg • Primeira linguagem de programação a oferecer suporte completo à programação orientada a objetos • Pioneira no design da interface gráfica do usuário Paradigmas de Linguagens de Programação – Sergio Fernandes Combinando recursos imperativos e programação orientada a objetos: C++ • Projetada no Bell Labs por Stroustrup em 1980 • Desenvolvida a partir de C e SIMULA 67 • Facilidades para programação orientada a objetos, emprestadas do SIMULA 67 • Fornece manipulação de exceções • Linguagem grande e complexa, em parte porque suporta programação procedural e orientada a objetos • Cresceu rapidamente em popularidade • Padrão ANSI aprovado em novembro de 1997 • Versão da Microsoft (lançado com .NET em 2002): Managed C++ Paradigmas de Linguagens de Programação – Sergio Fernandes Uma linguagem orientada a objetos baseada no paradigma imperativo: Java • Projetada na Sun no início dos anos 1990 – C e C++ não eram satisfatórios para dispositivos eletrônicos embarcados • Baseada em C++ – Significantemente simplificada – Suporta apenas programaçãoorientada a objetos • Mas tem tipos de dados primitivos – Tem referências, mas não tem ponteiros • Ponteiros apontam para endereços de memória, referências apontam para objetos • Ponteiros podem ser objeto de operações aritméticas (baixa confiabilidade), referências não – Inclui forma simples de controle de concorrência Paradigmas de Linguagens de Programação – Sergio Fernandes Avaliação de Java • Eliminou muitos recursos inseguros de C++ • Suporta concorrência • Bibliotecas de classes para interfaces gráficas com o usuário, acesso a bases de dados e redes • Portabilidade: Máquina Virtual Java (JVM), compiladores Just-in-Time (JIT) • Amplamente usado para programação Web • Uso aumentou mais rapidamente do que qualquer linguagem anterior Paradigmas de Linguagens de Programação – Sergio Fernandes Uma Linguagem baseada em C Para o Novo Milênio: C# • Parte da nova plataforma de desenvolvimento .NET (2000) • Baseada em C++ , Java e Delphi • Fornece uma linguagem para o desenvolvimento de software baseado em componentes • Todas as linguagens do .NET usam o chamado Common Type System (CTS – Sistema de Tipos Comum), que fornece uma biblioteca de classes comum Paradigmas de Linguagens de Programação – Sergio Fernandes Linguagens de Scripting • Linguagens de scripting – Linguagem de programação que suporta scripts – Script • Programa escrito para ambiente de execução específico que pode interpretar (em vez de compilar) e automatizar a execução de tarefas – Que poderiam, alternativamente, ser executadas uma por uma por um operador humano Paradigmas de Linguagens de Programação – Sergio Fernandes Linguagens de Scripting para Web • Perl – Desenvolvida por Larry Wall — lançada primeiro em 1987 – Variáveis são estaticamente tipadas e implicitamente declaradas – Três espaços de nomes distintos para variáveis, denotados pelo primeiro caractere de nomes de variáveis – Teve uso difundido para programação CGI na Web – Também usado como ferramenta de administração de sistema em UNIX Paradigmas de Linguagens de Programação – Sergio Fernandes Linguagens de Scripting para Web • Perl – Desenvolvida por Larry Wall — lançada primeiro em 1987 – Evoluiu muito, e hoje está próxima de uma linguagem de programação convencional • É compilada • Tem todos os recursos para que seja aplicável a diversos contextos computacionais – Variáveis são estaticamente tipadas e implicitamente declaradas – Três espaços de nomes distintos para variáveis, denotados pelo primeiro caractere de nomes de variáveis – Teve uso difundido para programação CGI na Web – Também usado como ferramenta de administração de sistema em UNIX Paradigmas de Linguagens de Programação – Sergio Fernandes Linguagens de Scripting para Web • JavaScript – Começou na Netscape, mas depois se tornou um projeto conjunto da Netscape com a Sun Microsystems – Permite aos documentos HTML validarem dados de entrada e requisitarem a execução de programas no servidor; usado na criação de documentos HTML dinâmicos – Puramente interpretada – Relacionado ao Java somente por meio de sintaxe similar Paradigmas de Linguagens de Programação – Sergio Fernandes Linguagens de Scripting para Web • PHP – PHP: Hypertext Preprocessor (Processador de Hipertexto), projetado por Rasmus Lerdorf – Linguagem de scripting do lado do servidor embutida em HTML, geralmente utilizados para processamento de formulários e acesso de dados pela Web – Puramente interpretada – HíbridaL suporta conceitos de orientação a objetos mas também programação estrutural • Python – Linguagem de scripting orientada a objetos – Com verificação de tipos, mas tipada dinamicamente – Usada para programação em CGI e administração de sistemas – Suporta listas, tuplas e dicionários Paradigmas de Linguagens de Programação – Sergio Fernandes Linguagens de Scripting para Web • Ruby – Projetada no Japão por Yukihiro Matsumoto (também conhecido como “Matz”) – Começou como um substituto para Perl e Python – Linguagem de scripting orientada a objetos pura • Todos os dados são objetos – A maioria dos operadores são implementados como métodos, que podem ser redefinidos pelo código do usuário – Puramente interpretada
Compartilhar