Julia 1.8 编程语言发布

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

该语言的主要特点:

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

Julia 1.8 的主要变化:

  • 新的语言特性
    • 现在可以将可变结构的字段注释为常量,以防止它们被更改并允许优化。
    • 可以将类型注释添加到全局变量中。
    • 可以使用方括号内的多个分号来创建空的 n 维数组,例如“[;;;]”创建一个 0x0x0 数组。
    • Try 块现在可以选择有一个 else 块,如果没有抛出错误,该块将在主体之后立即执行。
    • @inline 和 @noinline 可以放置在函数体内,允许您注释匿名函数。
    • @inline 和 @noinline 现在可以应用于调用站点或块中的函数,以强制包含(或不包含)相应的函数调用。
    • ∀、∃ 和 ∄ 允许作为标识符字符。
    • 添加了对 Unicode 14.0.0 规范的支持。
    • Module(:name, false, false) 方法可用于创建不包含名称、不导入 Base 或 Core 且不包含对其自身的引用的模块。
  • 语言的变化
    • 新创建的任务对象(@spawn、@async 等)现在在创建时具有来自父任务的方法的 world_age,从而允许优化执行。 使用 Base.invokelatest 方法可以使用先前的激活选项。
    • 现在禁止在字符串和注释中使用 Unicode 不平衡双向格式化指令以避免注入。
    • Base.ifelse 现在被定义为通用函数而不是内置函数,允许包扩展其定义。
    • 现在,如果全局变量被声明为 T 类型,则每次对全局变量的赋值都会首先调用 Convert(Any, x) 或 Convert(T, x)。在使用全局变量之前,请确保不变的 Convert(Any , x) === x 始终为 true,否则可能会导致意外行为。
    • 内置函数现在类似于通用函数,并且可以使用方法以编程方式枚举。
  • 编译器/运行时改进
    • 启动时间减少约 25%。
    • 基于 LLVM 的编译器已从运行时库分离到一个新库 libjulia-codegen 中。 默认情况下会加载,因此正常使用时不应进行任何更改。 在不需要编译器的部署中(例如,预编译了所有必要代码的系统映像),可以简单地省略该库(及其 LLVM 依赖项)。
    • 现在可以通过将参数传递给方法来进行条件类型推断。 例如,对于 Base.ifelse(isa(x, Int), x, 0),即使 x 的类型未知,也会返回 ::Int。
    • SROA(聚合的标量替换)已得到改进:消除了具有持久全局字段的 getfield 调用,消除了具有未初始化字段的可变结构,提高了嵌套 getfield 调用的性能和处理。
    • 类型推断跟踪各种效果——副作用和非丢弃。 考虑到恒定传播,这显着提高了编译时性能。 例如,在某些情况下,对无法内联但不影响结果的函数的调用将在运行时被丢弃。 可以使用 Base.@assume_effects 宏手动覆盖效果规则。
    • 预编译(使用显式预编译指令或指定的工作负载)现在可以保存更多类型定义的代码,从而加快首次执行速度。 包所需的任何新方法/类型组合(无论这些方法在何处定义)现在都可以缓存在预编译文件中(如果它们由属于包的方法调用)。
  • 命令行选项的更改
    • 监视 @inbounds 声明的默认行为现在是“--check-bounds=yes|no|auto”中的 auto 选项。
    • 新的“--strip-metadata”选项可在创建系统映像时删除文档字符串、源位置信息和局部变量名称。
    • 新选项“--strip-ir”允许编译器在构建系统映像时删除中间源代码表示。 仅当使用“--compile=all”或预编译所有必需的代码时,生成的图像才有效。
    • 如果指定“-”字符而不是文件名,则从标准输入流读取可执行代码。
  • 多线程支持更改
    • Threads.@threads 默认情况下使用新的调度选项 :dynamic,它与以前的模式不同,因为迭代将在可用的工作线程之间动态调度,而不是分配给每个线程。 此模式允许使用 @spawn 和 @threads 更好地分配嵌套循环。
  • 新的库函数
    • eachsplit(str) 多次执行 split(str) 。
    • allequal(itr) 测试迭代器中的所有元素是否相等。
    • Hardlink(src, dst) 可用于创建硬链接。
    • setcpuaffinity(cmd, cpus) 设置处理器核心与已启动进程的关联性。
    • diskstat(path=pwd()) 获取磁盘统计信息。
    • 新的 @showtime 宏可显示正在评估的行和 @time 报告。
    • 添加了LazyString和lazy"str"宏来支持错误路径中错误消息的延迟构造。
    • 修复了 Dict 和其他派生对象(例如keys(::Dict)、values(::Dict) 和 Set)中的并发问题。 现在可以在字典或集合上调用迭代方法,只要不存在修改字典或集合的调用即可。
    • @time 和 @timev 现在有一个可选的描述,例如,允许您注释时间报告的来源。 @time“评估 foo”foo()。
    • range 将 stop 或 length 作为唯一的关​​键字参数。
    • precision 和 set precision 现在接受 base 作为关键字
    • TCP套接字对象现在提供closewrite方法并支持使用半开模式。
    • extrema 现在接受 init 参数。
    • Iterators.countfrom 现在接受定义 + 方法的任何类型。
    • @time 现在分配重新编译具有更改类型的方法所花费的时间百分比。
  • 标准库变更
    • 具有值的键现在不会从 addenv 的环境中删除任何内容。
    • Iterators.reverse(因此也是最后一个)支持每一行。
    • 某些类型范围的长度函数不再检查整数溢出。 一个新函数,checked_length,可用;它包含位传输控制逻辑。 如有必要,请使用 SaferIntegers.jl 构造范围类型。
    • 如果可能,Iterators.Reverse 迭代器会实现每个索引的反转。
  • 包管理器
    • 处于“pkg>”状态的软件包旁边有新的 ⌃ 和 ⌅ 指示符,表示有新版本可用。 ⌅ 表示无法安装新版本。
    • Pkg.status 的新 outdated::Bool 参数(--outdated 或 REPL 模式中的 -o)显示有关以前版本的软件包的信息。
    • Pkg.status 的新 compat::Bool 参数(REPL 模式下的 --compat 或 -c)可显示 Project.toml 中的任何 [compat] 条目。
    • 用于设置项目兼容性条目的新“pkg>compat”(和 Pkg.compat)模式。 通过“pkg>compat”提供交互式编辑器或通过“pkg>Foo 0.4,0.5”直接记录控制,可以通过制表符补全加载当前记录。 即“pkg> compat Fo " 自动更新为 "pkg>Foo 0.4,0.5" 以允许编辑现有条目。
    • 如果服务器正在监视包含软件包的注册表,则 Pkg 现在仅尝试从软件包服务器下载软件包。
    • 当 Project.toml 与 Manifest.toml 不同步时,Pkg.instantiate 现在将发出警告。 它在解析时根据清单中项目的 deps 和 compat 记录(其他字段被忽略)的哈希来执行此操作,以便可以检测到对 Project.toml deps 或 compat 记录的任何更改,而无需重新解析。
    • 如果“pkg>add”找不到具有给定名称的包,它现在会建议可以添加具有相似名称的包。
    • 存储在清单中的 julia 版本不再包含内部版本号,这意味着 master 现在将写为 1.9.0-DEV。
    • 现在将更一致地检测到测试中止“pkg>”,并将正确返回到 REPL。
  • 交互式工具
    • 新的 @time_imports 宏报告导入包及其依赖项所花费的时间,突出显示编译和重新编译时间占导入的百分比。
  • 线性代数
    • BLAS 子模块现在支持 2 级 BLAS spr! 函数。
    • LinearAlgebra.jl 标准库现在完全独立于 SparseArrays.jl,无论是从源代码还是单元测试的角度来看。 因此,应用于 Base 或 LinearAlgebra 对象的 LinearAlgebra 方法不再(隐式)返回稀疏数组。 特别是,这会导致以下重大变化:
      • 使用特殊“稀疏”矩阵(例如对角线)的串联现在返回密集矩阵; 因此,由 getproperty 调用创建的 SVD 对象的 D1 和 D2 字段现在是稠密矩阵。
      • 类似的(::SpecialSparseMatrix, ::Type, ::Dims) 方法返回稠密空矩阵。 因此,二、三和对称三对角矩阵彼此的乘积导致生成稠密矩阵。 此外,由于“zero(::Type{Matrix{T}})”,从(非静态)矩阵的特殊“稀疏”矩阵构造具有三个参数的类似矩阵现在会失败。
  • 的printf
    • %s 和 %c 现在使用 textwidth 参数来格式化宽度。
  • 本人简介
    • CPU 负载分析现在记录元数据,包括线程和任务。 Profile.print() 有一个新的 groupby 参数,允许您对线程、任务或子线程/任务、任务/线程以及线程和任务参数进行分组以提供过滤。 此外,利用率百分比现在以总体或每个线程的形式报告,具体取决于每个样本中线程是否空闲。 Profile.fetch() 默认包含新的元数据。 为了向后兼容分析数据的外部使用者,可以通过传递 include_meta=false 来排除它。
    • 新的 Profile.Allocs 模块允许您分析内存分配。 记录每个内存分配的类型和大小的堆栈跟踪,并且sample_rate参数允许跳过可配置数量的分配,从而减少性能开销。
    • 现在,用户可以在任务运行时运行固定持续时间的 CPU 分析,而无需先加载分析,并且将在运行时显示报告。 在 MacOS 和 FreeBSD 上,按 ctrl-t 或调用 SIGINFO。 对于其他平台,激活 SIGUSR1,即%杀死-USR1 $ julia_pid。 这在 Windows 上不可用。
  • 替换
    • RadioMenu 现在支持额外的键盘快捷键以直接选择选项。
    • 序列“?(x, y”,然后按 TAB 键显示可以使用参数 x, y, .... 调用的所有方法。(前导空格会阻止您进入帮助模式。)“MyModule.?(x, y " 将搜索限制为“MyModule”。按 TAB 要求至少一个参数的类型比 Any 更具体。或者使用 SHIFT-TAB 而不是 TAB 以允许任何兼容的方法。
    • 新的全局变量 err 允许您获取最新的异常,类似于带有最后响应的 ans 的行为。 输入err会重新打印异常信息。
  • 稀疏数组
    • 将 SparseArrays 代码从 Julia 存储库移至外部 SparseArrays.jl 存储库。
    • 新的串联函数稀疏_hcat、稀疏_vcat 和稀疏_hvcat 返回 SparseMatrixCSC 类型,无论输入参数的类型如何。 在分离 LinearAlgebra.jl 和 SparseArrays.jl 代码后,有必要统一粘合矩阵的机制。
  • 记录
    • 标准日志记录级别BelowMinLevel、Debug、Info、Warn、Error 和AboveMaxLevel 现在已从标准日志记录库中导出。
  • 统一
    • 添加了 isequal_normalized 函数来检查 Unicode 等效性,而无需显式构造规范化字符串。
    • Unicode.normalize 函数现在接受 Charttransform 关键字,该关键字可用于提供自定义字符映射,并且还提供 Unicode.julia_chartransform 函数来重现 Julia 解析器规范化标识符时使用的映射。
  • 测试
    • 现在可以使用“@test_throws“some message”triggers_error()”来测试显示的错误文本是否包含“some message”错误,无论具体的异常类型如何。 还支持正则表达式、字符串列表和匹配函数。
    • @testset foo() 现在可用于从给定函数创建测试集。 测试用例名称是被调用的函数的名称。 被调用的函数可能包含@test和其他@testset定义,包括对其他函数的调用,同时记录所有中间测试结果。
    • TestLogger 和 LogRecord 现在已从标准测试库导出。
  • 分布式
    • SSHManager 现在通过 addprocs() 方法和 shell=:csh 参数支持带有 csh/tcsh 包装器的工作线程。
  • 其他变化
    • GC.enable_logging(true) 可用于记录每个垃圾收集操作的时间和收集的内存量。

来源: opennet.ru

添加评论