Evolução e Futuro das Linguagens de Programação Alessandro Vasconcelos Gladstone Ferreira Seminário de Engenharia de Software e Linguagens de Programação Motivação! Num mundo com computadores cada vez mais velozes, o que ainda afeta a produtividade? Porque existem tantas linguagens de programação? Daqui a 10, 20, ou 100 anos, em que linguagem você estará programando? {avfl, gfn}@cin.ufpe.br 2 Roteiro A questão da Produtividade A historia no passar das décadas A árvore evolucionaria da linguagens As linguagens do futuro {avfl, gfn}@cin.ufpe.br 3 A questão da Produtividade O hardware já é suficientemente poderoso por si só! A produtividade se centra no Programador: Escrever programas corretamente Escrever programas rapidamente Escrever programas facilmente {avfl, gfn}@cin.ufpe.br 4 Como Aumentar a Produtividade Através de um Processo (ES) Através de Ferramentas Bons processos podem aumentar a produtividade em 20%* Verificações, Análises, Geração de Código Boas ferramentas podem aumentar a produtividade em 10%* Através da Linguagem de Programação Abstrações, mecanismos, serviços, garantias Esse é o aspecto que mais influi chegando a aumentar a produtividade em mais de 100% * * Segundo o Software Productivity Research {avfl, gfn}@cin.ufpe.br 5 Por que tantas Linguagens de Programação? Por que algumas pessoas falam inglês e outras português? Linguagens de programação são desenvolvidas com diferentes objetivos, para diferentes tipos de programas, por diferentes pessoas {avfl, gfn}@cin.ufpe.br 6 Os Paradigmas Imperativo Funcional Ênfase na estrutura de dados e na atribuição dos valores. Dependência explícita da arquitetura de Von Neumann Ênfase nos valores manipulados, e não na forma de armazenamento. Orientado a Objetos Ênfase sobre os objetos e a troca de mensagens entre esses. {avfl, gfn}@cin.ufpe.br 7 Um Pouco de História! Década de 40 Os primeiros computadores eletrônicos eram monstruosos A programação era em código binário A manutenção era difícil: As válvulas queimavam regularmente {avfl, gfn}@cin.ufpe.br 9 Início da década de 50 Linguagens Assembly Permitia programas maiores, reusáveis, e re-alocáveis. O código de máquina era produzido por um Assembler Correspondência um-pra-um entre o código assembly e o código da máquina Posteriormente surgiram os macros {avfl, gfn}@cin.ufpe.br 10 Meio da Década de 50 Surge FORTRAN É considerada a primeira linguagem de alto-nível. Desenvolvimento independente da plataforma Aplicada na solução de problemas na ciência e na engenharia Outras linguagens da época: Algol58, Cobol, Lisp, Basic {avfl, gfn}@cin.ufpe.br 11 Década de 60 Fortalecimento da Programação Estruturada Pascal Sem go to! Fortemente tipada Procedimentos alinhados Simula Primeira linguagem com objetos, classes e subclasses {avfl, gfn}@cin.ufpe.br 12 Década de 70 (1/2) C Sucessora de B, que veio de BCPL Construções de alto-nível Ada Incentivada pelo Departamento de Defesa Usada em programação de sistemas embarcados {avfl, gfn}@cin.ufpe.br 13 Década de 70 (2/2) SmallTalk Rica graficamente Orientada a Objetos GUI Fontes Objetos se comunicam via troca de mensagens Prolog Baseada em regras, fatos, e buscas {avfl, gfn}@cin.ufpe.br 14 Década de 80 C++ Primeira linguagem Orientada a objetos amplamente adotada. Implementada como um pré-processador para o compilador C Haskel Avaliação Preguiçosa Polimorfismo Paramétrico Inferência de Tipos {avfl, gfn}@cin.ufpe.br 15 Década de 90 O estouro da Internet! HTML A linguagem da World Wide Web É uma linguagem de marcação, e não de programação Linguagens Script São as chamadas linguagens interpretadas Perl, JavaScript, VBScript {avfl, gfn}@cin.ufpe.br 16 Década de 90 Java Orientada a objetos, compilada e interpretada (bytecodes) 1996 – Java 1.0 1997 – Java 1.1 e 1.2 (Swing, Collection) 1998 – Java 1.2 final 2000 – Java 1.3 final {avfl, gfn}@cin.ufpe.br 17 Década 2000 Java XML 2004 – Java 1.5 (tipos parametrizados, enumeradores) Padrão de integração Microsoft .NET Múltiplas linguagens C++, C#, Visual Basic, Cobol, Fortran Uma máquina virtual comum {avfl, gfn}@cin.ufpe.br 18 O que o futuro nos reserva? Árvore Evolucionária das Linguagens de Programação (1/2) Como as espécies vivas, as linguagens possuem uma história facilmente categorizada em forma de árvores evolucionárias, com “galhos” que não podem mais se ramificar. A evolução das linguagens difere da evolução das espécies porque alguns ramos podem convergir. Objetivo dessa abordagem: aproximarmos dos ramos principais da arvore evolucionária das linguagens, para encontrar as linguagens com chances de futuro. {avfl, gfn}@cin.ufpe.br 20 Árvore Evolucionária das Linguagens de Programação (2/2) {avfl, gfn}@cin.ufpe.br 21 Mas… Nós ainda escreveremos programas daqui a cem anos? Não apenas diremos aos computadores o que nós estamos queremos fazer? {avfl, gfn}@cin.ufpe.br 22 As linguagens do futuro provavelmente… … valorizarão mais a produtividade que o poder bruto. … serão mais concisas, construindo sobre bases mais simples … agregarão diferentes paradigmas. … farão uso de bons ambientes de desenvolvimento pra melhorar a produtividade. … encontrarão modos de equilibrar concisão e legibilidade. … Integrarão mecanismos de extensão nos níveis semânticos e sintáticos mais básicos, permitindo que programadores evoluam de maneira mais simples quando necessário. {avfl, gfn}@cin.ufpe.br 23 Valorização da produtividade em detrimento do poder bruto (1/2) A melhoria na eficiencia do programas está na raiz do processo (as linguagens) Desperdiçar o tempo do programador é a verdadeira ineficiência, e não desperdiçar o tempo de máquina. Mesmo que algumas aplicações podem ser crescentemente mais ineficientes e, assim, demandarem toda a velocidade que o hardware puder fornecer, computadores mais rápidos serão sinônimo de linguagens capazes de cobrir uma escala cada vez mais larga de eficiência. {avfl, gfn}@cin.ufpe.br 24 Valorização da produtividade em detrimento do poder bruto (2/2) “Há um desperdício bom, e um desperdício mau. Eu estou interessado no desperdício bom - o tipo onde, gastando mais, nós podemos começar uns projetos mais simples.” (tradução livre, The Hundrer-Year Language, por Paul Graham) {avfl, gfn}@cin.ufpe.br 25 Linguagens concisas e mais simples (1/2) Se nós pensarmos no núcleo de uma linguagem como um conjunto de axiomas, certamente é indesejável ter os axiomas adicionais que não adicionam nenhum poder expressivo, simplesmente por causa da eficiência. A maneira correta de se resolver o problema da adição de axiomas desnecessários é separar o significado de um programa dos detalhes de sua execução. Linguagem do futuro:núcleo limpo, conciso, contendo todos os axiomas essenciais, a partir dos quais as outras características da linguagem poderão ser derivadas {avfl, gfn}@cin.ufpe.br 26 Linguagens concisas e mais simples (2/2) “No mínimo, um exercício que pode ser útil é analisar cuidadosamente o núcleo de uma linguagem para verificar se há axiomas que podem ser eliminados. Em minha longa carreira como um chato, eu descobri que lixo sempre gera mais lixo… Ocorre-me que os galhos principais da árvore evolutiva (das linguagens de programação) passam por linguagens que tem núcleos menores e mais limpos…” (tradução livre, The Hundrer-Year Language, por Paul Graham) {avfl, gfn}@cin.ufpe.br 27 Agregar diferentes paradigmas Um linguagem de sucesso no futuro terá a característica de juntar conceitos de diferentes paradigmas, extendendo assim seu poder de atuação. Orientação a objetos: programas são desenvolvidos como uma série de remendos. Uma boa maneira de extender uma linguagem é misturar diferente paradigmas na mesma, buscando juntar diferentes conceitos para agregar poder à essa linguagem. {avfl, gfn}@cin.ufpe.br 28 Bons ambientes de desenvolvimento: melhor produtividade Mesmo daqui a cem anos, as pessoas ainda dirão a computadores o que querem fazer, usando programas, da mesma maneira que conhecemos hoje. O diferencial está em ambientes de desenvolvimentos mais poderosos que os atuais ”editores de texto glorificados”. Testes automáticos e refatoração são alguns exemplos de como bons ambientes de programação podem ajudar uma linguagem de programação. {avfl, gfn}@cin.ufpe.br 29 Equilibrio entre concisão e legibilidade (1/2) Uma linguagem concisa e simples deve ser aberta em termos de extensibilidade para permitir que, características extras relacionadas com o dominio do problema sejam adicionadas à linguagem,estas derivadas dos axiomas essenciais. Tal linguagem extensível deve ter uma responsabilidade com a legibilidade, pois pode gerar código ilegível por produzir trechos muito idiomáticos. {avfl, gfn}@cin.ufpe.br 30 Equilibrio entre concisão e legibilidade (2/2) Os programadores do futuro serão criaturas tão preguiçosas quanto nós, em seu desejo em expressar programas com o mínimo de esforço. A linguagem do futuro, se existisse, poderia assim ser muito fácil de se programar. “Programas devem ser escritos para pessoas lerem, e somente incidentalmente, para serem executados por máquinas.” (Hackers and Painters, por Paul Graham) {avfl, gfn}@cin.ufpe.br 31 Mecanismos de Extensão nos níveis semântico e sintático mais básicos (1/2) A extensibilidade num mundo interconectado com protocolos que mudam rapidamente. Um programador sempre pode usar programação do mais baixo nível para implementar qualquer coisa, mas é muito melhor se os mecanismos para integração existissem na própria linguagem. {avfl, gfn}@cin.ufpe.br 32 Mecanismos de Extensão nos níveis semântico e sintático mais básicos (2/2) Muitas tarefas em programação podem ser enormemente simplificadas por extensões da linguagem. Prover meios para que programadores posssam esconder estruturas complexas e algoritmos atrás de uma fachada sintática é uma poderosa forma de extensibilidade. A mesma extensibilidade em termos semânticos é mais complexa, mas não impossível. Como foi dito antes, tal poder vem a um preço, mas este deve ser pago se a linguagem precisa evoluir. {avfl, gfn}@cin.ufpe.br 33 Conclusões Falamos aqui em linguagens a serem criadas em um futuro próximo. É perfeitamente possível que um gênio ainda desconhecido descubra um novo paradigma de programação que mude o modo como a programação existe hoje. Obviamente, tal desenvolvimento não pode ser previsto. Muito embora isso possa vir a acontecer, o exercício de olhar para o futuro nos permite ter a consciência da solidez das bases que no passado ajudaram a construir o cenário de linguagens de programação como conhcemos hoje, e, dessa forma, nos permite tentar trilhar um caminho de sucesso para o futuro de nossas aplicações. {avfl, gfn}@cin.ufpe.br 34 Referências The Hundred Year Language, Paul Graham, http://www.paulgraham.com/hundred.html Languages Of The Future, Tim Sheard, http://citeseer.ist.psu.edu/sheard04language s.html Programming Languages: History and Future, Jean E. Sammet, http://rockfishcs.cs.unc.edu/COMP144/sammet.pdf {avfl, gfn}@cin.ufpe.br 35 Referências Evolução das Linguagens de Programação, http://reflectivesurface.com/weblogbr/2003/05/14/mais-sobre-a-evolucao-delinguagens-de-programacao Future Programming Languages, Bent Thomsen, http://www.nouhauz.dk/dokumenter/120505BentThomsen.ppt {avfl, gfn}@cin.ufpe.br 36 Perguntas????? Evolução e Futuro das Linguagens de Programação Alessandro Vasconcelos Gladstone Ferreira Seminário de Engenharia de Software e Linguagens de Programação