Juliano Benvenuto Piovezan Desenvolvimento de uma Linguagem para Ensino de Programação Paralela Florianópolis 2008
Juliano Benvenuto Piovezan Desenvolvimento de uma Linguagem para Ensino de Programação Paralela Trabalho de Conclusão de Curso apresentado como requisito parcial para obtenção do grau de bacharel em Ciências da Computação. Orientador: José Mazzuco Júnior Co-orientador: Ricardo Azambuja Silveira Florianópolis 2008
Sumário 1 Introdução p. 4 1.1 Apresentação.................................. p. 4 1.2 Objetivos.................................... p. 5 1.2.1 Objetivo Geral............................. p. 5 1.2.2 Objetivos Específicos.......................... p. 5 2 Metodologia p. 6 2.1 Sumário Provisório............................... p. 6 2.1.1 Introdução............................... p. 6 2.1.2 Programação Concorrente....................... p. 6 2.1.3 Descrição da Linguagem........................ p. 6 2.1.4 Máquina Alvo............................. p. 7 2.1.5 Construção do Compilador....................... p. 7 2.1.6 Conclusão................................ p. 7 2.1.7 Anexos................................. p. 7 2.2 Identificação das Fontes............................. p. 7 3 Cronograma p. 9 3.1 Análise Léxica e Sintática........................... p. 9 3.2 Análise Semântica............................... p. 10 3.3 Gerador de Código............................... p. 10 3.4 Testes...................................... p. 10
3.5 Redação do Texto Científico.......................... p. 10 4 Conclusão p. 11 Referências Bibliográficas p. 12
4 1 Introdução 1.1 Apresentação No segundo trimestre de 2005 apareciam no mercado de desktops os primeiros processadores com múltiplos núcleos 1. Mais precisamente, o primeiro processador a aparecer no mercado para computadores pessoais com tal característica fora o Pentium D, fabricado pela Intel Corporation. Seguindo a tendência, a AMD (Advanced Micro Devices) lançaria, pouco tempo depois, sua versão com dois núcleos para o Athlon 64, o Athlon 64 X2. Desde então, novas tecnologias vêm sendo desenvolvidos, como a microarquitetura Intel Core, que apresentou avanços significativos, principalmente quanto ao número de núcleos e um melhor gerenciamento dos recursos, como a divisão da memória cache entre os núcleos. Com a expectativa da produção de chips com a tecnologia de 32 nm, podendo-se chegar a 22 nm até 2011, espera-se que o número de núcleos nos processadores cresça exponencialmente durante os próximos anos. De acordo com estudos do Forrester Research, espera-se processadores com 64 núcleos para servidores até 2009, e para computadores pessoais até 2012 [1]. A tecnologia com múltiplos núcleos surgiu como solução para o problema do aquecimento excessivo, enfrentado em decorrência da tentativa do aumento da freqüência. Estudos demonstraram que a freqüência máxima segura, para os processadores produzidos com a tecnologia de 65 nm, era de 4 Ghz, a qual fora alcançada na metade da década atual. Iniciava, então, uma nova corrida entre as fabricantes, não mais pelo aumento da freqüência, mas sim por uma solução para tal problema. O ponto chave da fabricação de processadores com múltiplos núcleos está na paralelização de processos, ou seja, execução de várias tarefas no mesmo instante de tempo. Nos processadores com único núcleo, a paralelização é feita atráves de software, pelo Sistema Operacional, através de algoritmos de escalonamento. Enquanto que, para os processadores de múltiplos núcleos, a paralelização é definida a nível de hardware, permitindo uma diminuição na freqüência sem perda de eficiência. 1 multi-core
5 Embora o mercado dos processadores com múltiplos núcleos tenha se firmado, um sério problema assola a indústria: a baixa taxa de utilização dos núcleos. Uma das causas para este fenômeno está no fato de que muitos programadores não conhecem os princípios básicos de programação paralela, continuando a produzir os programas de forma seqüêncial, sem fazer uso dos benefícios do paralelismo. Com isso, grandes empresas, como Intel e Microsoft, têm investido massissamente para capacitação de pessoas e também na criação de linguagens de programação que se adequem ao mundo paralelo. Em meados deste ano, as duas gigantes doaram, conjuntamente, 20 milhões de dólares, a serem divididos pela Universidade da Califórnia e pela Universidade de Illinois em pesquisas, como a criação de linguagens de programação que auxiliem a programação paralela [2]. A mesma Intel desenvolveu uma biblioteca denominada Threading Building Blocks (TBB), a qual visa isolar o programador de certos problemas que envolvem a programação paralela, como as incompatibilidades entre Sistemas Operacionais. Verifica-se, então, que a programação paralela possuirá um importante papel no desenvolvimento de sistemas computadorizados. Baseado nisso, esse trabalho terá como foco o desenvolvimento de uma linguagem a ser utilizado no ensino de conceitos básicos da programação concorrente. Servirá como base um trabalho já realizado por Alan Burns e Geoff Davies, que desenvolveram a linguagem conhecida como Pascal-FC, um subconjunto da conhecida linguagem Pascal, com adição de estruturas de sincronismo, como semáforos, monitores e variáveis de condição 2 [3]. 1.2 Objetivos 1.2.1 Objetivo Geral Este trabalho tem como objetivo o desenvolvimento de uma linguagem que permita o ensino de programação paralela. 1.2.2 Objetivos Específicos Criação de linguagem que permita a criação de execução concorrente; Inlcuir de estruturas de sincronização; Definir uma sintaxe simples, como as utilizadas por linguagens de script, exemplo Ruby; Tornar a linguagem multi plataforma. 2 condition variable
6 2 Metodologia 2.1 Sumário Provisório Pretende-se, no trabalho, dar uma visão geral sobre os benefícios da programação paralela, bem como os desafios a serem enfrentados, como sincronização de threads, condições de corrida, entre outros. Além de uma especificação formal das principais características da linguagem, uma visão geral sobre a Máquina Virtual JAVA, a qual será utilizada como máquina alvo para a linguagem. As próximas subseções demonstram a estruturação provisória do sumário. 2.1.1 Introdução Uma breve introdução sobre o assunto de programação concorrente, além de informações sobre o contexto no mercado atual. Como seções, serão apresentados os objetivos específicos e o objetivo geral. 2.1.2 Programação Concorrente Neste capítulo serão apresentados benefícios e dificuldades encontradas na utilização de paralelismo. Será discutido em profundidade o problema de condição de corrida, bem como as melhores soluções para tal. Além disso, problemas com deadlock será outro assunto abordado neste capítulo. 2.1.3 Descrição da Linguagem Toda a estrutura básica da linguagem será especificada neste capítulo. Incluindo declaração de variáveis, tipos básicos presentes e estruturas de controle. Será definido também o conceito de processo na linguagem, a ativação concorrente dos mesmos, entre outras especificações.
7 2.1.4 Máquina Alvo Neste capítulo será apresentado detalhes com relação à máquina virtual, para a qual o compilador irá gerar código. Será dada uma visão geral, como a estrutura básica da máquina, seu conjunto de instruções, além de outros detalhes. 2.1.5 Construção do Compilador A construção do compilador será detalhada nesta parte do trabalho. Aspectos como ferramentas utilizadas, tipo do analisador sintático utilizado, detalhes da implementação, entre outros. 2.1.6 Conclusão Neste capítulo serão apresentadas as conclusões referentes ao trabalho, bem como trabalhos futuros que poderão ser realizados com base neste trabalho. 2.1.7 Anexos Nos anexos será apresentado a especificação formal da linguagem, além de outros assuntos pertinentes. 2.2 Identificação das Fontes Após pesquisas com relação à bibliografia clássica nos assuntos relacionados a linguagens de programação, construção de compiladores e programação paralela, chegou-se a seguinte lista de referências: 1. HOARE, C. A. R. Monitors: An operating system structuring concept. Advanced Research Projects Agency, 1974. 2. FINKEL, R. A. Advanced Programming Language Design. [S.l.]: Addison-Wesley, 1996. 3. HOPCROFT, J. E.; MOTWANI, R.; ULLMAN, J. D. Introduction to Automata Theory, Language, and Computation. 2nd edition. ed. [S.l.]: Addison Wesley, 2001.
8 4. AHO, A. V.; SETHI, R.; ULLMAN, J. D. Compilers: Principles, Techniques and Tools. [S.l.]: Addison-Wesley Publishing, 1985. 5. TURBAK, F.; GIFFORD, D. Design Concepts in Programming Languages. [S.l.]: The MIT Press, 2008. 6. FRIEDMAN, D. P.; WAND, M. Essentials of Programming Languages. 3rd. ed. [S.l.]: The Mit Press, 2008. 7. HOARE, C. A. R. Hints on programming language design. Advanced Research Projects Agency, 1973. 8. LINDHOLM, T.; YELLIN, F. The Java Virtual Machine Specification. [S.l.]: Sun Microsystems, Inc., 1999. 9. TANENBAUM, A. S. Modern Operating Systems. 2nd edition. ed. [S.l.]: Person Education Inc., 2001. 10. PETERSON, J.; SILBERSCHATZ, A. Operating Systems Concepts. 7th edition. ed. [S.l.]: John Wiley & Sons, Inc., 2004. 11. DAVIES, G. Pascal-FC Language Reference Manual. 5th. ed. [S.l.], 1992. 12. FLANAGAN, D.; MATSUMOTO, Y. The Ruby Programming Language. [S.l.]: O Reilly, 2008.
9 3 Cronograma A tabela 4.1 apresenta o cronograma que deverá ser seguido durante do desenvolvimento do projeto. Os meses especificados se referem ao no de 2009. Cronograma Jan. Fev. Marc. Abr. Maio Jun. Jul. Ag. Set. Out. Nov. Implementação X Analisador Léxico Implementação X Analisador Sintático Implementação Analisador Semântico X X X Implementação X X X X X do Gerador de Código Testes X X X X X X X X X X Redação do X X X X X Texto Técnico Apresentação X Tabela 3.1: Cronograma 3.1 Análise Léxica e Sintática Uma vez que a implementação dos analisadores léxico e sintático é feita de forma automatizada, a implementação dos mesmos não tomará muito tempo. Com o tempo restante, tais analisadores passarão por uma bateria de testes, que será explicado mais adiante.
10 3.2 Análise Semântica A análise semântica é conhecida por ser a etapa mais complicada no projeto de compiladores. Com isso, deverá despender um maior tempo em sua implementação. Com isso estima-se uma duração de 3 meses para seu término. 3.3 Gerador de Código Estima-se que a geração de código ocupe 5 meses do tempo, considerando a possibilidade de ocorrência de problemas durante sua implementação. 3.4 Testes Seguindo o proposto pela programação extrema 1, especificamente no desenvolvimento orientado a testes - TDD, testes serão realizados durante todo o projeto. Segundo [4], TDD é uma técnica de projeto que garante que todo o código fonte foi completamente testado de forma unitária. Por conseqüência, a ocorrência de problemas diminui consideravelmente, e caso venha a ocorrer, novos testes devem ser definidos para cobrir o problema. 3.5 Redação do Texto Científico Espera-se produzir parte do texto científico no início do projeto, continuando após o início da implementação do gerador de código e finalizando o mesmo no último mês antes da apresentação. Uma vez que o tempo gasto na implementação dos analisadores léxico e sintático será mínimo, o primeiro mês proporcionará um tempo suficiente para redação de boa parte do texto. 1 XP - extreaming Programming
11 4 Conclusão Este trabalho teve como objetivo prover uma introdução ao trabalho a ser produzido como conclusão de curso. Fora apresentado o contexto atual e futuro em relação ao projeto, bem como seus objetivos gerais e específicos. As principais fontes de informação foram definidas, além de um sumário provisório. Por fim, fora apresentado o cronograma a ser seguido.
12 Referências Bibliográficas [1] STATEN, J.; RYMER, J. R. The multicore programming era is here. Forrester Research, 2008. [2] SERVICE, I. N. Microsoft e Intel investem US$ 20 milhões em computação paralela. Disponível em: <http://computerworld.uol.com.br/mercado/2008/03/28/microsoft-e-intelinvestem-us-20-milhoes-em-computacao-paralela/>. [3] DAVIES, G. Pascal-FC Language Reference Manual. 5th. ed. [S.l.], 1992. [4] AMBLER, S. Agile Database Techniques: Effective Strategies for the Agile Software Developer. [S.l.]: Wiley, 2003.