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