Erlang/OTP 22

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

Erlang/OTP 22 重點部落格文章

docker run -it erlang:22

潛在不相容性

  • gen_* 行為:如果伺服器啟用了透過 sys:log/2,3 記錄最後 N 條訊息,則此日誌會包含在終止報告中。
  • reltool:現在可以在 reltool 發行版本特定配置格式的 rel 元組中包含一個新元素 Opts:{rel, Name, Vsn, RelApps, Opts}。
  • 由 erlang:list_to_pid 和類似函數建立的所有外部 pid/port/refs 現在與來自該節點的具有相同編號的任何其他 pid/port/ref 比較結果相等。
  • 舊版的 erl_interface 程式庫在 OTP 22 中已棄用,並將在 OTP 23 中移除。這不適用於 ei 程式庫。
  • VxWorks 在 OTP 22 中已棄用,並將在 OTP 23 中移除。

如需完整列表,請參閱OTP 22.0 - 潛在不相容性

重點

Erts

  • 支援 Erlang 分散式協定,將大型訊號的酬載分割成多個片段。
  • ETS 選項 write_concurrency 現在也會影響並提高 ordered_set 表格的可擴展性。
  • length/1 BIF 過去會一口氣計算列表的長度而不讓出,即使列表非常長。現在,當使用長列表呼叫時,它會讓出。
  • 引入了一個新的(仍處於實驗階段的)模組 socket。它被實作為 NIF,並且其理念是盡可能「接近」作業系統層級的 socket 介面。
  • 新增了 NIF 函數 enif_term_type,透過傳回給定 term 的類型,有助於避免冗長的 enif_is_xyz 序列。這對於序列化 term 的 NIF(例如 JSON 編碼器)特別有用,它既可以提高效能,又可以提高可讀性。

編譯器

  • 編譯器已重寫為在內部使用基於靜態單一賦值 (SSA) 的中間表示法。新的中間表示法使得更多最佳化成為可能。
  • 二進位匹配最佳化現在比以前適用於更多情況。
  • 類型最佳化現在應用於本地函數呼叫,並將比以前刪除更多多餘的類型測試。
  • 所有可以在原始碼檔案中給出的編譯器選項現在都可以在 erlc 的命令列上的選項列表中給出。
  • 在 OTP 22 中,HiPE(原生程式碼編譯器)無法完全運作。原因是 HiPE 原生程式碼編譯器不支援用於二進位匹配的新 BEAM 指令。如果使用 +native 選項叫用 erlc,並且使用了任何新的二進位匹配指令,則編譯器將發出警告並產生沒有原生程式碼的 BEAM 檔案。
  • erlc 現在可以自動使用編譯伺服器,以避免在多檔案專案中為每個要編譯的檔案啟動 Erlang 系統。請參閱文件以了解如何啟用它。(22.1)

標準函式庫

  • Cover 現在使用 counters 模組而不是 ets 來更新計數器。新的函數 cover:local_only/0 允許在受限但更快的本機模式下執行 Cover。速度的提高將取決於被 cover 編譯的程式碼類型,例如,使用新的 Cover,編譯器測試套件的執行速度會快兩倍以上。
  • 透過 socket 模組提供了一個簡單的 socket API。這是一個低階 API,它並未取代 gen_[tcp udp sctp]。它旨在最終取代 inet 驅動程式。它還提供了一個基本的 API,有助於實現 TCP、UDP 和 SCTP 以外的其他協定。已知問題是:不支援 Windows 作業系統(目前),以及少量的 term 洩漏。此功能在 OTP 22 中將被歸類為實驗性功能。
  • SSL:現在使用新的 logger API,包括日誌級別和詳細的除錯日誌。
  • SSL:基本支援 TLS 1.3 伺服器以供實驗使用。
  • Crypto:新的 hash_info/1 和 cipher_info/1 函數會傳回包含引數中雜湊或密碼相關資訊的映射。
  • 實作 uri_string:resolve/{2,3},可用於解析相對於基礎 URI 的 URI 參考。(22.3)