Linguagem de Programação Julia Versão 1.8

Está disponível o lançamento da linguagem de programação Julia 1.8, 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 no Julia 1.8:

  • Novos recursos de idioma
    • Os campos de uma estrutura mutável agora podem ser anotados como constantes para evitar que sejam alterados e permitir a otimização.
    • Anotações de tipo podem ser adicionadas a variáveis ​​globais.
    • Matrizes n-dimensionais vazias podem ser criadas usando vários pontos e vírgulas entre colchetes, por exemplo "[;;;]" cria uma matriz 0x0x0.
    • Os blocos Try agora podem ter opcionalmente um bloco else, que é executado imediatamente após o corpo principal se nenhum erro for gerado.
    • @inline e @noinline podem ser colocados dentro do corpo de uma função, permitindo anotar uma função anônima.
    • @inline e @noinline agora podem ser aplicados a uma função em um site ou bloco de chamada para forçar a inclusão (ou não) das chamadas de função correspondentes.
    • ∀, ∃ e ∄ são permitidos como caracteres identificadores.
    • Adicionado suporte para especificação Unicode 14.0.0.
    • O método Module(:name, false, false) pode ser usado para criar um módulo que não contém nomes, não importa Base ou Core e não contém uma referência a si mesmo.
  • Mudanças no idioma
    • Objetos Task recém-criados (@spawn, @async, etc.) agora possuem world_age para métodos da Task pai quando criados, permitindo uma execução otimizada. A opção de ativação anterior está disponível usando o método Base.invokelatest.
    • As diretivas de formatação bidirecional desequilibrada Unicode agora são proibidas em strings e comentários para evitar injeções.
    • Base.ifelse agora é definido como uma função genérica em vez de uma função interna, permitindo que os pacotes estendam sua definição.
    • Cada atribuição a uma variável global agora passa primeiro por uma chamada para convert(Any, x) ou convert(T, x) se a variável global foi declarada como sendo do tipo T. Antes de usar variáveis ​​globais, certifique-se de que a invariante convert(Any , x) === x é sempre verdadeiro, caso contrário, pode levar a um comportamento inesperado.
    • As funções integradas agora são semelhantes às funções genéricas e podem ser enumeradas programaticamente usando métodos.
  • Melhorias no compilador/tempo de execução
    • Tempo de inicialização reduzido em aproximadamente 25%.
    • O compilador baseado em LLVM foi separado da biblioteca de tempo de execução em uma nova biblioteca, libjulia-codegen. Ele é carregado por padrão, portanto não deve haver alterações durante o uso normal. Em implantações que não necessitam de um compilador (por exemplo, imagens de sistema nas quais todo o código necessário é pré-compilado), esta biblioteca (e sua dependência LLVM) pode simplesmente ser omitida.
    • A inferência de tipo condicional agora é possível passando um argumento para um método. Por exemplo, para Base.ifelse(isa(x, Int), x, 0) retorna ::Int mesmo que o tipo de x seja desconhecido.
    • SROA (Scalar Replacement of Aggregates) foi melhorado: elimina chamadas getfield com campos globais persistentes, elimina estruturas mutáveis ​​com campos não inicializados, melhora o desempenho e o tratamento de chamadas getfield aninhadas.
    • Вывод типов отслеживает различные эффекты — побочные изменения и отсутствие отбрасывания. Учитывается распространения констант, что значительно повышает производительность во время компиляции. В некоторых случаях, например, вызовы функций, которые не могут быть встроены по месту вызова, но не влияют на результат, будут отброшены на время выполнения. Правила для эффектов можно перезаписать вручную с помощью макроса Base.@assume_effects.
    • A pré-compilação (com diretivas de pré-compilação explícitas ou cargas de trabalho especificadas) agora salva mais código definido por tipo, resultando em uma execução mais rápida na primeira vez. Quaisquer novas combinações de método/tipo necessárias ao seu pacote, independentemente de onde esses métodos foram definidos, agora podem ser armazenadas em cache no arquivo de pré-compilação se forem chamadas por um método pertencente ao seu pacote.
  • Mudanças nas opções de linha de comando
    • O comportamento padrão para monitorar declarações @inbounds agora é a opção automática em "--check-bounds=yes|no|auto".
    • Nova opção "--strip-metadata" para remover docstrings, informações de localização de origem e nomes de variáveis ​​locais ao criar uma imagem do sistema.
    • Nova opção "--strip-ir" para permitir que o compilador remova a representação intermediária do código-fonte ao construir a imagem do sistema. A imagem resultante só funcionará se "--compile=all" for usado ou se todo o código necessário for pré-compilado.
    • Se o caractere "-" for especificado em vez do nome do arquivo, o código executável será lido no fluxo de entrada padrão.
  • Mudanças no suporte multithreading
    • Threads.@threads por padrão usa a nova opção de agendamento :dynamic, que difere do modo anterior porque as iterações serão agendadas dinamicamente entre threads de trabalho disponíveis em vez de serem atribuídas a cada thread. Este modo permite uma melhor distribuição de loops aninhados com @spawn e @threads.
  • Novas funções de biblioteca
    • eachsplit(str) для многократного выполнения split(str).
    • allequal(itr) para testar se todos os elementos em um iterador são iguais.
    • hardlink(src, dst) pode ser usado para criar links físicos.
    • setcpuaffinity(cmd, cpus) para definir a afinidade do núcleo do processador com os processos iniciados.
    • diskstat(path=pwd()) para obter estatísticas do disco.
    • Nova macro @showtime para exibir a linha que está sendo avaliada e o relatório @time.
    • LazyString e macro "str" ​​preguiçosa foram adicionadas para suportar a construção lenta de mensagens de erro em caminhos de erro.
    • Corrigido um problema de simultaneidade em Dict e outros objetos derivados, como chaves(::Dict), valores(::Dict) e Conjunto. Os métodos de iteração agora podem ser chamados em um dicionário ou conjunto, desde que não haja chamadas que modifiquem o dicionário ou conjunto.
    • @time e @timev agora possuem uma descrição opcional, permitindo anotar a origem dos relatórios de tempo, por exemplo. @time "Avaliando foo" foo().
    • range usa stop ou length como seu único argumento de palavra-chave.
    • Precision e setprecision agora aceitam base como palavra-chave
    • Os objetos de soquete TCP agora fornecem um método closewrite e suportam o uso do modo semiaberto.
    • extrema agora aceita um argumento init.
    • Iterators.countfrom agora aceita qualquer tipo que defina um método +.
    • @time agora aloca a% de tempo gasto na recompilação de métodos com tipos alterados.
  • Alterações na biblioteca padrão
    • Chaves com valor Nada agora são removidas do ambiente em addenv.
    • Iterators.reverse (e, portanto, último) suporta cada linha.
    • A função de comprimento para intervalos de determinados tipos não verifica mais o estouro de número inteiro. Uma nova função, check_length, está disponível; ela contém lógica de controle de transferência de bits. Se necessário, use SaferIntegers.jl para construir o tipo de intervalo.
    • O iterador Iterators.Reverse implementa a reversão de cada índice, se possível.
  • Gerenciador de pacotes
    • Novos indicadores ⌃ e ⌅ próximos aos pacotes no status “pkg>” para os quais novas versões estão disponíveis. ⌅ indica que novas versões não podem ser instaladas.
    • Novo argumento desatualizado::Bool para Pkg.status (--outdated ou -o no modo REPL) para mostrar informações sobre pacotes de versões anteriores.
    • Novo argumento compat::Bool para Pkg.status (--compat ou -c no modo REPL) para mostrar quaisquer entradas [compat] em Project.toml.
    • Novo modo "pkg>compat" (e Pkg.compat) para definir entradas de compatibilidade de projetos. Fornece um editor interativo via "pkg>compat" ou controle direto de registro via "pkg>Foo 0.4,0.5", que pode carregar registros atuais por meio do preenchimento de guias. Ou seja, "pkg> compat Fo " é atualizado automaticamente para "pkg>Foo 0.4,0.5" para permitir a edição de uma entrada existente.
    • O Pkg agora só tenta baixar pacotes de um servidor de pacotes se o servidor estiver monitorando o registro que contém o pacote.
    • Pkg.instantiate agora emitirá um aviso quando Project.toml estiver fora de sincronia com Manifest.toml. Ele faz isso com base em um hash dos registros de dependências e compatibilidade do projeto (outros campos são ignorados) no manifesto ao resolvê-lo, para que qualquer alteração nas dependências ou registros de compatibilidade do Project.toml possa ser detectada sem nova resolução.
    • Se "pkg>add" não conseguir encontrar um pacote com o nome fornecido, ele irá sugerir pacotes com nomes semelhantes que podem ser adicionados.
    • A versão de julia armazenada no manifesto não inclui mais o número da compilação, o que significa que master agora será escrito como 1.9.0-DEV.
    • A interrupção do teste "pkg>" agora será detectada de forma mais consistente e será retornada corretamente ao REPL.
  • Utilitários interativos
    • Nova macro @time_imports para relatar o tempo gasto na importação de pacotes e suas dependências, destacando o tempo de compilação e recompilação como uma porcentagem das importações.
  • Álgebra Linear
    • O submódulo BLAS agora suporta funções BLAS spr! de nível 2.
    • A biblioteca padrão LinearAlgebra.jl agora é completamente independente de SparseArrays.jl, tanto do ponto de vista do código-fonte quanto do teste de unidade. Como consequência, arrays esparsos não são mais retornados (implicitamente) por métodos de LinearAlgebra aplicados a objetos Base ou LinearAlgebra. Em particular, isso leva às seguintes alterações importantes:
      • Concatenações usando matrizes "esparsas" especiais (por exemplo, diagonais) agora retornam matrizes densas; Como consequência, os campos D1 e D2 dos objetos SVD criados pelas chamadas getproperty agora são matrizes densas.
      • O método similar(::SpecialSparseMatrix, ::Type, ::Dims) retorna uma matriz nula densa. Como consequência, produtos de matrizes tridiagonais de duas, três e simétricas entre si levam à geração de uma matriz densa. Além disso, a construção de matrizes semelhantes com três argumentos de matrizes "esparsas" especiais de matrizes (não estáticas) agora falha devido a "zero(::Type{Matrix{T}})".
  • printf
    • %s e %c agora usam o argumento textwidth para formatar a largura.
  • Perfil
    • O perfil de carga da CPU agora registra metadados, incluindo threads e tarefas. Profile.print() tem um novo argumento groupby que permite agrupar threads, tarefas ou subthreads/tarefas, tarefas/threads e argumentos de threads e tarefas para fornecer filtragem. Além disso, a porcentagem de utilização agora é relatada como geral ou por thread, dependendo se o thread está ocioso ou não em cada amostra. Profile.fetch() inclui os novos metadados por padrão. Para compatibilidade retroativa com consumidores externos de dados de criação de perfil, ela pode ser excluída passando include_meta=false.
    • O novo módulo Profile.Allocs permite criar perfis de alocações de memória. Um rastreamento de pilha do tipo e tamanho de cada alocação de memória é registrado, e o argumento sample_rate permite que um número configurável de alocações seja ignorado, reduzindo a sobrecarga de desempenho.
    • O perfil de CPU de duração fixa agora pode ser executado pelo usuário enquanto as tarefas estão em execução sem primeiro carregar o perfil, e o relatório será exibido durante a execução. No MacOS e FreeBSD, pressione ctrl-t ou ligue para SIGINFO. Para outras plataformas, ative SIGUSR1, ou seja, % kill -USR1 $julia_pid. Isso não está disponível no Windows.
  • REPL
    • RadioMenu agora suporta atalhos de teclado adicionais para seleção direta de opções.
    • A sequência "?(x, y" seguida de pressionar TAB exibe todos os métodos que podem ser chamados com argumentos x, y, .... (Um espaço à esquerda impede que você entre no modo de ajuda.) "MyModule.?(x, y " restringe a pesquisa a "MyModule". Pressionar TAB requer que pelo menos um argumento seja de um tipo mais específico que Qualquer. Ou use SHIFT-TAB em vez de TAB para permitir quaisquer métodos compatíveis.
    • A nova variável global err permite obter a exceção mais recente, semelhante ao comportamento de ans com a última resposta. Inserir err reimprime as informações da exceção.
  • Matrizes esparsas
    • O código SparseArrays foi movido do repositório Julia para o repositório SparseArrays.jl externo.
    • As novas funções de concatenação sparse_hcat, sparse_vcat e sparse_hvcat retornam um tipo SparseMatrixCSC independentemente dos tipos dos argumentos de entrada. Isso se tornou necessário para unificar o mecanismo de colagem de matrizes após a separação do código LinearAlgebra.jl e SparseArrays.jl.
  • Logging
    • Os níveis de log padrão BelowMinLevel, Debug, Info, Warn, Error e AboveMaxLevel agora são exportados da biblioteca Logging padrão.
  • Unicode
    • Adicionada função isequal_normalized para verificar a equivalência Unicode sem construir explicitamente strings normalizadas.
    • A função Unicode.normalize agora aceita a palavra-chave charttransform, que pode ser usada para fornecer mapeamentos de caracteres personalizados, e a função Unicode.julia_chartransform também é fornecida para reproduzir o mapeamento usado quando o analisador Julia normaliza identificadores.
  • Test
    • '@test_throws "some message" triggers_error()' agora pode ser usado para testar se o texto de erro exibido contém um erro "some message", independentemente do tipo de exceção específico. Expressões regulares, listas de strings e funções de correspondência também são suportadas.
    • @testset foo() agora pode ser usado para criar um conjunto de testes a partir de uma determinada função. O nome do caso de teste é o nome da função que está sendo chamada. A função chamada pode conter @test e outras definições de @testset, inclusive para chamadas para outras funções, enquanto registra todos os resultados de testes intermediários.
    • TestLogger e LogRecord agora são exportados da biblioteca de testes padrão.
  • Distribuído
    • SSHManager agora oferece suporte a threads de trabalho com um wrapper csh/tcsh por meio do método addprocs() e do parâmetro shell=:csh.
  • Outras mudanças
    • GC.enable_logging(true) pode ser usado para registrar cada operação de coleta de lixo com o tempo e a quantidade de memória coletada.

Fonte: opennet.ru

Adicionar um comentário