回顾2024年,展望未来。
2024 年对于 stdlib 来说是具有里程碑意义的一年,充满了进步、创新和社区成长。回顾过去,stdlib 社区成员花费了大量的时间和精力来完善现有 API、开发新功能以及为令人兴奋的未来道路奠定基础,这让我印象深刻。我非常幸运能够成为积极塑造网络科学计算未来的社区的一员,并且我对我们在未来几个月继续取得成功充满信心。
在这篇文章中,我将回顾一些关键亮点,并预示 2025 年将会发生的事情。虽然我将对个人贡献者进行各种赞扬,但如果没有整个团队的努力,我们今年所取得的一切成就都不会发生标准库社区。社区在使 stdlib 取得成功所需的艰苦工作中发挥了重要作用,从查找和修补错误到审查拉取请求和分类问题,再到深入研究数值算法和软件设计的杂草。如果我没有提到您的名字,请务必知道您的努力得到了认可和高度赞赏。非常感谢所有参与者以及一路上大大小小的帮助过的人。 ❤️
过去的一年对于 stdlib 来说是变革性的一年,其特点是显着的增长、创新和社区贡献。一些关键亮点包括:
随着 stdlib 的快速发展和我们全球社区的集体努力,我们正在塑造网络科学计算的未来。加入我们,让我们在这个激动人心的旅程中迈出下一步!
首先,我们来看一些高水平的年终统计数据。今年,
这些成就反映了我们社区的辛勤工作和奉献精神。这是忙碌的一年,我们被迫批判性地思考如何在项目和社区不断发展的同时有效地扩展项目和社区的规模。这意味着投资于工具和自动化,改进我们的审核和发布流程,并找出快速识别和提高新贡献者技能的方法。
2024 年真正推动 stdlib 发展的一个事件是我们接受 Google Summer of Code (GSoC)。我们之前在2023年申请过,但被拒绝了。所以当我们在2024年申请时,我们认为机会不大。令我们惊讶和高兴的是,stdlib 被接受了,从而引发了我们疯狂地整合我们的事务,以便我们能够应对即将到来的贡献者的涌入。
GSoC 最终为 stdlib 带来了变革性的体验,引入了才华横溢的贡献者并推动了关键项目。正如我们在 GSoC 反思中所详述的那样,道路是坎坷的,但我们学到了很多东西,并走出了困境。不用说,我们非常幸运地拥有四位真正优秀的 GSoC 贡献者:Aman Bhansali、Gunj Joshi、Jaysukh Makvana 和 Snehil Shah。我将在下面的部分中更多地介绍他们的工作。
Node.js 读取-评估-打印循环 (REPL) 在 JavaScript 世界中通常是事后才想到的,既没有得到充分利用,也没有得到充分重视。从 stdlib 诞生之初,我们就希望创建更好的 REPL 体验,并集成对 stdlib 的科学计算和数据处理功能的支持。 stdlib REPL 的开发断断续续,但始终有一个目标,即匹配 Python 的 IPython 的功能和功能集,以便促进 JavaScript 中的交互式探索性数据分析。因此,当 Snehil Shah 表示有兴趣将 stdlib REPL 作为 GSoC 的一部分进行开发时,我们感到非常兴奋。
Snehil 已经在之前的一篇博客文章“欢迎颜色加入 REPL!”中介绍了他的一些工作,但他和其他人的工作涵盖了更多内容。一些亮点:
很大程度上要感谢 Snehil 的工作,我们在 2024 年离 IPython 平价更近了一步,从而改变了科学计算的 JavaScript 体验。我们还没有完成。我们仍然有拉取请求在队列中工作,我特别兴奋的一件事是我们最近开始探索添加对 Jupyter 协议的支持。请继续关注 2025 年的更多 REPL 新闻!
另一个重点领域是 stdlib 的 BLAS(Basic Linear Algebra S子程序)支持的持续开发,它为常见的线性代数运算提供了基础 API,例如向量加法、标量乘法、点乘法乘积、线性组合和矩阵乘法。进入 2024 年,stdlib 中的 BLAS 支持相当不完整,特别是在对复值浮点数据类型的支持方面。随着 Jaysukh Makvana 努力实现 stdlib 的 Complex64Array 和 Complex128Array 数据结构与内置 JavaScript 类型数组的功能对等,潮流开始发生变化。
这些努力随后为添加对复值类型数组数据类型的 1 级 BLAS 支持以及 Aman Bhansali 的工作铺平了道路,他着手在 stdlib 中进一步提供 2 级和 3 级 BLAS 支持。在最初专注于较低级别的 BLAS 跨步数组接口之后,Aman 通过添加 WebAssembly 实现以及通过更高级别的多维数组(又名 ndarray)API 添加对将 BLAS 操作应用于矩阵和向量堆栈的支持来扩展其范围。
除了传统的 BLAS 例程之外,stdlib 还包含类似 BLAS 的例程,但它们不属于参考 BLAS 的一部分。这些例程包括用于替代标量和累积求和算法的 API、对跨步数组进行排序、填充和操作跨步数组元素、NaN 值的显式处理以及其他不完全属于线性代数旗帜但在工作时很常见的操作有数据。
在 Aman 的 BLAS 工作期间,我们清理并重构了 BLAS 实现,Muhammad Haris 自愿将这些工作扩展到我们扩展的 BLAS 例程。他的努力包括将 Node.js 本机插件迁移到纯 C,以减少样板文件并利用我们广泛的 C 宏集合来编写本机插件,并进一步需要添加专用 C API 来促进与 stdlib 的 ndarray 的接口。
这些发展确保 stdlib 在为 JavaScript 开发人员提供线性代数支持方面继续处于领先地位,为数值计算提供强大的工具。虽然已经完成了很多工作,但仍有更多工作要做,BLAS 将继续成为 2025 年的焦点。
作为 Quansight Labs 实习的一部分,Pranav Goswami 在 BLAS 工作的基础上,致力于为 LAPACK 奠定基础(Linear Algebra Pack年龄)在stdlib中的支持,以便提供高阶线性代数例程来求解线性方程组,特征值问题、矩阵分解和奇异值分解。 Pranav 在他的实习后博客文章中进行了更详细的详细介绍,他试图建立一种方法来测试和记录附加实现,并利用 BLIS 的思想来创建 LAPACK 接口,该接口有助于与 stdlib 的 ndarray 进行接口,从而最大限度地减少数据移动和存储要求。虽然花费了大量时间来解决问题并迭代 API 设计,但 Pranav 在添加各种实现实用程序和近 30 个常用的 LAPACK 例程方面取得了重大进展。鉴于 LAPACK 的规模(约 1700 个例程),这项工作将在可预见的未来继续进行,因此请在未来几个月中关注更多更新!
顺便说一句,如果您有兴趣了解有关 stdlib 如何与 Fortran 库(其中许多库仍然构成现代数值计算的基石)接口的更多信息,请务必查看 Pranav 的关于从以下位置调用 Fortran 例程的博客文章使用 Node.js 的 JavaScript。
stdlib 的长期优先事项之一是继续开发用于常见数学和统计运算的矢量化例程。虽然所有标量数学内核(例如超越函数,如 sin、cos、erf、gamma 等,以及统计分布密度函数)都有 JavaScript 实现,但许多内核缺乏相应的 C 实现,而这些实现是解锁更快性能所必需的。 Node.js 和其他支持本机绑定的服务器端 JavaScript 运行时。
Gunj Joshi 和其他人试图填补这一空白,并提出了超过 160 个拉取请求,添加了专用的 C 实现。此时,只剩下一些最常用的双精度超越函数(看看你的 betainc!)。现在的工作已转向完成单精度支持并添加统计分布函数的 C 实现。我们预计这项工作将在 2025 年上半年继续进行,然后将注意力转向更高级别的 strided array 和 ndarray API,以及 WebAssembly 和 Node.js 本机附加组件的实现。
我们取得重大进展的另一个领域是改进切片和阵列操作人体工程学。数值编程语言(例如 MATLAB 和 Julia)以及专用数值计算库(例如 NumPy)的用户长期以来一直享受着简洁语法的好处,用于表达仅影响数组元素子集的操作。例如,以下代码片段演示了使用 NumPy 将数组中的所有其他元素设置为零。
import numpy as np # Create an array of ones: x = np.ones(10) # Set every other element to zero: x[::2] = 0.0
作为一种语言,JavaScript 不提供如此方便的语法,迫使用户要么使用更详细的对象方法,要么使用手动 for 循环。因此,我们试图通过利用代理对象来支持“花式索引”来解决这一差距。虽然由于属性间接寻址,使用 Proxy 对象确实会产生一些性能开销,但您现在只需要安装并导入单个包即可获得 JavaScript 中 Python 样式切片的所有好处,从而消除了详细的 for 循环和数组的需要操控明显更加符合人体工程学。
import array2fancy from '@stdlib/array-to-fancy'; // Create a plain array: const x = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; // Turn the plain array into a "fancy" array: const y = array2fancy( x ); // Select the first three elements: const v = y[ ':3' ]; // returns [ 1, 2, 3 ] // Select every other element, starting from the second element: v = y[ '1::2' ]; // returns [ 2, 4, 6, 8 ] // Select every other element, in reverse order, starting with the last element: v = y[ '::-2' ]; // returns [ 8, 6, 4, 2 ] // Set all elements to the same value: y[ ':' ] = 9; // Create a shallow copy by selecting all elements: v = y[ ':' ]; // returns [ 9, 9, 9, 9, 9, 9, 9, 9 ]
除了切片语义之外,Jaysukh 还添加了对布尔数组的 stdlib 支持,从而为布尔数组屏蔽奠定了基础。
import BooleanArray from '@stdlib/array-bool'; import array2fancy from '@stdlib/array-to-fancy'; // Create a plain array: const x = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; // Turn the plain array into a "fancy" array: const y = array2fancy( x ); // Create a shorthand alias for creating an array "index" object: const idx = array2fancy.idx; // Create a boolean mask array: const mask = new BooleanArray( [ true, false, false, true, true, true, false, false ] ); // Retrieve elements according to the mask: const z = x[ idx( mask ) ]; // returns [ 1, 4, 5, 6 ]
我们随后在添加对布尔数组掩码的支持时应用了我们的知识,以添加对整数数组索引的支持。
import Int32Array from '@stdlib/array-int32'; import array2fancy from '@stdlib/array-to-fancy'; // Create a plain array: const x = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; // Turn the plain array into a "fancy" array: const y = array2fancy( x ); // Create a shorthand alias for creating an array "index" object: const idx = array2fancy.idx; // Create an integer array: const indices = new Int32Array( [ 0, 3, 4, 5 ] ); // Retrieve selected elements: const z = x[ idx( indices ) ]; // returns [ 1, 4, 5, 6 ]
虽然上面演示了使用内置 JavaScript 数组对象进行花式索引,但我们最近将花式索引的概念扩展到了 stdlib ndarrays,我们将在以后的博客文章中详细讨论这个主题。
不用说,我们对这些发展感到特别兴奋,因为我们相信它们将显着改善 JavaScript 中交互式计算和探索性数据分析的用户体验。
最后,2024 年是自动化的一年,如果我不提及 Philipp Burckhardt 的努力,那就是我的失职。 Philipp 在改善我们的 CI 构建和测试基础设施以及提高项目的整体可扩展性方面发挥了重要作用。他的作品非常多产,但我想强调一些关键的亮点。
虽然我们在项目自动化工具方面取得了长足的进步,但我们似乎从不缺乏进一步自动化和工具改进的想法。期待 2025 年会有更多精彩! ?
那么 2025 年将会发生什么?!很高兴你问了!
我们已经在上面的章节中提到了各种举措,但是,从总体上看,我们计划在未来一年重点关注以下内容:
这绝对是一个很大的数字,而且需要一个村庄——一个致力于将网络打造成一流的数值和科学计算平台这一使命的人们的社区。如果您准备好加入我们,共同构建网络科学计算的未来,我们欢迎您加入我们。查看我们的贡献指南,了解如何参与。
展望未来,我想分享一下对今年对我意味着什么的个人反思。鉴于我们今年的增长,我常常感觉自己就像在从消防水带里喝水。而且,老实说,当您日复一日醒来看到超过 100 个来自人们想要指导、问题答案和拉取请求审核的新通知和消息时,很难不感到精疲力尽。但是,当回顾过去的一年时,我对我们所取得的成就感到非常自豪,当我看到开源贡献者不断成长和蓬勃发展时,我尤其感到振奋,有时他们会利用他们学到的经验教训作为跳板,为开源做出贡献。梦想的工作和机会。有幸看到这一点是更大的开源世界中的一种驱动动力和一种特权,我竭尽全力不认为这是理所当然的。
2024 年回顾展到此结束。回顾我们共同取得的成就,网络科学计算的未来从未如此光明!再次感谢一路上提供帮助的所有相关人员。前方的道路充满了令人兴奋的机遇,我们迫不及待地想看看 2025 年我们将共同取得什么成就。继续前进! ?
stdlib 是一个开源软件项目,致力于提供一整套强大、高性能的库来加速您的项目开发,并让您安心,因为您知道您依赖的是精心制作的高质量软件。
如果您喜欢这篇文章,请给我们一颗星? GitHub 上并考虑为该项目提供经济支持。您的贡献和持续的支持有助于确保项目的长期成功,我们深表感谢!
以上是回顾性的的详细内容。更多信息请关注PHP中文网其他相关文章!