Lanzamento da linguaxe de programación Julia 1.8

O lanzamento da linguaxe de programación Julia 1.8 está dispoñible, que combina calidades como alto rendemento, soporte para dixitación dinámica e ferramentas integradas para programación paralela. A sintaxe de Julia está próxima a MATLAB, tomando prestados algúns elementos de Ruby e Lisp. O método de manipulación de cadeas lembra a Perl. O código do proxecto distribúese baixo a licenza MIT.

Características principais da lingua:

  • Alto rendemento: un dos obxectivos fundamentais do proxecto é conseguir un rendemento próximo aos programas C. O compilador Julia baséase no proxecto LLVM e xera un código de máquina nativo eficiente para moitas plataformas de destino;
  • Soporte para varios paradigmas de programación, incluíndo elementos de programación orientada a obxectos e funcional. A biblioteca estándar ofrece funcións para E/S asíncronas, xestión de procesos, rexistro, creación de perfiles e xestión de paquetes, entre outras cousas;
  • Escritura dinámica: a linguaxe non require unha definición explícita de tipos para as variables, por analoxía coas linguaxes de programación de scripts. Admite o modo interactivo;
  • Capacidade opcional para especificar de forma explícita tipos;
  • Sintaxe que é excelente para cálculos numéricos, cálculos científicos, sistemas de aprendizaxe automática e visualización de datos. Soporte para moitos tipos de datos numéricos e ferramentas para paralelizar cálculos.
  • Capacidade de chamar directamente funcións desde bibliotecas C sen capas adicionais.

Principais cambios en Julia 1.8:

  • Novas características lingüísticas
    • Os campos dunha estrutura mutable agora pódense anotar como constantes para evitar que se modifiquen e permitir a optimización.
    • As anotacións de tipo pódense engadir ás variables globais.
    • As matrices n-dimensionais baleiras pódense crear usando varios puntos e coma entre corchetes, por exemplo "[;;;]" crea unha matriz 0x0x0.
    • Os bloques Try agora poden ter opcionalmente un bloque else, que se executa inmediatamente despois do corpo principal se non se producen erros.
    • @inline e @noinline pódense colocar dentro do corpo dunha función, o que lle permite anotar unha función anónima.
    • @inline e @noinline agora pódense aplicar a unha función nun sitio de chamadas ou nun bloque para forzar a incluír (ou non incluír) as chamadas de función correspondentes.
    • ∀, ∃ e ∄ permítense como caracteres identificadores.
    • Engadido soporte para a especificación Unicode 14.0.0.
    • O método Module(:name, false, false) pódese usar para crear un módulo que non conteña nomes, non importe Base ou Core e non conteña unha referencia a si mesmo.
  • Cambios lingüísticos
    • Os obxectos de tarefas recentemente creados (@spawn, @async, etc.) agora teñen world_age para os métodos da tarefa principal cando se crean, o que permite unha execución optimizada. A opción de activación anterior está dispoñible mediante o método Base.invokelatest.
    • As directivas de formato bidireccional desequilibrado de Unicode agora están prohibidas en cadeas e comentarios para evitar inxeccións.
    • Base.ifelse agora defínese como unha función xenérica e non como unha función integrada, o que permite que os paquetes estendan a súa definición.
    • Cada asignación a unha variable global agora pasa primeiro por unha chamada para converter(Calquera, x) ou converter(T, x) se a variable global foi declarada como de tipo T. Antes de usar variables globais, asegúrese de que o invariante convert(Calquera , x) === x sempre é verdade, se non, pode provocar un comportamento inesperado.
    • As funcións integradas agora son similares ás funcións xenéricas e pódense enumerar mediante programas mediante métodos.
  • Melloras do compilador/de execución
    • O tempo de arranque reduciuse nun 25 % aproximadamente.
    • O compilador baseado en LLVM separouse da biblioteca en tempo de execución nunha nova biblioteca, libjulia-codegen. Carga por defecto, polo que non debería haber cambios durante o uso normal. Nos despregamentos que non precisan dun compilador (por exemplo, imaxes do sistema nas que está precompilado todo o código necesario), esta biblioteca (e a súa dependencia de LLVM) pode simplemente omitirse.
    • Agora é posible a inferencia de tipo condicional pasando un argumento a un método. Por exemplo, para Base.ifelse(isa(x, Int), x, 0) devolve ::Int aínda que o tipo de x sexa descoñecido.
    • Mellorouse a SROA (substitución escalar de agregados): elimina as chamadas getfield con campos globais persistentes, elimina estruturas mutables con campos non inicializados, mellora o rendemento e o manexo das chamadas getfield anidadas.
    • A inferencia de tipos fai un seguimento de varios efectos: efectos secundarios e non caídas. Tense en conta a propagación constante, o que mellora significativamente o rendemento en tempo de compilación. Nalgúns casos, por exemplo, as chamadas a funcións que non se poden integrar pero que non afectan o resultado descartaranse no tempo de execución. As regras dos efectos pódense sobrescribir manualmente mediante a macro Base.@assume_effects.
    • A precompilación (con directivas de precompilación explícitas ou cargas de traballo especificadas) agora garda máis código definido por tipo, o que resulta nunha execución máis rápida por primeira vez. Calquera combinación de método/tipo nova que necesite o seu paquete, independentemente de onde se definisen eses métodos, agora pódese almacenar na caché no ficheiro de precompilación se son chamados por un método pertencente ao seu paquete.
  • Cambios no parámetro da liña de comandos
    • O comportamento predeterminado para supervisar as declaracións @inbounds agora é a opción automática en "--check-bounds=yes|no|auto".
    • Nova opción "--strip-metadata" para eliminar cadeas de documentos, información de localización de orixe e nomes de variables locais ao crear unha imaxe do sistema.
    • Nova opción "--strip-ir" para permitir que o compilador elimine a representación do código fonte intermedia ao construír a imaxe do sistema. A imaxe resultante só funcionará se se usa "--compile=all" ou se todo o código necesario está precompilado.
    • Se se especifica o carácter "-" en lugar do nome do ficheiro, o código executable lese a partir do fluxo de entrada estándar.
  • Cambios de soporte multithreading
    • Threads.@threads utiliza de forma predeterminada a nova opción de programación :dynamic, que difire do modo anterior en que as iteracións programaranse de forma dinámica en fíos de traballo dispoñibles en lugar de asignarse a cada fío. Este modo permite unha mellor distribución dos bucles anidados con @spawn e @threads.
  • Novas funcións da biblioteca
    • eachsplit(str) para executar split(str) varias veces.
    • allequal(itr) para comprobar se todos os elementos dun iterador son iguais.
    • hardlink(src, dst) pódese usar para crear ligazóns duras.
    • setcpuaffinity(cmd, cpus) para establecer a afinidade do núcleo do procesador cos procesos iniciados.
    • diskstat(path=pwd()) para obter estatísticas do disco.
    • Nova macro @showtime para mostrar tanto a liña que se está avaliando como o informe @time.
    • Engadíronse a macro LazyString e lazy"str" ​​para admitir a construción perezosa de mensaxes de erro nas rutas de erro.
    • Solucionouse un problema de concorrencia en Dict e outros obxectos derivados, como claves(::Dict), valores(::Dict) e Set. Agora pódense chamar métodos de iteración nun dicionario ou conxunto, sempre que non haxa chamadas que modifiquen o dicionario ou conxunto.
    • @time e @timev agora teñen unha descrición opcional, que che permite anotar a fonte dos informes de tempo, por exemplo. @time "Avaliando foo" foo().
    • range toma stop ou length como único argumento de palabra clave.
    • Precision e setprecision agora aceptan base como palabra clave
    • Os obxectos de socket TCP agora proporcionan un método de escritura pechada e admiten o uso do modo semiaberto.
    • extrema agora acepta un argumento init.
    • Iterators.countfrom agora acepta calquera tipo que defina un método +.
    • @time agora asigna o % do tempo dedicado a recompilar métodos con tipos modificados.
  • Cambios estándar da biblioteca
    • Chaves con valor Nada agora se elimina do ambiente en addenv.
    • Iteradores.reverse (e polo tanto último) admite cada liña.
    • A función de lonxitude para intervalos de certos tipos xa non verifica o desbordamento de enteiros. Hai unha nova función, checked_length, que contén lóxica de control de transferencia de bits. Se é necesario, use SaferIntegers.jl para construír o tipo de intervalo.
    • O iterador Iterators.Reverse implementa cada reversión de índice se é posible.
  • Xestor de paquetes
    • Novos indicadores ⌃ e ⌅ xunto aos paquetes no estado “pkg>” para os que hai novas versións dispoñibles. ⌅ indica que non se poden instalar novas versións.
    • Novo argumento obsoleto::Bool para Pkg.status (--outdated ou -o no modo REPL) para mostrar información sobre paquetes de versións anteriores.
    • Novo argumento compat::Bool para Pkg.status (--compat ou -c no modo REPL) para mostrar calquera entrada [compat] en Project.toml.
    • Novo modo "pkg>compat" (e Pkg.compat) para configurar entradas de compatibilidade do proxecto. Proporciona un editor interactivo mediante "pkg>compat" ou control directo de rexistros mediante "pkg>Foo 0.4,0.5, 0.4,0.5", que pode cargar os rexistros actuais mediante a realización da pestana. É dicir, "pkg> compat Fo " actualízase automaticamente a "pkg>Foo XNUMX" para permitir a edición dunha entrada existente.
    • Agora Pkg só tenta descargar paquetes dun servidor de paquetes se o servidor está a supervisar o rexistro que contén o paquete.
    • Pkg.instantiate agora emitirá un aviso cando Project.toml non estea sincronizado con Manifest.toml. Faino baseándose nun hash dos rexistros de deps e compat do proxecto (outros campos ignóranse) no manifesto ao resolvelo, de xeito que calquera cambio nos rexistros de deps ou compat de Project.toml pode detectarse sen volver resolver.
    • Se "pkg>add" non pode atopar un paquete co nome dado, agora suxerirá paquetes con nomes similares que se poidan engadir.
    • A versión de julia almacenada no manifesto xa non inclúe o número de compilación, o que significa que o mestre agora escribirase como 1.9.0-DEV.
    • O aborto da proba "pkg>" agora detectarase de forma máis consistente e devolverase correctamente ao REPL.
  • InteractiveUtils
    • Nova macro @time_imports para informar do tempo dedicado á importación de paquetes e as súas dependencias, destacando o tempo de compilación e recompilación como porcentaxe das importacións.
  • Álxebra lineal
    • O submódulo BLAS agora admite funcións BLAS spr! de nivel 2.
    • A biblioteca estándar LinearAlgebra.jl agora é completamente independente de SparseArrays.jl, tanto desde a perspectiva do código fonte como das probas unitarias. Como consecuencia, xa non se devolven matrices dispersas (implícitamente) polos métodos de LinearAlgebra aplicados a obxectos Base ou LinearAlgebra. En particular, isto leva aos seguintes cambios:
      • As concatenacións que usan matrices especiais "esparsas" (por exemplo, diagonal) agora devolven matrices densas; Como consecuencia, os campos D1 e D2 dos obxectos SVD creados polas chamadas getproperty son agora matrices densas.
      • O método similar(::SpecialSparseMatrix, ::Type, ::Dims) devolve unha matriz nula densa. Como consecuencia, os produtos de matrices tridiagonais de dúas, tres e simétricas entre si levan á xeración dunha matriz densa. Ademais, a construción de matrices similares con tres argumentos de matrices especiais "esparsas" a partir de matrices (non estáticas) agora falla debido a "cero(::Tipo{Matrix{T}})".
  • Printf
    • %s e %c agora usan o argumento de ancho de texto para formatar o ancho.
  • Perfil
    • O perfil de carga da CPU agora rexistra metadatos, incluíndo fíos e tarefas. Profile.print() ten un novo argumento groupby que che permite agrupar fíos, tarefas ou subfíos/tarefas, tarefas/fíos e argumentos de fíos e tarefas para proporcionar filtrado. Ademais, agora infórmase a porcentaxe de utilización como global ou por fío, dependendo de se o fío está inactivo ou non en cada mostra. Profile.fetch() inclúe os novos metadatos por defecto. Para a compatibilidade con usuarios externos de datos de perfil, pódese excluír pasando include_meta=false.
    • O novo módulo Profile.Allocs permítelle perfilar as asignacións de memoria. Rexístrase un rastro de pila do tipo e tamaño de cada asignación de memoria e o argumento sample_rate permite omitir un número configurable de asignacións, reducindo a sobrecarga de rendemento.
    • Agora o usuario pode executar o perfil de CPU de duración fixa mentres se executan tarefas sen cargar previamente o perfil, e o informe mostrarase mentres se executa. En MacOS e FreeBSD, prema ctrl-t ou chame a SIGINFO. Para outras plataformas, active SIGUSR1, é dicir. % kill -USR1 $julia_pid. Isto non está dispoñible en Windows.
  • REPL
    • RadioMenu agora admite atallos de teclado adicionais para a selección directa de opcións.
    • A secuencia "?(x, y" seguida de premer TAB mostra todos os métodos que se poden chamar cos argumentos x, y, .... (Un espazo inicial impide que entre no modo de axuda.) "MyModule.?(x, y " restrinxe a busca a "MyModule". Premer TAB require que polo menos un argumento sexa dun tipo máis específico que Calquera. Ou use SHIFT-TAB en lugar de TAB para permitir calquera método compatible.
    • A nova variable global err permítelle obter a última excepción, similar ao comportamento de ans coa última resposta. Ao introducir err reimprime a información da excepción.
  • SparseArrays
    • Moveuse o código SparseArrays do repositorio Julia ao repositorio externo SparseArrays.jl.
    • As novas funcións de concatenación sparse_hcat, sparse_vcat e sparse_hvcat devolven un tipo SparseMatrixCSC independentemente dos tipos de argumentos de entrada. Isto fíxose necesario para unificar o mecanismo de pegado de matrices despois de separar o código LinearAlgebra.jl e SparseArrays.jl.
  • Logging
    • Os niveis de rexistro estándar BelowMinLevel, Debug, Info, Warn, Error e AboveMaxLevel agora expórtanse desde a biblioteca de rexistro estándar.
  • Unicode
    • Engadiuse a función isequal_normalized para comprobar a equivalencia de Unicode sen construír de forma explícita cadeas normalizadas.
    • A función Unicode.normalize agora acepta a palabra clave charttransform, que se pode usar para proporcionar asignacións de caracteres personalizadas, e tamén se proporciona a función Unicode.julia_chartransform para reproducir a asignación utilizada cando o analizador Julia normaliza os identificadores.
  • Proba
    • Agora pódese usar '@test_throws "algunha mensaxe" triggers_error()' para comprobar se o texto de erro mostrado contén un erro de "algunha mensaxe", independentemente do tipo de excepción específico. Tamén se admiten expresións regulares, listas de cadeas e funcións de coincidencia.
    • @testset foo() agora pódese usar para crear un conxunto de probas a partir dunha función determinada. O nome do caso de proba é o nome da función que se chama. A función chamada pode conter @test e outras definicións de @testset, incluídas as chamadas a outras funcións, mentres se gravan todos os resultados das probas intermedias.
    • TestLogger e LogRecord son agora exportados desde a biblioteca de probas estándar.
  • Distribuído
    • SSHManager agora admite fíos de traballo cun envoltorio csh/tcsh mediante o método addprocs() e o parámetro shell=:csh.
  • Outros cambios
    • GC.enable_logging(true) pódese usar para rexistrar cada operación de recollida de lixo co tempo e a cantidade de memoria recollidas.

Fonte: opennet.ru

Engadir un comentario