Preview only show first 10 pages with watermark. For full document please download

Introdução à Linguagem De Programação Julia

Linguagem de Programação Julia

   EMBED


Share

Transcript

    Capítulo   4   Introdução à linguagem de programação Julia: A ambiciosa linguagem de programação que quer substituir Python, R e Matlab.   João Marcello Pereira    Abstract  Scientific computation, also known as computational science, is the field of knowledge  for the construction of mathematical models and techniques of numerical solutions using software and hardware to analyze and solve scientific problems. The Julia  programming language is an opensource alternative to MATLAB®, Maple®, Fortran, R and Python, focused on teaching numerical and symbolic programming, and scientific research. Based on several other languages, Julia has JIT compilation (just in time) is designed for parallel and distributed computing, is IDE free choice, has integration with C, Fortran and Python, as well as practical package development and management by GIT.  Resumo   A computação científica, também conhecida como ciência computacional, é o campo do saber destinado à construção de modelos matemáticos e técnicas de soluções numéricas utilizando softwares e hardwares para analisar e resolver problemas científicos. A linguagem de programação Julia é uma alternativa opensource ao MATLAB ®  , Maple ®, Fortran, R e Python, focado no ensino de programação numérica e simbólica, e  pesquisa científica. Baseada em várias outras linguagens, Julia apresenta compilação  JIT (just in time) é projetado para computação paralela e distribuída, é de livre escolha de IDE, possui integração com C, Fortran e Python, além de desenvolvimento de  pacotes de forma prática e gerenciamento via GIT. III Escola Regional de Informática do Piauí. Livro Anais - Artigos e Minicursos, v. 1, n. 1, p. 315-335, jun, 2017.www.eripi.com.br/2017 - ISBN: 978-85-7669-395-6    4.1. Introdução A  análise numérica permite que inúmeros problemas matemáticos, cujas soluções algébricas são difíceis, ou até mesmo impossíveis de se encontrar, possam ser resolvidos por meio de métodos numéricos apropriados [Sperandio; Mendes; Silva, 2003]. Dessa forma, diversos softwares  e linguagens de programação foram desenvolvidos com o intuito de resolver problemas numéricos, sendo aplicados, principalmente, em pesquisas e no ensino das disciplinas de cálculo e métodos numéricos. Entre esses, o MATLAB ®  é a mais expressiva plataforma (linguagem e ambiente de programação) de programação numérica e simbólica utilizada nas instituições de ensino e nas indústrias. Embora seja muito popular no ambiente acadêmico, o MATLAB ®  é uma plataforma fechada de alto custo de aquisição, além de exigir computadores acima do padrão básico do mercado brasileiro. Neste ponto, há diversas alternativas de código aberto como Python, R, Fortran. Julia surgiu nesse cenário com a proposta ousada de substituir várias linguagens voltadas para computação científica. Conforme as palavras dos criadores, Bezanson et al. (2015): “Queremos uma linguagem de código aberto, com uma licença liberal. Queremos a velocidade de C com o dinamismo de Ruby. Queremos uma linguagem que seja homoicônica, com macros verdadeiros como Lisp, mas com notação matemática óbvia e familiar como Matlab. Queremos algo tão útil para programação geral como Python, tão fácil para estatísticas como R, como natural para processamento de strings como Perl, tão poderoso para álgebra linear como Matlab, tão bom e adaptável como programas juntos em shell. Algo simples de aprender, mas que ainda satisfaça os hackers mais sérios. Queremos que ele interativo e queremos compilado. (Será que mencionamos que deve ser tão rápido quanto C?)” Os esforços dos desenvolvedores em projetar uma linguagem de alto desempenho podem ser observados no s resultados de um benchmark entre várias linguagens disponível no site oficial da linguagem Julia. O benchmark consiste na execução de vários códigos em um único núcleo (execução serial) de um processador Intel® Xeon® CPU E7-8850 2.00GHz com 1TB de memória RAM DDR3 de 1067MHz e sistema operacional Linux. Tabela 4.1. Tempo de processamento relativo ao tempo de C (Quanto menor, melhor. Performance de C = 1) Conforme dos dados apresentados, Julia apresenta um potencial significativo, principalmente em função de uma linguagem que ainda não chegou à sua versão 1.0. Algoritmos Fortran (gcc 5.4.1) Julia (0.4.0) Python (3.4.3) R (3.2.2) Matlab (R2015b) Octave (4.0.0) Mathematica (10.2.0) JavaScript (V8 3.28.74.19) Go (go4.5) LuaJIT (gsl-shell 2.3.1) Java (4.8.0_45) fibonacci 0.70 2.11 77.76 533.52 26.89 9324.35 118.53 3.36 4.86 4.71 4.21 parse_int 5.05 4.45 17.02 45.73 802.52 9584.44 15.02 6.06 4.20 5.77 3.35 quicksort 4.31 4.15 32.89 264.54 4.92 1866.01 43.23 2.70 4.29 2.03 2.60 mandel 0.81 0.79 15.32 53.16 7.58 454.81 5.13 0.66 4.11 0.67 4.35 pi_sum 4.00 4.00 24.99 9.56 4.00 299.31 4.69 4.01 4.00 4.00 4.00 rand_mat_stat 4.45 4.66 17.93 14.56 14.52 30.93 5.95 2.30 2.96 3.27 3.92 rand_mat_mul 3.48 4.02 4.14 4.57 4.12 4.12 4.30 15.07 4.42 4.16 2.36    4.2. Linguagem de programação Julia  Julia é uma linguagem de programação compilada (JIT –  Just In Time ) open source  de alto nível, projetada com foco na computação científica e numérica de alto desempenho [Bezanson et al. 2015]. É relativamente jovem, posto que teve início no MIT em agosto de 2009 e, em fevereiro de 2012, tornou-se open source. É fruto do trabalho de quatro pesquisadores: Stefan Karpinski, Jeff Bezanson, Alan Edelman e Viral Shah [Bezanson et al. 2015]. A linguagem Julia foi pensada como uma linguagem para computação científica suficientemente rápida, tal como as linguagens C e Fortran, mas igualmente fácil de aprender como o MATLAB® e o Mathematica®, com o objetivo de facilitar a modelagem computacional. É escrito em C, C++ e Scheme, e a biblioteca padrão é escrita utilizando a própria linguagem. Possui forte inspiração em MATLAB®, Lisp, C, Fortran, Mathematica®, Python, Perl, R, Ruby, Lua, além de compartilhar muitas características de Dylan e Fortress. A versão estável atual de Julia é v0.5.2 lançada em 10 de maio de 2017. O site oficial (http://julialang.org), lista abaixo como os recursos principais da linguagem: ã   Sintaxe intuitiva e semelhante ao MATLAB ®   ã   Despacho múltiplo: permite definir diferentes comportamentos para uma mesma função a partir de diferentes combinações dos tipos de seus argumentos; ã   Sistema de tipos dinâmico: tipos para documentação, otimização e despacho; ã   Bom desempenho, aproximando-se de linguagens compiladas estaticamente como C; ã   Gerenciador de pacotes embutido; ã   Macros similares a Lisp e outras funcionalidades de metaprogramação; ã   Chamadas para funções de bibliotecas Python por meio do pacote PyCall.jl ; ã   Chamadas para funções de bibliotecas C diretamente sem necessidade de wrappers  ou  APIs  especiais; ã   Projetado para paralelismo e computação distribuída; ã   Tipos definidos pelo usuário são tão rápidos e compactos quanto os tipos nativos da linguagem; ã   Geração automática de código especializado e eficiente para diferentes tipos de argumentos; ã   Conversões e promoções elegantes e extensíveis para tipos numéricos e demais tipos; ã   Suporte eficiente para Unicode ; ã   Licença MIT. A compilação  just-in-time  (JIT) baseado em LLVM de Julia, combinado com seu design, permite que a linguagem se equipare à performance da linguagem C em vários cenários.   Neste ponto, a compilação  Just-in-Time  é descrito por Sengupta (2015) como:    A compilação  Just-in-Time  é uma técnica na qual o código escrito em uma linguagem de alto nível é convertido em código de máquina para execução na CPU em tempo de execução. Isso contrasta com as linguagens interpretadas, que executam o código diretamente em tempo de execução. Isso geralmente tem uma sobrecarga significativamente maior. O processo de compilação na linguagem Julia é descrito por Balbaert (2015) da seguinte forma: Na primeira vez em que é executada uma função na linguagem Julia, ela é analisada e os tipos são inferidos. Em seguida, o código LLVM é gerado pelo compilador JIT, que é otimizado e compilado para código nativo. Na segunda vez em que é executada novamente a mesma função Julia, o código nativo, já gerado, é chamado. Esta é a razão pela qual, na segunda vez em que é chamada uma função com argumentos de um tipo específico, o tempo de execução é bem menor que na primeira vez. Feito as considerações iniciais sobre a linguagem, os tópicos seguintes são referentes aos comandos básicos, interface, instalação, tipos de dados, cotrole de fluxo, escopo, gerenciamento de pacotes, matemática simbólica, gráficos e dataframes. 4.3. Começando com o Julia A maneira mais fácil de testar a linguagem de programação Julia é através do JuliaBox (juliabox.com). JuliaBox é um ambiente de programação com interface web Jupyter hospedado na nuvem do Google para codificação em linguagem Julia sem a necessidade de instalar qualquer software na máquina local. O Jupyter é uma aplicação web derivado do IPython que é um interpretador de comandos interativo para várias linguagens de programação. A interface Jupyter oferece type introspection , rich media , sintax shell , suporte para mais de 40 linguagens de programação, incluindo as mais populares em computação científica como Python, R, Julia e Scala. Além disto, permite realizar o download do código em outros formatos (.pdf, .md, .rst, .html e .tex), gerar apresentação de slides, permite escrita de texto científicos em latex e markdown, importação/exportação de projetos para o github e muitas outras funcionalidades. JuliaBox disponibiliza algumas recursos interessantes para cada usuário: ã   Permite executar um terminal bash Linux que pode ser usado para executar o Julia REPL; ã   Transferência de arquivos para o contêiner de uma sessão; ã   Sincronização de arquivos com o Google Drive e Github; ã   Extensível com  plugins ; ã   500 MB de espaço em disco; ã   6 GB de memória RAM; ã   4 CPUs (16 cores) Xeon(R) CPU 2.60GHz; ã   Ubuntu 14.04.5 LTS; ã   Interface web Jupyter; ã   E muito mais. O JuliaBox não é um ambiente ideal para simulações e benchmark, a proposta é dos desenvolvedores é fornecer um ambiente de codificação prática e portável. São