Erlang/OTP 27.0 第二個候選版本

2024 年 3 月 20 日 · 作者:Björn Gustavsson

OTP 27.0-rc2 #

Erlang/OTP 27.0-rc2 是 OTP 27.0 正式發布前的三個候選版本中的第二個。

此版本的目的是為了取得我們使用者的回饋。我們歡迎所有回饋,即使只是告知您它對您來說運作正常。我們鼓勵使用者試用並透過在 https://github.com/erlang/otp/issues 建立 issue 或在 Erlang 論壇 發文來給予我們回饋。

所有此版本的相關檔案可以從 Erlang/OTP Github 發行頁面下載,您也可以在 https://erlang.dev.org.tw/documentation/doc-15.0-rc2/doc 查看新的文件。您也可以像這樣使用 kerl 安裝最新版本

kerl build 27.0-rc2 27.0-rc2.

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

非常感謝所有貢獻者!

RC2 的重點 #

  • 有一個新的模組 json 用於編碼和解碼 JSON

    編碼和解碼都可以自訂。解碼可以像 SAX 一樣進行,並處理多個文件和數據流。

    新的 json 模組被 ASN.1 的 jer(JSON 編碼規則)用於編碼和解碼 JSON。因此,不再需要提供外部 JSON 函式庫。

RC2 中其他值得注意的變更 #

  • 現有的實驗性歸檔文件支援將在未來版本中變更。在 escript 中支援歸檔文件將保留,但在發行版本中使用歸檔文件的支援將會受到更多限制或完全移除。

    從 Erlang/OTP 27 開始,函式 code:lib_dir/2-code_path_choice 標誌,以及使用 erl_prim_loader 讀取歸檔文件的成員都已棄用。

    為了與未來版本的 Erlang/OTP 相容,需要從其歸檔文件中檢索數據文件的 escript 腳本應該使用 escript:extract/2,而不是 erl_prim_loadercode:lib_dir/2

  • 編譯器查找選項的順序已變更。

    當在 -compile() 屬性中給定的編譯器選項和給編譯器的選項之間發生衝突時,-compile() 屬性中給定的選項會覆蓋給編譯器的選項,而後者又覆蓋 ERL_COMPILER_OPTIONS 環境變數中給定的選項。

    範例

    如果 some_module.erl 具有以下屬性

    -compile([nowarn_missing_spec]).
    

    並且編譯器的調用方式如下

    % erlc +warn_missing_spec some_module.erl
    

    對於沒有任何規格的函式,將不會發出任何警告。

  • configure 現在會自動啟用對 2038 年安全時間戳的支援。

    預設情況下,在建置 OTP 時使用的 configure 腳本現在會嘗試啟用在 2038 年 1 月中旬之後仍然可用的時間戳。這通常只在 32 位元平台上是個問題。

    如果 configure 無法找出如何啟用此類時間戳,它將會中止並顯示錯誤訊息。如果您仍然想要建置系統,並且知道系統在 2038 年 1 月中旬之後將無法正常運作,您可以將 --disable-year2038 選項傳遞給 configure,這將使 configure 能夠在沒有 2038 年 1 月中旬之後的時間戳支援的情況下繼續進行。

RC1 的重點 #

文件 #

EEP-59 已實作。原始碼檔案中的文件屬性現在可以用於記錄函式、類型、回呼和模組。

整個 Erlang/OTP 文件現在都使用新的文件系統。

新的語言功能 #

  • 按照 EEP 64 的規定,已實作三引號字串,允許字串包含完整段落。

  • 相鄰且沒有中間空格的字串文字現在是語法錯誤,以避免與三引號字串混淆。

  • 按照 EEP 66 的規定,已實作字串文字(普通和三引號)的符號。例如,~"Björn"~b"Björn" 現在等同於 <<"Björn"/utf8>>

編譯器和 JIT 的改進 #

  • 編譯器現在會合併連續對相同記錄的更新。

  • 已在編譯器和執行時系統中實作 Tuple 的安全破壞性更新。這允許 VM 在安全的情況下就地更新 tuple,從而透過減少複製並減少垃圾來提高效能。

  • 現在預設啟用 maybe 表達式,不再需要啟用 maybe_expr 功能。

  • 已在 JIT 中實作原生程式碼涵蓋率支援。cover 工具將會自動使用它來減少執行程式碼涵蓋率編譯程式碼時的執行負擔。也有新的 API 可以在不使用 cover 工具的情況下支援原生程式碼涵蓋率。

  • 編譯器現在會在更新記錄/映射文字時發出警告,以捕捉常見的錯誤。例如,編譯器現在會對 #r{a=1}#r{b=2} 發出警告。

ERTS #

  • erl 命令現在支援 -S 標誌,它類似於 -run 標誌,但移除了一些粗糙的邊緣。

  • 預設情況下,現在會編譯而不是直譯 escript。這表示必須安裝 compiler 應用程式。

  • 預設程序限制已提高到 1048576 個程序。

  • erlang:system_monitor/2 功能現在能夠監控系統中的長訊息佇列。

  • 透過將原子(或字串)作為第一個參數傳遞給 open_port() 來開啟通往外部資源的埠的過時且未公開的支援(由 vanilla 驅動程式實作)已移除。此功能自 OTP 26 發布以來,已計劃在 OTP 27 中移除。

  • 已從 erlang:fun_info/1,2 中移除 pid 欄位。

  • 現在支援多個追蹤工作階段。

STDLIB #

  • 已在模組 timer 中新增幾個接受 fun 的新函式。

  • 已將函式 is_equal/2map/2filtermap/2 新增至模組 setsordsetsgb_sets

  • 有新的有效率的 ets 遍歷函式,具有保證的原子性。例如,ets:next/2 後面接著 ets:lookup/2 現在可以用 ets:next_lookup/1 取代。

  • 新函式 ets:update_element/4 類似於 ets:update_element/3,但接受一個預設 tuple 作為第四個參數,如果沒有先前具有該鍵的記錄,則會插入該 tuple。

  • binary:replace/3,4 現在支援使用 fun 來提供替換的二進制。

  • 新函式 proc_lib:set_label/1 可以用來將描述性詞彙新增至任何沒有註冊名稱的程序。該名稱將會由諸如 c:i/0observer 之類的工具顯示,並且會包含在使用 gen_servergen_statemgen_eventgen_fsm 的程序產生的崩潰報告中。

  • 新增了從 gb_treesgb_sets 檢索下一個更高或更低鍵/元素的函式,以及傳回從給定鍵/元素開始的迭代器。

common_test #

  • ct:capture_start/0ct:capture_stop/0 的呼叫現在是同步的,以確保擷取所有輸出。

  • 如果瀏覽器偏好,預設 CSS 現在將包含基本的暗黑模式處理。

crypto #

  • 在 Erlang/OTP 25 中標記為已棄用的函式 crypto_dyn_iv_init/3crypto_dyn_iv_update/3 已移除。

dialyzer #

  • 已移除 Dialyzer 的 --gui 選項。

ssl #

  • ssl 用戶端可以協商和處理憑證狀態請求(用戶端支援 OCSP Stapling)。

tools #

  • 有一個新工具 tprof,它在一個介面下結合了 eprofcprof 的功能。它還新增了堆積分析。

xmerl #

  • 作為 xmerl_xml 的替代方案,已新增一個新的匯出模組 xmerl_xml_indent,它提供了現成的縮排輸出。

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