Erlang/OTP 27

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

Erlang/OTP 27 重點部落格文章

docker run -it erlang:27

文件

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} 發出警告。

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

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

    範例

    如果 some_module.erl 具有以下屬性

    -compile([nowarn_missing_spec]).
    

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

    % erlc +warn_missing_spec some_module.erl
    

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

ERTS

  • erl 命令現在支援 -S 旗標,它與 -run 旗標類似,但已修復一些粗糙的邊緣。

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

  • 對封存檔案的現有實驗性支援將在未來的版本中變更。 在 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

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

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

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

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

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

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

    依預設,在建置 OTP 時使用的 configure 腳本現在會嘗試啟用對 2038 年 1 月中旬之後可以使用的時間戳記的支援。 這通常只在 32 位元平台上出現問題。 如果 configure 無法找出如何啟用此類時間戳記,它將中止並顯示錯誤訊息。 如果您仍然想要建置系統,但知道該系統在 2038 年 1 月中旬之後將無法正常運作,您可以將 --disable-year2038 選項傳遞給 configure,這將使 configure 能夠在沒有對 2038 年 1 月中旬之後的時間戳記的支援下繼續。

STDLIB

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

    編碼和解碼都可以自訂。 解碼可以採用類似 SAX 的方式完成,並處理多個文件和資料流。

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

  • 多個接受函式的函式已新增至模組 timer

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

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

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

  • 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,它提供了開箱即用的縮排輸出。