Erlang/OTP 26.0 版本發佈

2023 年 5 月 16 日 · 作者:Henrik Nord

Erlang/OTP 26 是一個新的主要版本,具有新功能、改進以及一些不相容性

關於新功能、錯誤修正和潛在不相容性的詳細資訊,請參閱Erlang 26.0 的 READMEErlang/OTP 26.0 下載頁面

以下是此版本的一些重點:

還有一個關於重點的部落格文章

Parsetools #

  • Leex 已擴展,支援可選的欄號。

Stdlib #

  • 模組 lists 中的枚舉函數系列已擴展,新增了 enumerate/3,允許提供步進值。
  • 更新 Unicode 至 15.0.0 版本。
  • 當啟動的程序失敗時,proc_lib:start*/* 已變成同步的。這要求失敗的程序使用新的函數 proc_lib:init_fail/2,3 或退出,以指示失敗。所有 OTP 行為都已修正以執行此操作。

Shell #

Erlang Shell 中有很多新功能和改進:

  • 自動完成變數、記錄名稱、記錄欄位名稱、Map 鍵、函數參數類型和檔案名稱。
  • 在 Shell 中開啟外部編輯器以編輯目前的表達式。
  • 在 Shell 中定義記錄(帶類型)、函數、規格和類型。

新的終端機 #

  • TTY/終端機子系統已重寫。Windows 使用者會注意到 erl.exe 的功能與一般的 Unix Shell 相同,而 werl.exe 只是 erl.exe 的符號連結。這使得 Windows Erlang 終端機體驗與 Unix 相同。

編譯器和 JIT 優化: #

  • 已優化具有固定大小區段的二進制檔案的建立和比對。

  • 已優化 UTF-8 區段的建立和比對。

  • 已優化附加到二進制檔案的操作。

  • 編譯器和 JIT 現在為建立小型 Map 生成更好的程式碼,其中所有鍵都是編譯時已知的字面值。

  • 由於上述優化,base64 模組的效能已顯著提高。例如,在具有 JIT 的 x86_64 系統上,編碼和解碼都比 Erlang/OTP 25 快將近三倍。

Map #

  • EEP 58 中所建議的 Map 推導式現已實作。

  • 透過變更原子鍵的內部排序順序,已優化某些 Map 操作。這變更了小型 Map 中原子鍵的列印順序以及 maps:to_list/1maps:next/1 返回的順序(未記載)。新順序是不可預測的,並且可能會在 Erlang VM 的不同調用之間變更。

  • 引入新函數 maps:iterator/2,用於建立以確定性順序返回 Map 元素的迭代器。io:format() 中的格式字串也新增了修飾符 kK,以支援按順序列印 Map 元素。

Dialyzer #

  • 新增了在 EEP 61 中引入的新內建類型 dynamic()引入 EEP 61 的 PR,改善對漸進式類型檢查器的支援。

  • Dialyzer 有一個新的增量模式,可以透過在執行 Dialyzer 時給出 --incremental 選項來調用。這種新的增量模式很可能會在未來版本中成為預設值。

其他 ERTS、Stdlib、Kernel、Compiler #

  • 時間扭曲模式現在預設為啟用。這假設在系統上執行的所有程式碼都是時間扭曲安全的

  • 在 NIF 介面中支援 UTF-8 原子和字串,包括新的函數 enif_make_new_atomenif_make_new_atom_lenenif_get_string_length

  • 現在允許在 guard 和 match specs 中使用 BIF min/2max/2

  • 改進了選擇性接收優化,現在可以針對從其他函數返回的引用啟用。這大大提高了 gen_server:send_request/3gen_server:wait_response/2 和類似函數的效能。

  • 新的追蹤功能 call_memory。與 call_time 追蹤類似,但不是測量追蹤函數中累積的時間,而是測量追蹤函數消耗的累積堆空間。它可以用於比較不同函數對觸發垃圾收集的貢獻程度。

  • 不再需要在運行時系統中啟用功能,才能載入正在使用它的模組。在編譯時在編譯器中啟用該功能就足夠了。

  • inet:setopts/2 已新增 3 個新選項:reuseportreuseport_lbexclusiveaddruse

  • 修正當使用 JIT 時,-fno-omit-frame-pointer 會應用於所有 Erlang VM,以便諸如 perf 之類的工具可以爬取程序堆疊。

  • lists 模組中,zip 函數系列現在採用選項來允許處理不同長度的列表。

  • 新增 zip:zip_get_crc32/2 函數以從開啟的 ZIP 歸檔檔中檢索 CRC32 總和檢查碼。透過快取回呼函數來優化 gen_server

  • Erlang DNS 解析器 inet_res 模組和輔助模組已針對 RFC6891 進行更新;以處理具有 DNSSEC OK (DO) 位元的 OPT RR。

  • 引入 application:get_supervisor/1

  • 快取 OTP 啟動程式碼路徑,以限制在模組查找期間存取的資料夾數量。可以使用 -cache_boot_path false 來停用。

SSL #

  • 將用戶端預設 verify 選項變更為 verify_peer請注意,這強制要求也必須提供信任的 CA 憑證,或明確將 verify 設定為 verify_none。當使用 TLS 1.3 版本之前的 TLS 版本中定義的所謂匿名測試密碼套件時,也適用此項。

  • 已將核心 TLS (kTLS) 的支援新增至 SSL 應用程式,用於 TLS 發行 (-proto_dist inet_tls) 和 SSL 選項 {ktls, true}
  • 改進了 SSL 選項的錯誤檢查和處理。
  • 透過降低最大交握大小來緩解大型憑證鏈的記憶體使用量。這不應影響常見情況,如果需要,可以將其設定為較高的值。

  • 出於安全考量,SHA1DSA 演算法不再是預設值。

  • 新增編碼和解碼 use_srtp hello 擴充功能,以方便 DTLS 使用者實作 SRTP 功能。

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

非常感謝所有貢獻者!

此版本和先前版本的下載連結位於此處