OTP 25 版本候選版 1

2022 年 2 月 16 日 · 作者:Kenneth Lundin

OTP 25-rc1 #

Erlang/OTP 25-rc1 是 OTP 25.0 正式發布前的三個版本候選版中的第一個。

此版本發布的目的是為了獲得使用者的回饋。我們歡迎所有回饋,即使只是告知您它運作正常。我們鼓勵使用者試用並提供回饋,您可以透過以下方式:在這邊建立 issue https://github.com/erlang/otp/issues,或發文至 Erlangforums 或寄信至郵件列表 erlang-questions@erlang.org

所有版本的產物皆可從 Erlang/OTP Github 發布頁面下載,您也可以在 https://erlang.dev.org.tw/documentation/doc-13.0-rc1/doc/ 查看新文件。您也可以使用 kerl 安裝最新的版本,如下所示:kerl build 25.0-rc1 25.0-rc1

Erlang/OTP 25 是一個新的主要版本,具有新功能、改進以及一些不相容性。以下重點介紹一些新功能。

非常感謝所有貢獻者!

以下是此版本的一些重點

重點 #

erts & jit #

  • JIT 現在適用於 64 位元的 ARM 處理器。
  • JIT 現在會根據 BEAM 檔案中的類型資訊進行基於類型的最佳化。
  • 改進了 JIT 對外部工具(如 perfgdb)的支援,使其可以顯示行號,甚至在可以找到的情況下顯示原始的 Erlang 原始碼。

erts、stdlib、kernel #

  • 使用者現在可以使用 {write_concurrency, auto} 選項配置 ETS 表格。此選項會強制表格在執行時自動更改使用的鎖數量,具體取決於檢測到的並發量。當 {write_concurrency, auto} 啟用時,預設會啟用 {decentralized_counters, true} 選項。

    比較此選項與其他 ETS 最佳化選項的基準測試結果可在此處取得:基準測試

  • 為了啟用更多最佳化,使用 OTP 21 或更早版本編譯的 BEAM 檔案無法在 OTP 25 中載入。
  • 具有程序標誌 message_queue_data=off_heap 的程序的訊號佇列已最佳化,允許平行接收來自多個程序的訊號。當許多程序平行傳送至一個程序時,這可以提高效能。請參閱基準測試
  • Erlang 安裝目錄現在可以在檔案系統上重新定位,前提是安裝的 RELEASES 檔案中的路徑是相對於安裝根目錄的路徑。
  • 名為 short 的新選項已新增至 erlang:float_to_list/2erlang:float_to_binary/2 函數。此選項會建立給定浮點數的最短、正確四捨五入的字串表示形式,該表示形式可以轉換回相同的浮點數。
  • uri_string 模組中引入 quote/1unquote/1 函數 - 取代已棄用的函數 http_uri:encodehttp_uri:decode
  • 新的模組 peer 取代了 slave 模組。slave 模組現在已棄用,並將在 OTP 27 中移除。
  • 由於網路問題,global 現在預設會防止重疊分割。這是透過主動與報告其已失去與其他節點連線的節點斷開連線來完成的。這將會形成完全連線的分割區,而不是讓網路處於重疊分割的狀態。

    可以透過將 kernel 配置參數 prevent_overlapping_partitions 設定為 false 來關閉新行為。這樣做將會保留與 OTP 24 及更早版本相同的行為。

  • gen_servergen_statemgen_eventformat_status/2 回呼已棄用,改用新的 format_status/1 回呼。

    新的回呼增加了限制和變更更多事物的可能性,而不僅僅是狀態。

  • timer 模組已現代化並提高效率,這使得計時器伺服器較不易過載。timer:sleep/1 函數現在接受任意大小的整數。

編譯器 #

  • 已實作 EEP-49 中提議的 maybe ... end 建構。它可以簡化複雜的程式碼,否則必須使用深度巢狀的 cases。

    若要啟用 maybe,請將選項 {enable_feature,maybe_expr} 提供給編譯器。在即將發布的版本候選版中,將會變更使用的確切選項,屆時也可以從正在編譯的模組內部使用。

  • 當記錄比對或記錄更新失敗時,會引發 {badrecord, ExpectedRecordTag} 例外。在此版本中,例外已變更為 {badrecord, ActualValue},其中 ActualValue 是找到的值,而不是預期的記錄。
  • 新增編譯屬性 -nifs(),以使用有關哪些函數可能被 erlang:load_nif/2 覆寫為 NIF 的資訊來增強編譯器和載入器。
  • 當使用二進位語法的二進位建構失敗時,會改善和提供更詳細的錯誤訊息。這適用於 shell 中的錯誤訊息以及 erl_error:format_exception/3,4

加密 #

  • 新增 crypto:hash_equals/2,它是雜湊值的常數時間比較。

Dialyzer #

  • 最佳化 erl_types 模組中的運算。平行化 Dialyzer 傳遞遠端。
  • 新增 missing_returnextra_return 選項,以便在規格與推斷類型不同時發出警告。這些與 overspecs 和 underspecs 類似,但不如它們詳細。
  • Dialyzer 現在更了解 min/2max/2erlang:raise/3 的類型。因此,Dialyzer 可能會產生新的警告。特別是,使用 erlang:raise/3 的函數現在可能需要具有 no_return() 回傳類型的規格,以避免不必要的警告。

雜項 #

  • 新增了新的 開發 HOWTO 指南,其中描述了在修復錯誤或開發新功能時如何建置和測試 Erlang/OTP。
  • 測試已新增至為每個開啟的 PR 執行的 Github 動作中,以便在提出錯誤修復和新功能時更早地捕獲更多錯誤。

有關新功能和潛在不相容性的更多詳細資訊,請參閱