Erlang/OTP 25

此版本的 Erlang/OTP 可以從原始碼建置,或者使用適用於您的作業系統的預先建置的套件或第三方工具(例如 kerlasdf)進行安裝。

Erlang/OTP 25 重點 部落格文章

docker run -it erlang:25

重點

stdlib

  • 新的函數 filelib:ensure_path/1 將確保給定路徑的所有目錄都存在
  • maps 模組中新的函數 groups_from_list/2groups_from_list/3
  • lists 模組中新的函數 uniq/1 uniq/2
  • 新的 PRNG 加入 rand 模組,用於快速偽隨機數。

compiler、kernel、stdlib、syntax_tools

  • 增加了對 EEP-60 中描述的可選功能的支持。功能可以在編譯時通過選項(普通和 +term)到 erlc 以及文件中的指令啟用/禁用。類似的選項可以用於 erl 以啟用/禁用在運行時允許的功能。新的 maybe 表達式 EEP-49 作為 maybe_expr 功能完全支持。

erts & JIT

  • JIT 現在適用於 64 位元 ARM 處理器。
  • JIT 現在根據 BEAM 文件中的類型信息進行基於類型的優化。
  • 改進了 JIT 對外部工具(如 perfgdb)的支持,使其能夠顯示行號,甚至在可以找到原始 Erlang 原始碼時顯示原始 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 文件中的路徑是相對於安裝根目錄的路徑。
  • 已在函數 erlang:float_to_list/2erlang:float_to_binary/2 中添加一個名為 short 的新選項。此選項會建立給定浮點數的最短正確四捨五入的字串表示形式,該字串可以再次轉換回相同的浮點數。
  • 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 函數現在接受任意大的整數。

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,它是一個對雜湊值進行常數時間比較的函數。

ssl

  • 引入新的(仍處於實驗階段)選項 {certs_keys,[cert_key_conf()]}。使用此選項,可以使用帶有相關金鑰的憑證列表來驗證客戶端或伺服器。將選擇被認為最佳且與連線協商的參數相符的憑證金鑰對。

public_key

  • 新增用於檢索作業系統提供的 CA 憑證的函數。

dialyzer

  • 優化 erl_types 模組中的操作。並行化 Dialyzer 傳遞 remote。
  • 新增 missing_returnextra_return 選項,以便在規範與推斷的類型不同時引發警告。這些選項類似於 overspecs 和 underspecs,但不如它們那麼詳細。
  • Dialyzer 現在可以更好地理解 min/2max/2erlang:raise/3 的類型。因此,Dialyzer 潛在可能會產生新的警告。特別是,使用 erlang:raise/3 的函數現在可能需要一個具有 no_return() 返回類型的規範,以避免不需要的警告。

其他

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