编程语言 Julia 1.9 可用

Julia 1.9 编程语言版本已经发布,结合了高性能、动态类型支持和并行编程内置工具等品质。 Julia 的语法接近 MATLAB,借用了 Ruby 和 Lisp 的一些元素。 字符串操作方法让人想起Perl。 该项目代码是根据 MIT 许可证分发的。

该语言的主要特点:

  • 高性能:该项目的关键目标之一是实现接近 C 程序的性能。 Julia 编译器基于 LLVM 项目的工作,为许多目标平台生成高效的本机机器代码;
  • 支持各种编程范例,包括面向对象和函数式编程的元素。 标准库提供了异步 I/O、过程控制、日志记录、分析和包管理等功能;
  • 动态类型:该语言不需要显式定义变量的类型,类似于脚本编程语言。 支持交互模式;
  • 显式指定类型的可选能力;
  • 适用于数值计算、科学计算、机器学习和数据可视化的语法。 支持许多数值数据类型和并行计算工具。
  • 无需额外层即可直接从 C 库调用函数的能力。

Julia 1.9 的主要变化:

  • 新的语言特性
    • 允许使用“setproperty!(::Module, ::Symbol, x)”在另一个模块中进行分配。
    • 允许不在最终位置上进行多项作业。例如,字符串“a, b…, c = 1, 2, 3, 4”将被处理为“a = 1; b…, = 2, 3; c = 4"。这是通过 Base.split_rest 处理的。
    • 单字符文字现在支持与字符串文字相同的语法;那些。正如 Char 类型所允许的,该语法可以表示无效的 UTF-8 序列。
    • 添加了对 Unicode 15 规范的支持。
    • 元组和命名字符元组的嵌套组合现在可以用作类型参数。
    • 新的内置函数“getglobal(::Module, ::Symbol[, order])”和“setglobal!(::Module, ::Symbol, x[, order])”专门用于读取和写入全局变量。对于访问全局变量,现在应该优先使用 getglobal 方法而不是 getfield 方法。
  • 语言的变化
    • 1.7 版中引入的“@invoke”宏现已导出并可供使用。此外,在省略“x”参数的类型注释的情况下,它现在使用“Core.Typeof(x)”方法而不是“Any”。这是确保正确处理作为参数传递的类型所必需的。
    • 启用版本 1.7 中引入的“invokelatest”函数和“@invokelatest”宏的导出。
  • 编译器/运行时改进
    • 显着缩短首次执行时间(TTFX - 首次执行时间)。现在,预编译包会将本机代码存储在“pkgimage”中,这意味着预编译过程生成的代码在包加载后不需要重新编译。可以使用“--pkgimages=no”选项禁用 pkgimages 模式。
    • 类型推断的已知二次复杂度问题已得到解决,并且推断总体上使用更少的内存。一些具有自动生成的长函数的边缘情况(例如具有偏微分方程和大型因果模型的 ModelingToolkit.jl)编译速度要快得多。
    • 使用没有具体类型的参数的调用现在可以针对注入或静态解析进行联合分割优化,即使有多个不同类型的候选者可供调度。通过静态解析“@nospecialize-d”调用站点并避免重新编译,可以在对象类型未完全静态解析的某些情况下提高性能。
    • Base 模块中 @pure 宏的所有使用均已替换为 Base.@assume_effects。
    • 调用 invoke(f, invokesig, args...) 的具体类型比通常用于 f(args...) 的类型少,不再导致包被重新编译。
  • 命令行选项的更改
    • 在 Linux 和 Windows 上,“--threads=auto”选项现在尝试根据 CPU 关联性(通常在 HPC 和云环境中设置的掩码)确定可用的处理器数量。
    • “--math-mode=fast”参数被禁用,建议使用“@fastmath”宏,它具有明确定义的语义。
    • “--threads”参数现在的格式为“auto | N[,auto|M]”,其中 M 表示要创建的交互式线程的数量(当前 auto 表示 1)。
    • 添加了选项“--heap-size-hint=” ”,它设置阈值,在此阈值之后活动垃圾收集开始。大小可以以字节、千字节 (1000 KB)、兆字节 (300 MB) 或千兆字节 (1,5 GB) 为单位指定。
  • 多线程的变化
    • “Threads.@spawn”现在有一个可选的第一个参数,其值为“:default”或“:interactive”。交互式任务需要较低的响应延迟,并且设计得较短或频繁执行。如果在启动 Julia 时指定了交互式任务,则交互式任务将在交互式线程上运行。
    • 在 Julia 运行时之外运行的线程(例如来自 C 或 Java)现在可以使用“jl_adopt_thread”调用 Julia 代码。当通过“cfunction”或“@ccallable”入口点输入 Julia 代码时,这种情况会自动发生。因此,线程数现在可以在执行期间发生变化。
  • 新的库函数
    • 新函数“Iterators.flatmap”。
    • 新函数“pkgversion(m::Module)”用于获取加载给定模块的包的版本,类似于“pkgdir(m::Module)”。
    • 新函数“stack(x)”将“reduce(hcat, x::Vector{<:Vector})”推广到任何维度,并允许迭代器的任何迭代器。 “stack(f, x)”方法概括了“mapreduce(f, hcat, x)”并且效率更高。
    • 用于分析已分配内存的新宏“@allocations”,类似于“@alulated”,不同之处在于它返回内存分配的数量,而不是已分配内存的总大小。
  • 新库功能
    • “RoundFromZero”现在适用于“BigFloat”以外的类型。
    • 现在可以使用“sizehint!”手动缩小“Dict”
    • “@time”现在单独指定重新编译无效方法所花费的时间百分比。
  • 标准库的更改
    • 修复了 Dict 和其他派生对象(例如keys(::Dict)、values(::Dict) 和 Set)的迭代方法中的并发问题。现在,只要没有修改字典或集合的操作,就可以在字典或集合上并行调用无限数量的线程。
    • 现在,对谓词函数“!f”取反将返回复合函数“(!) ∘ f”,而不是匿名函数。
    • 维度切片函数现在可以跨多个维度工作:“eachslice”、“eachrow”和“eachcol”返回一个“Slices”对象,允许分派提供更有效的方法。
    • 将“@kwdef”宏添加到公共 API。
    • 修复了“fld1”中操作顺序的问题。
    • 排序现在始终是时间稳定的(QuickSort 已重新设计)。
    • “Base.splat”现已导出。返回值是“Base.Splat”类型而不是匿名函数,因此可以很好地输出。
  • 包管理器
    • “包扩展”:支持从 Julia 会话中加载的其他包加载代码片段。该应用程序类似于“Requires.jl”包,但支持预编译和设置兼容性。
  • 线性代数库
    • 由于存在与按元素除法混淆的风险,删除了标量“a”和向量“b”的“a/b”和“b\a”方法,它们相当于“a * pinv(b)”。
    • 现在调用 BLAS 和 LAPACK 使用“libblastrampoline (LBT)”。默认提供 OpenBLAS,但不支持使用其他 BLAS/LAPACK 库构建系统映像。相反,建议使用 LBT 机制将 BLAS/LAPACK 替换为另一组现有的库。
    • “lu”支持新的矩阵旋转策略“RowNonZero()”,该策略选择第一个非零旋转元素以与新算术类型一起使用并用于训练目的。
    • “normalize(x, p=2)”现在支持任何标准化向量空间“x”,包括标量。
    • BLAS 线程的默认数量现在等于 ARM 架构上的 CPU 线程数量,以及其他架构上的 CPU 线程数量的一半。
  • Printf:针对格式不正确的字符串重新设计了错误消息,以提高可读性。
  • Profile:新函数“Profile.take_heap_snapshot(file)”,它以 Chrome 支持的基于 JSON 的“.heapsnapshot”格式写入文件。
  • 随机:randn 和 randexp 现在适用于定义 rand 的任何 AbstractFloat 类型。
  • 替换
    • 现在按“Alt-e”组合键可打开编辑器中的当前输入。当您退出编辑器时,内容(如果修改)将被执行。
    • 可以使用函数“REPL.activate(::Module)”或通过在 REPL 中输入模块并按组合键“Alt-m”来更改 REPL 中当前活动的模块上下文(默认为 Main)。
    • “编号提示”模式打印每个输入和输出的数字并将评分结果存储在 Out 中,可以使用“REPL.numbered_prompt!()”激活。
    • 制表符补全显示可用的关键字参数。
  • SuiteSparse:将“SuiteSparse”求解器的代码移至“SparseArrays.jl”。求解器现在由“SuiteSparse.jl”重新导出。
  • 稀疏数组
    • “SuiteSparse”求解器现在可作为“SparseArrays”子模块使用。
    • 通过消除全局变量和使用锁,改进了 UMFPACK 和 CHOLMOD 线程保护模式。多线程“ldiv!”现在可以安全地执行 UMFPACK 对象。
    • 实验函数“SparseArrays.allowscalar(::Bool)”允许您禁用或启用稀疏数组的标量索引。此函数旨在检测“SparseMatrixCSC”对象的随机标量索引,这是性能问题的常见根源。
  • 测试套件的新故障安全模式可在发生故障或错误时提前终止测试运行。通过“@testset kwarg failurefast=true”或“export JULIA_TEST_FAILFAST=true”进行设置。在 CI 运行中有时需要这样做才能尽早接收错误消息。
  • 日期:空字符串不再被错误地解析为有效的“DateTime”、“Dates”或“Times”值,而是在构造函数和解析中抛出“ArgumentError”,而“tryparse”不返回任何内容。
  • 包分发
    • 现在,在添加本地工作进程(例如使用“addprocs(N::Int)”或使用命令行标志“--procs=N”)时,会传播包配置(活动项目、“LOAD_PATH”、“DEPOT_PATH”)。
    • 本地工作进程的“addprocs”现在接受名为“env”的参数以将环境变量传递给工作进程。
  • Unicode:“graphemes(s, m:n)”返回“s”中第 m 到第 n 个字素的子字符串。
  • DelimitedFiles 软件包已从系统库中删除,现在作为单独的软件包分发,必须显式安装才能使用。
  • 外部依赖
    • 在 Linux 中,会自动检测 libstdc++ 系统库的版本,如果较新,则加载它。旧的 libstdc++ 内置加载行为,无论系统版本如何,都可以通过设置环境变量“JULIA_PROBE_LIBSTDCXX=0”来恢复。
    • 从 julia 二进制文件中删除了“RPATH”,这可能会破坏 Linux 上无法定义“RUNPATH”变量的库。
    • 工具改进:“MethodError”和方法(例如来自“methods(my_func)”)的输出现在根据堆栈跟踪中方法的输出原则进​​行格式化和着色。

    来源: opennet.ru

添加评论