查看内容

Scala 路线图:跳过 2.14,明年上 Scala 3

  • 2020-02-11 04:07
  • 新浦京操作系统
  • Views

Scala 官方公布了 Scala 2 接下来的发展计划,开发团队表示工作将转向 Scala 3,而不是开发 Scala 2.14。

了解二进制兼容性以及它与运行在 Linux® on POWER™ 上的不同操作环境之间的关系。考察 IBM 支持的两个 Linux on POWER 发行版,即 Red Hat Enterprise Linux (RHEL) 和 SUSE LINUX Enterprise Server (SLES),了解它们各自的各个版本之间的二进制兼容性。总体而言,通过在版本之间维护的稳定 Application Binary Interface (ABI) 可以实现从基于 2.6.9 内核的 RHEL4 顺利迁移到基于 2.6.18 内核的 RHEL5。该方法同样适用于从基于 2.6.5 内核的 SLES9 迁移到基于 2.6.16 内核的 SLES10。了解能够改善 Linux on POWER 应用程序的性能的新技术,并遵循一些步骤确保未来的多个发行版之间的二进制兼容性。[“参考资料” 部分提供额外的参考内容 —— 编辑。]

图片 1

现在有许多可用的 Linux 发行版。尽管 Red Hat 和 SUSE LINUX 是 IBM 支持的 Linux on POWER 解决方案供应商,但其他发行版(比如 Gentoo、Debian 和 Ubuntu)也逐渐变成流行的 Linux on POWER 解决方案。应用程序通常喜欢确保他们的应用程序能够运行在多个发行版上,以及运行在同一个发行版的不同版本上。理解与二进制兼容性相关的问题之后,就能够 实现这些目标。本文定义二进制兼容性、讨论维护兼容性的考虑事项并探讨不同版本之间的迁移,包括 Red Hat Enterprise Linux 的版本 4 和 5,SUSE LINUX Enterprise Server 的版本 9 和 10。此外,还提供确保应用程序能够跨多个发行版实现兼容性的实践。

重点虽然转移到 Scala 3,但将继续维护 Scala 2.13,以确保社区有足够的时间谨慎地过渡到 Scala 3。

表 1 显示了软件级别,以及本文将要详细讨论的 RHEL4、RHEL5、SLES9 和 SLES10 中受支持的特性:

长期以来,开发团队认为必须有 2.14 版本才能确保顺利过渡到 3,但是经过大量的研究和讨论,现在确信完全不需要 2.14。这样可以带来两方面的好处:

表 1. 受支持的特性以及 RHEL 和 SLES 发行版的代码级别

  • Scala 3 将可以更快地投入生产环境。在完善编译器和升级相关工具方面,有许多工作要做,同时将帮助生态系统升级。

  • 无需为 2.14 重建 Scala 库和工具生态系统,从而节省了维护人员的时间以准备 Scala 3。

SLES8 SP4 RHEL3 U4 SLES9 SP3 RHEL4 U8 SLES10 SP2 RHEL5 U3
kernel 2.4.21 2.4.21 2.6.5 2.6.9 2.6.16 2.6.18
glibc 2.2.5 2.3.2 2.3.3 2.3.4 2.4 2.5
SMT No No Yes Yes Yes Yes
NPTL No No Yes Yes Yes Yes
NUMA No No Yes Yes Yes Yes
JDK IBM 1.3.1 IBM 1.4.2¹ IBM 1.4.2 IBM 1.4.2 IBM 1.4.2, 5.0 IBM 1.4.2, 5.0
Apache 1.3.26 2.0.46 2.0.49 2.0.52 2.2.0 2.2.3
GCC 3.2 3.2.3 3.3.3 3.4.6 4.1.2 4.1.2

主要目标是提供从 Scala 2 到 3 的平滑且增量的迁移路径,要实现此目的,Scala 2.13 和 3.0 将使用相同的标准库,并且它们的编译器后端将以相同的方式输出字节码。

¹您可以从 IBM 站点下载 IBM Developer Kit for Linux, Java™ Technology Edition。(参考资料 部分提供相关链接)。

共享标准库

使用图 1 中显示的流程图确定应用程序在 RHEL 或 SLES 上是否实现二进制兼容。

共享标准库消除了 Scala 2.13 和 3 之间的主要潜在差异,并有助于迁移。

图 1. 确定应用程序的二进制兼容性
图片 2

但是,这也意味着对标准库的二进制不兼容更改将不得不等到 Scala 3.x 系列中的稍后版本,届时将拥有补救二进制不兼容的工具。更具体地说,由于 Scala 2.13 在其系列之内保持向前和向后二进制兼容,因此无法添加或删除任何类或方法。


如果在从 2 到 3 的迁移期间,迫切需要在这些限制之外发展标准库,开发团队可能最终仍会选择发布 Scala 2.14 版本。

二进制兼容性概述

共享的 ABI

Linux on POWER 的二进制兼容性通过遵循 Application Binary Interface (ABI) 来实现。ABI 是一个接口,编译后的二进制文件通过它访问操作系统及其服务。当多个操作环境支持相同的 ABI 时,就可以在这些操作环境中运行相同的二进制文件。可以在 “64-bit PowerPC ELF Application Binary Interface Supplement 1.7” 中找到关于 PowerPC® Executable 和 Linking Format (ELF) ABI 的 64 位补充的更多信息(参考资料 部分提供相关链接)。

除了标准库,通过共享 ABI,Scala 3.0 和 2.13 工件可以共同存于类路径上并且可以无缝地互操作,这样可以逐步迁移并简化测试。

二进制兼容性是指能够在特定处理器系列的多个环境中运行二进制文件的能力。这些环境可能是相同 Linux 发行版的不同版本,或者是完全不同的版本。例如,在基于 POWER6™ 处理器并运行 SLES10 的系统上运行可以在基于 POWER5™ 处理器并运行 SLES10 的系统上编译和运行的二进制文件。另一个例子是,在基于 POWER6™ 处理器并运行 SLES10 的系统上运行可以在基于 POWER5™ 处理器并运行 RHEL4 的系统上编译和运行的二进制文件。

目前 Scala 3 已经向后兼容,它可以使用由 Scala 2.13 构建的库。为了实现向前兼容,Scala 3 编译器将提供一种机制来确保公共接口位于公共语言子集中,以便可以在 Scala 2.13 中使用它。这意味着作为库作者的开发者可以直接使用某些 Scala 3 内容,而无需从 Scala 2.13 升级。


除了技术互操作性之外,开发团队还将关注于测试和改进工具,以确保顺利迁移。例如,原定于 2.14 版本中进行的迁移警告将在 2.13 中实施。

处理器兼容性

除此之外,Scala 官方还罗列了一些相关问题,包括争取在 2020 年年底之前发布第一个候选版本、如何采用类型化抽象语法树 TASTy 处理二进制兼容性问题、宏无法从 2.x 直接迁移到 3.0、以及性能、测试工具与 IDE 支持等,详情查看官方说明:

处理器兼容性是与 Linux on POWER 二进制兼容性密切相关的主题。这个小节讨论在不同的 64 位 POWER 处理器之间的兼容性,以及 32 位 PowerPC 处理器和 64 位 POWER 处理器之间的兼容性。

POWER 处理器兼容性

(文/开源中国)    

“二进制兼容性概述” 小节讨论的最后一个例子涉及到在两个不同的处理器类型上运行相同的二进制文件:POWER5 处理器和 POWER6 处理器。POWER6 架构是 POWER5 架构的改进,同时又保持与 POWER5 兼容,这就允许您在这两个平台上运行相同的应用程序。

PowerPC 和 POWER 处理器兼容性

运行在本机 32 位 PowerPC 环境和 64 位 POWER 环境上的 32 位应用程序也可以实现二进制兼容性。可以在本机 Linux PowerPC 环境上执行在 64 位 Linux on POWER 系统上生成的 32 位二进制文件。能够实现这种兼容性是因为:

  • 64 位 Power Architecture 支持完整的 32 位 PowerPC 架构。
  • 64 位 Linux 内核能够处理 32 位系统调用。
  • 32 位运行时环境包含必要的 32 位库。
  • 64 位运行时环境包含必要的 32 位和 64 位库。

可以通过不同的方式生成 32 位和 64 位 Linux 二进制文件,这取决于开发平台:

  • 在 32 位 PowerPC 平台(比如运行 Linux 的 Apple Powerbook)上的本机 GNU Compiler Collection (GCC) C 编辑器能够生成可以在本机 32 位平台上,或在包含适当 32 位用户空间库的 64 位 Linux on POWER 平台上执行的 32 位二进制文件。
  • IBM XL C/C++, Version 8.0 和针对 64 位 Linux on POWER 的 GCC C 编译器能够生成 32 位和 64 为二进制可执行文件,这些文件可以在 32 位或 64 位运行时环境中执行。
  • 还 存在可以同时在 32 位 PowerPC Linux 系统和 64 位 Linux on POWER 系统上运行的跨系统编译器。这些跨系统编译器能够生成 32 位和 64 位二进制文件。不管在什么地方构建二进制文件,32 位的二进制文件都可以在 32 位 Linux 平台或 64 位 Linux 平台上运行,而生成的 64 位二进制文件仅能在 64 位 Linux on POWER 系统上运行。跨系统编译器的一个例子是 Crosstool(参考资料 部分提供相关链接)。

表 2 显示了如何为不同的开发平台生成 32 位和 64 位 Linux 二进制文件:

表 2. 生成 32 位和 64 位 Linux 二进制文件

开发平台 编译器 生成的 Linux 二进制文件
32 位 Linux on PowerPC 本机 GCC C 编译器 32 位
64 位 Linux on POWER 本机 XL C/C++ 或 GCC C 编译器 32 位或 64 位
32 位 Linux on PowerPC 或
64 位 Linux on POWER
跨系统编译器,比如 crosstool 32 位或 64 位

尽管已经演示了 32 位和 64 位环境之间的兼容性,但这并不意味着官方发行版支持这种兼容性。Red Hat 在 RHEL3 和 RHEL4 之间向前或向后支持 32 位和 64 位兼容性,而当从 SLES8 迁移到 SLES9 时,SLES8 仅支持 32 位向前兼容性。

表 3 显示了 32 位和 64 位应用程序在不同的 RHEL 和 SLES 版本上的向后和向前兼容性:

表 3. 在 RHEL 和 SLES 发行版中的 32 位和 64 位兼容性

发行版 32 位 64 位
RHEL3 > RHEL4 向前兼容 向前兼容
RHEL4 < RHEL3 向后兼容 向后兼容
SLES9 > SLES8 向前兼容 NA
SLES8 < SLES9 NA NA

优化性能

2.6 内核和 POWER6 架构包含能够改进应用程序的性能的特性。性能的改进得益于不同的库、处理器特性和编译器更新。有一些性能改进不需要修改应用程序,而另一些性能改进需要重 新编译源代码。记住,重新编译以获得性能改进可能会损害二进制文件在某些环境中的兼容性。这个小节提供一些例子,它们展示能够改进应用程序性能的 2.6 内核新特性和 POWER6 架构。

NUMA

Non-uniform Memory Access (NUMA) 是针对 Linux on POWER 在 2.6 内核中引入的,这个特性在 RHEL5 和 SLES10 的最新版本中得到进一步优化。NUMA 解决了系统中的某些处理器因为总线位置不同到达特定内存区域的时间要比其他处理器长的问题。NUMA 通过在每个总线使用更多内存总线和更少处理器来减少系统共享内存总线的争用。尽管这在包含少量处理器的系统中作用不明显,但它能够在系统包含大量处理器时 改善性能。

在 Linux 2.6.15 内核中,NUMA 优化通过指定仅本地处理器能够访问内存,从而改进了跨大型系统(处理器核在 4-8 个以上)运行的工作负载的性能。如果处理器正在查找存储在相邻的 cell board 上的内存中的数据,Linux 2.6.16 内核能够获取该信息并将其移动到本地内存中(运行速度更快),然后在本地内存中执行所需的操作,而不需重新启动该操作。

由于 POWER5 和 POWER6 架构能够扩展到 64 位处理器,大部分应用程序都得益于 2.6 内核级别的 NUMA 支持。设法提高性能的应用程序可以使用 user-land NUMA API。RHEL4 附带了 user-land NUMA API,以及更多关于如何在 NUMA Group 主页使用这些 API 的信息(参考资料 部分提供相关链接)。

使用 Linux 2.6.16 内核时,必须根据共享内存的分配方式进行一些更改。如果处理器正在查找存储在相邻的 cell board 上的内存中的数据,Linux 2.6.16 内核能够获取该信息并将其移动到本地内存中(运行速度更快),然后在本地内存中执行所需的操作,而不需重新启动该操作。

编译器改进

您可以考虑重新编译以利用 Linux on POWER 的最新编辑器的新特性带来的性能优势。现在,高性能编译器 IBM XL C/C++ Version 8 可以在基础级别的 RHEL4、SLES9 和 SLES10 上使用。IBM XL C/C++ Version 9 可以在 RHEL5 及其更新、SLES10 SP1 和 SP2 上使用。Version 9 添加了针对基于 POWER6 处理器的系统的性能改进。

-qarch 和 -qtune 选项用于为各自的架构优化性能。例如,要优化 POWER6 的性能,使用 -qarch=pwr6 和 -qtune=pwr6。此外,还引入了 -qtune=balanced 选项。这个选项与 -qarch=pwr5(或 pwr5x)一起使用时,将生成可以在 POWER5 和 POWER6 系统上运行的二进制文件,但包含能够改进 POWER6 性能的调度改进。Version 9 还包含对 AltiVec Vector Multimedia Extensions (VMX) 的支持,VMX 最初是在 IBM PowerPC 970 处理器上提供的,现在通过 -qaltivec 选项整合到 POWER6 产品系列。

GNU Compiler Collection 包含针对多种不同语言的编译器。版本 3.3 到 4.1 得到了改进,包括对其 C 编译器 gcc 的特定于 POWER6 的优化。-mcpu=power6 和 -mtune=power6 标志现在得到支持,从而导致出现针对 POWER6 架构的注册表使用和指令调度参数。此外,还包含针对 IBM PowerPC 970 和 IBM POWER6 处理器的 VMX 向量扩展,它们能够提升向量化代码的性能。尽管这些优化选项在各自的架构上改善了性能,但它们可能损害应用程序在其他平台上的二进制兼容性。

可以在 developerWorks 文章 “How to use IBM XL C/C++ Advanced Edition V8.0 for Linux on POWER: A guide for GCC users” 上找到更多关于在 Linux on POWER 上使用 XL C/C++ 编辑器的信息。

SMT

当迁移到基于 2.6 的 Linux 内核时,Simultaneous Multi-threading (SMT) 还可以提供另一项性能收益。SMT 在 POWER6 上得到支持,并且大大改进了多线程应用程序的性能。POWER6 处理器有两个能够在每个处理器周期发出多条指令的硬件指令线程,从而改善了性能。不过,SMT 可能损害线程不是很多的应用程序的性能。可以在 Linux 内核启动时向其传递 smt-enabled=off 禁用 SMT。