回顧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中文網其他相關文章!