Erlang/OTP 25.0 版本發佈
2022 年 5 月 18 日 · 作者:Henrik Nord
Erlang/OTP 25 是一個新的主要版本,包含新功能、改進以及一些不相容性。
有關新功能、錯誤修復和潛在不相容性的詳細資訊,請參閱Erlang 25.0 README 或 Erlang/OTP 25.0 下載頁面。
非常感謝所有貢獻者!
Erlang/OTP 25.0 重點 #
stdlib #
- 新增函數
filelib:ensure_path/1
將確保給定路徑的所有目錄都存在 - 在
maps
模組中新增函數groups_from_list/2
和groups_from_list/3
- 在
lists
模組中新增函數uniq/1
和uniq/2
- 為
rand
模組新增了新的 PRNG,用於快速產生偽隨機數。
compiler、kernel、stdlib、syntax_tools #
- 新增了對
EEP-60
中描述的可選功能的支援。可以使用選項(一般和 +term)在編譯期間啟用/停用功能,以用於erlc
,也可以使用檔案中的指令。類似的選項可用於erl
,以啟用/停用在運行時允許的功能。新的maybe
表達式EEP-49
作為 maybe_expr 功能完全支援。
erts & JIT #
- JIT 現在適用於 64 位 ARM 處理器。
- JIT 現在根據 BEAM 檔案中的類型資訊進行基於類型的最佳化。
- 改進了 JIT 對外部工具(如
perf
和gdb
)的支援,允許它們顯示行號,甚至在找到時顯示原始的 Erlang 原始碼。
erts、stdlib、kernel #
- 使用者現在可以使用
{write_concurrency, auto}
選項設定 ETS 表格。此選項會強制表格根據檢測到的並行量自動更改運行時使用的鎖數量。當{write_concurrency, auto}
啟用時,預設啟用{decentralized_counters, true}
選項。
比較此選項與其他 ETS 最佳化選項的基準測試結果可在此處找到:基準測試。 - 為了啟用更多最佳化,無法在 OTP 25 中載入使用 OTP 21 及更早版本編譯的 BEAM 檔案。
- 具有進程標誌
message_queue_data=off_heap
的進程的訊號佇列已最佳化,允許並行接收來自多個進程的訊號。當許多進程並行發送到一個進程時,這可以提高效能。請參閱基準測試。 - 只要安裝的 RELEASES 檔案中的路徑是相對於安裝根目錄的路徑,Erlang 安裝目錄現在就可以在檔案系統上重新定位。
- 已在函數
erlang:float_to_list/2
和erlang:float_to_binary/2
中新增名為short
的新選項。此選項會建立給定浮點數的最短正確四捨五入字串表示法,該表示法可以再次轉換回相同的浮點數。 - 在
uri_string
模組中引入quote/1
和unquote/1
函數 - 替代已棄用的函數http_uri:encode
和http_uri:decode
。 - 新的模組
peer
取代了slave
模組。slave
模組現在已棄用,將在 OTP 27 中移除。 global
現在預設會防止因網路問題導致的重疊分割。這是透過主動斷開與報告已失去與其他節點連線的節點的連線來完成的。這將導致形成完全連線的分割,而不是讓網路處於重疊分割的狀態。
可以將kernel
組態參數prevent_overlapping_partitions
設定為false
來關閉新行為。這樣做將保留與 OTP 24 及更早版本相同的行為。gen_server
、gen_statem
和gen_event
的format_status/2
回呼已棄用,以支持新的format_status/1
回呼。
新的回呼增加了限制和變更多個項目(而不僅僅是狀態)的可能性。timer
模組已進行現代化和提高效率,這使得計時器伺服器更不容易過載。timer:sleep/1
函數現在接受任意大的整數。
compiler #
- 已實作
EEP-49
中提出的maybe ... end
建構。它可以簡化複雜程式碼,否則必須使用深度巢狀的案例。
要啟用maybe
,請為編譯器提供選項{enable_feature,maybe_expr}
。確切使用的選項將在即將發行的候選版本中變更,然後也可以從正在編譯的模組內部使用。 - 當記錄匹配或記錄更新失敗時,過去會引發
{badrecord, ExpectedRecordTag}
例外。在此版本中,例外已變更為{badrecord, ActualValue}
,其中ActualValue
是找到的值,而不是預期的記錄。 - 新增編譯屬性
-nifs()
,使編譯器和載入器能夠了解哪些函數可能會被erlang:load_nif/2
覆寫為 NIF。 - 改進並更詳細地說明了二進位語法二進位建構失敗時的錯誤訊息。這適用於 shell 中的錯誤訊息以及
erl_error:format_exception/3,4
。 - 變更功能選項和指令的格式以獲得更好的一致性。
erlc
的選項和-compile(..)
指令現在的格式為{feature, feature-name, enable | disable}
。-feature(..)
現在的格式為-feature(feature-name, enable | disable)
。
crypto #
- 新增
crypto:hash_equals/2
,它是 hash 值的常數時間比較。
ssl #
- 引入新的(仍處於實驗階段)選項
{certs_keys,[cert_key_conf()]}
。透過此選項,可以使用包含相關金鑰的憑證清單來驗證用戶端或伺服器。將選擇被認為最佳且符合連線協商參數的憑證金鑰對。
public_key #
- 新增用於檢索作業系統提供的 CA 憑證的函數。
dialyzer #
- 最佳化
erl_types
模組中的操作。並行化 Dialyzer 傳遞遠端。 - 新增
missing_return
和extra_return
選項,以便在規格與推斷類型不同時引發警告。這些類似於 overspecs 和 underspecs,但不如它們詳細。 - Dialyzer 現在可以更好地理解
min/2
、max/2
和erlang:raise/3
的類型。因此,Dialyzer 可能會產生新的警告。特別是,使用erlang:raise/3
的函數現在可能需要具有no_return()
傳回類型的規格,以避免出現不必要的警告。
其他 #
- 新增了新的開發 HOWTO 指南,其中描述了在修正錯誤或開發新功能時如何建置和測試 Erlang/OTP。
- 已將測試新增至為每個開啟的 PR 執行的 Github 動作,以便在提出錯誤修復和新功能時更早地捕獲更多錯誤。
此版本和先前版本的下載連結可在此處找到