Erlang/OTP 27.0 第三個候選版本

2024 年 4 月 17 日 · 作者:Björn Gustavsson

OTP 27.0-rc3 #

Erlang/OTP 27.0-rc3 是 OTP 27.0 正式發布前的第三個也是最後一個候選版本。

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

此版本的所有構件都可以在 Erlang/OTP Github 發布頁面下載,您也可以在 https://erlang.dev.org.tw/documentation/doc-15.0-rc3/doc 瀏覽新的文件。您也可以使用 kerl 安裝最新版本,如下所示:

kerl build 27.0-rc3 27.0-rc3.

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

非常感謝所有貢獻者!

RC3 中的主要變更 #

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 的改進 #

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

  • 編譯器和執行階段系統中已實作元組的安全破壞性更新。這允許 VM 在安全的情況下就地更新元組,從而減少複製,並減少垃圾的產生,藉此提高效能。

  • 現在預設啟用 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 中新增數個接受函式的新函式。

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

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

  • 新的函式 ets:update_element/4 類似於 ets:update_element/3,但採用預設元組作為第四個引數,如果不存在具有該索引鍵的先前記錄,則會插入該元組。

  • binary:replace/3,4 現在支援使用函式來提供替換二進位。

  • 新的函式 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