Linguagem de programação Julia 1.9 disponível

Foi publicado o lançamento da linguagem de programação Julia 1.9, combinando qualidades como alto desempenho, suporte para digitação dinâmica e ferramentas integradas para programação paralela. A sintaxe de Julia é próxima do MATLAB, pegando emprestados alguns elementos de Ruby e Lisp. O método de manipulação de strings é uma reminiscência do Perl. O código do projeto é distribuído sob a licença do MIT.

Principais recursos do idioma:

  • Alto desempenho: um dos principais objetivos do projeto é atingir desempenho próximo aos programas C. O compilador Julia é baseado no trabalho do projeto LLVM e gera código de máquina nativo eficiente para muitas plataformas de destino;
  • Suporta vários paradigmas de programação, incluindo elementos de programação funcional e orientada a objetos. A biblioteca padrão fornece, entre outras coisas, funções para E/S assíncrona, controle de processos, registro, criação de perfil e gerenciamento de pacotes;
  • Tipagem dinâmica: a linguagem não requer definição explícita de tipos para variáveis, semelhante às linguagens de programação de script. Modo interativo suportado;
  • Capacidade opcional de especificar tipos explicitamente;
  • Uma sintaxe ideal para computação numérica, computação científica, aprendizado de máquina e visualização de dados. Suporte para muitos tipos de dados numéricos e ferramentas para paralelização de cálculos.
  • A capacidade de chamar funções diretamente de bibliotecas C sem camadas adicionais.

Principais mudanças em Julia 1.9:

  • Novos recursos de idioma
    • Permitir que atribuições sejam feitas em outro módulo usando "setproperty!(::Module, ::Symbol, x)".
    • São permitidas múltiplas tarefas que não estejam na posição final. Por exemplo, a string “a, b…, c = 1, 2, 3, 4” será processada como “a = 1; b…, = 2, 3; c = 4". Isso é tratado por meio de Base.split_rest.
    • Literais de caractere único agora suportam a mesma sintaxe que literais de string; aqueles. A sintaxe pode representar sequências UTF-8 inválidas, conforme permitido pelo tipo Char.
    • Adicionado suporte para especificação Unicode 15.
    • Combinações aninhadas de tuplas e tuplas de caracteres nomeados agora podem ser usadas como parâmetros de tipo.
    • Novas funções integradas "getglobal(::Module, ::Symbol[, order])" e "setglobal!(::Module, ::Symbol, x[, order])" para leitura e gravação exclusivamente em variáveis ​​globais. O método getglobal agora deve ser preferido ao método getfield para acessar variáveis ​​globais.
  • Mudanças no idioma
    • A macro "@invoke" introduzida na versão 1.7 agora está exportada e disponível para uso. Além disso, agora ele usa o método "Core.Typeof(x)" em vez de "Any" no caso em que a anotação de tipo é omitida para o argumento "x". Isto é necessário para garantir que os tipos passados ​​como argumentos sejam processados ​​corretamente.
    • Habilitada a exportação da função "invokelatest" e da macro "@invokelatest", introduzida na versão 1.7.
  • Melhorias no compilador/tempo de execução
    • Tempo de primeira execução significativamente reduzido (TTFX - Tempo até a primeira execução). A pré-compilação de um pacote agora armazena o código nativo em "pkgimage", o que significa que o código gerado pelo processo de pré-compilação não precisará ser recompilado após o carregamento do pacote. O uso do modo pkgimages pode ser desabilitado usando a opção "--pkgimages=no".
    • O conhecido problema de complexidade quadrática da inferência de tipo foi corrigido e a inferência usa menos memória em geral. Alguns casos extremos com funções longas geradas automaticamente (como ModelingToolkit.jl com equações diferenciais parciais e grandes modelos causais) são compilados muito mais rapidamente.
    • Chamadas com argumentos sem tipos concretos agora podem ser otimizadas para divisão de união para injeção ou resolução estática, mesmo se houver vários candidatos de tipos diferentes para envio. Isso pode melhorar o desempenho em determinadas situações em que os tipos de objetos não são totalmente resolvidos estaticamente, resolvendo estaticamente sites de chamada "@nospecialize-d" e evitando a recompilação.
    • Todos os usos da macro @pure no módulo Base foram substituídos por Base.@assume_effects.
    • Chamadas para invocar(f, invocasig, args...) com tipos menos específicos do que normalmente usados ​​para f(args...) não fazem mais com que o pacote seja recompilado.
  • Mudanças nas opções de linha de comando
    • No Linux e no Windows, a opção "--threads=auto" agora tenta determinar o número disponível de processadores com base na afinidade da CPU, uma máscara normalmente definida em ambientes HPC e de nuvem.
    • O parâmetro “--math-mode=fast” está desabilitado, em vez disso é recomendado usar a macro “@fastmath”, que possui uma semântica claramente definida.
    • A opção "--threads" agora está no formato "auto | N[,auto|M]", onde M indica o número de threads interativos a serem criados (atualmente auto significa 1).
    • Adicionada opção “—heap-size-hint=”, que define o limite após o qual a coleta de lixo ativa começa. O tamanho pode ser especificado em bytes, quilobytes (1000 KB), megabytes (300 MB) ou gigabytes (1,5 GB).
  • Mudanças no multithreading
    • "Threads.@spawn" agora possui um primeiro argumento opcional com o valor ":default" ou ":interactive". Uma tarefa interativa requer baixa latência de resposta e é projetada para ser curta ou executada com frequência. As tarefas interativas serão executadas em threads interativos se forem especificadas ao iniciar Julia.
    • Threads executados fora do tempo de execução Julia (como C ou Java) agora podem chamar o código Julia usando "jl_adopt_thread". Isso acontece automaticamente ao inserir o código Julia via “cfunction” ou o ponto de entrada “@ccallable”. Como consequência, o número de threads agora pode mudar durante a execução.
  • Novas funções de biblioteca
    • Nova função "Iterators.flatmap".
    • Nova função "pkgversion(m::Module)" para obter a versão do pacote que carregou um determinado módulo, semelhante a "pkgdir(m::Module)".
    • Nova função "stack(x)" que generaliza "reduce(hcat, x::Vector{<:Vector})" para qualquer dimensão e permite qualquer iterador de iteradores. O método "stack(f, x)" generaliza "mapreduce(f, hcat, x)" e é mais eficiente.
    • Nova macro para análise de memória alocada "@allocations", semelhante a "@allocated", exceto que retorna o número de alocações de memória, em vez do tamanho total da memória alocada.
  • Novos recursos de biblioteca
    • "RoundFromZero" agora funciona para outros tipos além de "BigFloat".
    • "Dict" agora pode ser reduzido manualmente usando "sizehint!"
    • "@time" agora especifica separadamente a porcentagem de tempo gasto na recompilação de métodos inválidos.
  • Mudanças na biblioteca padrão
    • Corrigido um problema de simultaneidade em métodos de iteração para Dict e outros objetos derivados, como chaves(::Dict), valores(::Dict) e Conjunto. Esses métodos de iteração agora podem ser chamados em um Dict ou Set em paralelo para um número ilimitado de threads, desde que não haja ações que modifiquem o dicionário ou conjunto.
    • Negar uma função predicada "!f" agora retorna uma função composta "(!) ∘ f" em vez de uma função anônima.
    • As funções de fatia de dimensão agora funcionam em múltiplas dimensões: "eachslice", "eachrow" e "eachcol" retornam um objeto "Slices" que permite o despacho para fornecer métodos mais eficientes.
    • Adicionada a macro "@kwdef" à API pública.
    • Corrigido um problema com a ordem das operações em "fld1".
    • A classificação agora é sempre estável no tempo (o QuickSort foi redesenhado).
    • "Base.splat" agora é exportado. O valor de retorno é do tipo "Base.Splat" em vez de uma função anônima, permitindo uma boa saída.
  • Gerenciador de pacotes
    • "Extensões de Pacote": Suporte para carregar um trecho de código de outros pacotes carregados em uma sessão Julia. O aplicativo é semelhante ao pacote "Requires.jl", mas a pré-compilação e a compatibilidade de configurações são suportadas.
  • Biblioteca de Álgebra Linear
    • Devido ao risco de confusão com a divisão elemento a elemento, foram removidos os métodos "a/b" e "b\a" com escalar "a" e vetor "b", que eram equivalentes a "a * pinv(b)".
    • Chamar BLAS e LAPACK agora usa "libblastrampoline (LBT)". OpenBLAS é fornecido por padrão, mas a construção da imagem do sistema com outras bibliotecas BLAS/LAPACK não é suportada. Em vez disso, é recomendado usar o mecanismo LBT para substituir BLAS/LAPACK por outro conjunto existente de bibliotecas.
    • "lu" suporta uma nova estratégia de rotação de matriz, "RowNonZero()", que seleciona o primeiro elemento de rotação diferente de zero para uso com novos tipos aritméticos e para fins de treinamento.
    • "normalize(x, p=2)" agora suporta qualquer espaço vetorial normalizado "x", incluindo escalares.
    • O número padrão de threads BLAS agora é igual ao número de threads de CPU em arquiteturas ARM e metade do número de threads de CPU em outras arquiteturas.
  • Printf: Mensagens de erro reformuladas para strings formatadas incorretamente para melhor legibilidade.
  • Perfil: Nova função "Profile.take_heap_snapshot(file)", que grava um arquivo no formato ".heapsnapshot" baseado em JSON e compatível com Chrome.
  • Aleatório: randn e randexp agora funcionam para qualquer tipo AbstractFloat que defina rand.
  • REPL
    • Pressionar a combinação de teclas "Alt-e" agora abre a entrada atual no editor. O conteúdo (se modificado) será executado quando você sair do editor.
    • O contexto atual do módulo ativo no REPL pode ser alterado (Principal por padrão) usando a função "REPL.activate(::Module)" ou inserindo o módulo no REPL e pressionando a combinação de teclas "Alt-m".
    • O modo "prompt numerado", que imprime números para cada entrada e saída e armazena os resultados pontuados em Out, pode ser ativado usando "REPL.numbered_prompt!()".
    • A conclusão da guia exibe os argumentos de palavras-chave disponíveis.
  • SuiteSparse: código movido do solucionador "SuiteSparse" para "SparseArrays.jl". Os solucionadores agora são reexportados por "SuiteSparse.jl".
  • Matrizes esparsas
    • Os solucionadores "SuiteSparse" agora estão disponíveis como submódulos "SparseArrays".
    • Os modos de proteção de thread UMFPACK e CHOLMOD foram aprimorados eliminando variáveis ​​globais e usando bloqueios. "ldiv!" Multi-threaded Objetos UMFPACK agora podem ser executados com segurança.
    • A função experimental "SparseArrays.allowscalar(::Bool)" permite desabilitar ou habilitar a indexação escalar de arrays esparsos. Esta função foi projetada para detectar indexação escalar aleatória de objetos "SparseMatrixCSC", que é uma fonte comum de problemas de desempenho.
  • Novo modo à prova de falhas para conjuntos de testes que encerra uma execução de teste antecipadamente em caso de falha ou erro. Defina via “@testset kwarg failfast=true” ou “export JULIA_TEST_FAILFAST=true”. Às vezes, isso é necessário em execuções de CI para receber mensagens de erro antecipadamente.
  • Datas: strings vazias não são mais analisadas incorretamente como valores válidos "DateTime", "Dates" ou "Times" e, em vez disso, lançam um "ArgumentError" nos construtores e na análise, enquanto "tryparse" não retorna nada.
  • Pacote Distribuído
    • A configuração do pacote (projeto ativo, "LOAD_PATH", "DEPOT_PATH") agora é propagada ao adicionar processos de trabalho locais (por exemplo, usando "addprocs(N::Int)" ou usando o sinalizador de linha de comando "--procs=N").
    • "addprocs" para processos de trabalho locais agora aceita um argumento chamado "env" para passar variáveis ​​de ambiente para processos de trabalho.
  • Unicode: "grafemas(s, m:n)" retorna a substring do m ao enésimo grafema em "s".
  • O pacote DelimitedFiles foi removido das bibliotecas do sistema e agora é distribuído como um pacote separado que deve ser instalado explicitamente para ser usado.
  • Dependências externas
    • No Linux, a versão da biblioteca do sistema libstdc++ é detectada automaticamente e, se for mais recente, é carregada. O antigo comportamento de carregamento integrado da libstdc++, independentemente da versão do sistema, pode ser restaurado definindo a variável de ambiente "JULIA_PROBE_LIBSTDCXX=0".
    • Removido "RPATH" do binário julia, que pode quebrar bibliotecas no Linux que não conseguem definir a variável "RUNPATH".
    • Melhorias na ferramenta: A saída de "MethodError" e métodos (por exemplo, de "methods(my_func)") agora é formatada e colorida de acordo com o princípio de saída de métodos em um rastreamento de pilha.

    Fonte: opennet.ru

Adicionar um comentário