A linguaxe de programación Julia 1.9 dispoñible

Publicouse o lanzamento da linguaxe de programación Julia 1.9, que combina calidades como alto rendemento, soporte para dixitación dinámica e ferramentas integradas para programación paralela. A sintaxe de Julia é próxima a MATLAB, con algúns elementos tomados 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.9:

  • Novas características lingüísticas
    • Permitir que as asignacións se fagan noutro módulo usando "setproperty!(::Module, ::Symbol, x)".
    • Admítense tarefas múltiples que non están na posición final. Por exemplo, a cadea "a, b..., c = 1, 2, 3, 4" procesarase como "a = 1; b..., = 2, 3; c = 4". Isto faise a través de Base.split_rest.
    • Os literais dun só carácter agora admiten a mesma sintaxe que os literais de cadea; aqueles. a sintaxe pode representar secuencias UTF-8 non válidas, como o permite o tipo Char.
    • Engadido soporte para a especificación Unicode 15.
    • Agora pódense usar combinacións anidadas de tuplas e tuplas de caracteres con nome como parámetros de tipo.
    • Novas funcións integradas "getglobal(::Module, ::Symbol[, order])" e "setglobal!(::Module, ::Symbol, x[, order])" para ler e escribir exclusivamente en variables globais. Agora debería preferirse o método getglobal sobre o método getfield para acceder ás variables globais.
  • Cambios lingüísticos
    • A macro "@invoke" introducida na versión 1.7 xa está exportada e dispoñible para o seu uso. Ademais, agora usa o método "Core.Typeof(x)" en lugar de "Calquera" cando se omite a anotación do tipo para o argumento "x". Isto é necesario para que os tipos pasados ​​como argumentos se procesen correctamente.
    • Exportación activada da función "invokelatest" e da macro "@invokelatest" introducida na versión 1.7.
  • Melloras do compilador/de execución
    • Reduciuse significativamente o tempo ata a primeira execución (TTFX - Tempo ata a primeira execución). A precompilación do paquete agora garda o código nativo en "pkgimage", o que significa que o código xerado durante a precompilación non terá que recompilarse despois de cargar o paquete. O uso do modo pkgimages pódese desactivar coa opción "--pkgimages=no".
    • O problema coñecido da complexidade cuadrática da inferencia de tipo foi solucionado e, en xeral, a inferencia usa menos memoria. Algúns casos extremos con funcións longas xeradas automaticamente (como ModelingToolkit.jl con ecuacións diferenciais parciais e modelos causais grandes) compilan moito máis rápido.
    • As chamadas con argumentos non específicos de tipo agora poden optimizarse para a división da Unión para a inxección ou a resolución estática, aínda que existan varios tipos diferentes de candidatos de envío. Isto pode mellorar o rendemento en determinadas situacións nas que os tipos de obxectos non están totalmente resoltos de forma estática, resolvendo estáticamente os sitios de chamadas "@nospecialize-d" e evitando a recompilación.
    • Todos os usos da macro @pure no módulo Base substituíronse por Base.@assume_effects.
    • As chamadas para invocar(f, invokesig, args...) con tipos menos específicos que os que se usan normalmente para f(args...) xa non fan que o paquete se recompile.
  • Cambios no parámetro da liña de comandos
    • En Linux e Windows, a opción "--threads=auto" agora tenta determinar o número dispoñible de procesadores en función da afinidade da CPU, que é unha máscara que normalmente se establece en ambientes HPC e cloud.
    • Desactivouse a opción "--math-mode=rápido", no canto da cal recoméndase utilizar a macro "@fastmath", que ten unha semántica ben definida.
    • O parámetro "--threads" agora ten o formato "auto | N[,auto|M]", onde M especifica o número de fíos interactivos a crear (actualmente auto significa 1).
    • Engadiuse a opción "--heap-size-hint= ”, que establece o limiar despois do cal comeza a recollida de lixo activa. O tamaño pódese especificar en bytes, kilobytes (1000 KB), megabytes (300 MB) ou gigabytes (1,5 GB).
  • Cambios multithreading
    • "Threads.@spawn" agora ten un primeiro argumento opcional co valor ":default" ou ":interactive". Unha tarefa interactiva require baixa latencia de resposta e está deseñada para ser curta ou realizarse con frecuencia. As tarefas interactivas executaranse en fíos interactivos se se especifican ao iniciar Julia.
    • Os fíos que se lanzan fóra do tempo de execución de Julia (por exemplo, desde C ou Java) agora poden chamar ao código Julia usando "jl_adopt_thread". Isto ocorre automaticamente cando introduces o código Julia mediante "cfunction" ou o punto de entrada "@ccallable". Como consecuencia, o número de fíos agora pode cambiar no tempo de execución.
  • Novas funcións da biblioteca
    • Nova función "Iterators.flatmap".
    • Nova función "pkgversion(m::Module)" para obter a versión do paquete que cargou un módulo determinado, similar a "pkgdir(m::Module)".
    • Nova función "stack(x)" que xeneraliza "reduce(hcat, x::Vector{<:Vector})" a calquera dimensión e permite calquera iterador de iteradores. O método "stack(f, x)" xeneraliza "mapreduce(f, hcat, x)" e é máis eficiente.
    • Nova macro para analizar a memoria asignada "@allocations", similar a "@allocations", excepto que devolve o número de asignacións de memoria, non o tamaño total da memoria asignada.
  • Novas características da biblioteca
    • "RoundFromZero" agora funciona para tipos distintos de "BigFloat".
    • "Dict" agora pódese reducir manualmente con "sizehint!".
    • "@time" agora indica por separado a porcentaxe de tempo dedicado a recompilar métodos non válidos.
  • Cambios na biblioteca estándar
    • Solucionouse un problema de concorrencia nos métodos de iteración para Dict e outros obxectos derivados, como claves(::Dict), valores(::Dict) e Set. Estes métodos de iteración agora pódense chamar nun Dict ou Set en paralelo nun número ilimitado de fíos, sempre que non haxa accións que modifiquen o dicionario ou conxunto.
    • A negación da función de predicado "!f" agora devolve unha función composta "(!) ∘ f" en lugar dunha función anónima.
    • As funcións de división de dimensións agora funcionan en varias dimensións: "eachslice", "eachrow" e "eachcol" devolven un obxecto "Slices" que permite o envío para proporcionar métodos máis eficientes.
    • Engadiuse a macro "@kwdef" á API pública.
    • Solucionouse un problema coa orde das operacións en "fld1".
    • Agora a clasificación é sempre estable (QuickSort rediseñado).
    • Agora expórtase "Base.splat". O valor de retorno é de tipo "Base.Splat" en lugar dunha función anónima, o que permite inferilo ben.
  • Xestor de paquetes
    • "Extensións de paquetes": soporte para cargar un fragmento de código doutros paquetes cargados nunha sesión de Julia. A aplicación é semellante ao paquete "Requires.jl", pero admite a compatibilidade de precompilación e configuración.
  • Biblioteca de álxebra lineal
    • Debido ao risco de confusión coa división por elementos, elimináronse os métodos "a / b" e "b \ a" con escalar "a" e vector "b", que equivalían a "a * pinv(b)".
    • As chamadas BLAS e LAPACK agora usan "libblastrampoline (LBT)". OpenBLAS ofrécese por defecto, pero non se admite a creación dunha imaxe do sistema con outras bibliotecas BLAS/LAPACK. En vez diso, recoméndase utilizar o mecanismo LBT para substituír BLAS/LAPACK por outro conxunto de bibliotecas dispoñibles.
    • "lu" admite unha nova estratexia de rotación da matriz "RowNonZero()" que selecciona o primeiro elemento de rotación distinto de cero para usar cos novos tipos aritméticos e con fins educativos.
    • "normalize(x, p=2)" agora admite calquera espazo vectorial normalizado "x", incluídos os escalares.
    • O número predeterminado de fíos BLAS é agora igual ao número de fíos de CPU na arquitectura ARM e á metade do número de fíos de CPU noutras arquitecturas.
  • Printf: mensaxes de erro reelaboradas para cadeas mal formadas para unha mellor lexibilidade.
  • Perfil: nova función "Profile.take_heap_snapshot(file)" que captura un ficheiro no formato ".heapsnapshot" baseado en JSON compatible con Chrome.
  • Aleatorio: agora randn e randexp funcionan para calquera tipo AbstractFloat que defina rand.
  • REPL
    • Premendo a combinación de teclas "Alt-e" agora ábrese a entrada actual no editor. O contido (se se modifica) executarase cando o editor saia.
    • O contexto do módulo actual que está activo no REPL pódese cambiar (por defecto é Main) usando a función "REPL.activate(::Module)" ou ingresando o módulo no REPL e premendo a tecla "Alt-m" combinación.
    • O modo "indicación numerada", que imprime números para cada entrada e saída e almacena os resultados avaliados en Out, pódese activar con "REPL.numbered_prompt!()".
    • Ao completar a pestana amosa os argumentos das palabras clave dispoñibles.
  • SuiteSparse: moveuse o código para o solucionador "SuiteSparse" a "SparseArrays.jl". Agora "SuiteSparse.jl" reexporta os solucionadores.
  • SparseArrays
    • Os solucionadores SuiteSparse agora están dispoñibles como submódulos de SparseArrays.
    • Melloráronse os modos de protección de fluxos UMFPACK e CHOLMOD eliminando variables globais e utilizando bloqueos. Multiproceso "ldiv!" Os obxectos UMFPACK agora pódense executar con seguridade.
    • A función experimental "SparseArrays.allowscalar(::Bool)" permítelle desactivar ou activar a indexación escalar de matrices dispersas. Esta función está deseñada para detectar a indexación escalar aleatoria de obxectos "SparseMatrixCSC", que é unha fonte común de problemas de rendemento.
  • Novo modo de conmutación por fallo para os conxuntos de probas que finaliza unha execución de proba antes de tempo en caso de producirse un fallo ou erro. Establécese a través de "@testset kwarg failfast=true" ou "export JULIA_TEST_FAILFAST=true". Isto pode ser necesario nos lanzamentos de CI para recibir as primeiras mensaxes de erro.
  • Datas: as cadeas baleiras xa non se analizan incorrectamente como valores "DateTime", "Dates" ou "Times" válidos e, no seu lugar, xeran un erro "ArgumentError" nos construtores e na análise, mentres que "tryparse" non devolve nada.
  • Paquete distribuído
    • A configuración do paquete (proxecto activo, "LOAD_PATH", "DEPOT_PATH") propágase agora cando se engaden procesos de traballo locais (por exemplo, con "addprocs(N::Int)" ou coa marca da liña de comandos "-procs=N").
    • "addprocs" para procesos de traballo locais agora toma un argumento chamado "env" para pasar variables de ambiente aos procesos de traballo.
  • Unicode: "grafemas(s, m:n)" devolve a subcadea de grafemas mth a nth en "s".
  • O paquete DelimitedFiles foi eliminado das bibliotecas do sistema e agora distribúese como un paquete separado que debe instalarse explícitamente para poder ser usado.
  • Dependencias externas
    • Linux detecta automaticamente a versión da biblioteca do sistema libstdc++ e cárgaa se é máis recente. O comportamento antigo de cargar o libstdc++ integrado independentemente da versión do sistema pódese restaurar configurando a variable de ambiente "JULIA_PROBE_LIBSTDCXX=0".
    • Eliminouse "RPATH" do binario julia, que pode romper bibliotecas en Linux que non definen a variable "RUNPATH".
    • Melloras da ferramenta: a saída de "MethodError" e dos métodos (por exemplo, de "methods(my_func)") agora está formateada e coloreada segundo como se saen os métodos nas trazas de pila.

    Fonte: opennet.ru

Engadir un comentario