ClojureScript

1.10.597 版本發佈

2019 年 11 月 18 日
ClojureScript 團隊

值得注意的變更

  • set/unioninto 的行為現在與 Clojure 對齊。

  • subvec 參數檢查現在與 Clojure 對齊。

  • 在陣列上使用 apply vector 現在會正確複製陣列。

Google Closure 命名空間分析

編譯器現在會為 Google Closure 命名空間產生分析中繼資料。這表示對於這些命名空間:

  • REPL 功能,例如 docdirapropos 等等,現在可以運作。

  • 可以使用參數清單,因此可以進行參數個數檢查。

  • 可以使用傳回類型,從而增強型別推斷。

  • 將會產生對私有變數使用的警告。

為了說明,讓我們 (require '[goog.crypt :as crypt]) 並在 REPL 中探索它

現在,(dir crypt) 會列出該命名空間中的函式

byteArrayToHex
byteArrayToString
hexToByteArray
...

可以使用文件字串;(doc crypt/hexToByteArray) 會產生

-------------------------
goog.crypt/hexToByteArray
([hexString])
  /**
 * Converts a hex string into an integer array.
...

可以使用參數個數資訊。將不正確的參數個數傳遞給其中一個函式會產生參數個數警告。例如,(crypt/hexToByteArray "abc" 123) 會產生

WARNING: Wrong number of args (2) passed to goog.crypt/hexToByteArray at line 1 <cljs repl>

型別推斷改進

此版本中對 ClojureScript 的型別推斷進行了多項改進。

記錄上關鍵字查詢的直接欄位存取

這可以透過範例輕鬆解釋

(defrecord Complex [re im])

(let [x (->Complex 1.1 2.7)]
   (:re x))

為最後一個運算式產生的程式碼將是 x.re。這可以快 66% 到 450% 不等。

字串和陣列的 count 特化

如果您將 count 應用於靜態推斷為字串或陣列的值,則產生的 JavaScript 將會直接存取 length 欄位,而不是在執行時呼叫 count

例如,(count "abc") 將會導致發出 "abc".length。根據上下文,這可能會快好幾個數量級。

simple- / qualified- 謂詞引導推斷

如果針對區域變數滿足 simple-keyword?qualified-keyword?,則會推斷該區域變數為關鍵字。同樣地,simple-symbol?qualified-symbol? 會導致將區域變數視為符號。

這基本上擴展了現有的針對 keyword?symbol? 的謂詞引導推斷,以包含這些額外的核心謂詞。

透過 and 的執行緒謂詞引導推斷

此型別推斷改進或許最好透過範例來說明。對於以下程式碼

(and (string? x) (zero? (count x)))

編譯器現在會知道,如果滿足上面 and 中的第一個子句,那麼在第二個子句中,x 的型別必須為字串。結合上面提到的 count 特化,這會導致產生高效率的 JavaScript

typeof x === "string" && x.length === 0

不在 implements? 上推斷

這是標準函式庫的內部但重要的最佳化:當針對區域變數滿足 implements? 謂詞時,編譯器會為涉及該區域變數的運算式產生更有效率的函式派送程式碼。

不正確地擴展跨參數 loop / recur 推斷

修正了一個涉及 loop / recur 擴展推斷的邊緣案例,如果在 loop 綁定的區域變數用作 recur 目標時,可能會發生不正確的推斷。

動態變數現在會正確地推斷為具有 any 型別

修正了一個推斷錯誤,其中動態變數被不正確地推斷為具有其初始化值的型別。這是錯誤的,因為動態變數可以在執行時使用與初始化值類型不同的類型的值重新綁定。

效能改進

最佳化 assocIAssociative 值上的效能

核心 assoc 函式中的最佳化使其在 assocIAssociative 值(常見情況)時速度更快。

例如,在 V8 中將鍵值 assoc 到對應可以快 24%,在 JavaScript 核心中快 11%,這對於這個常用核心函式來說是一個很大的效能提升。

ci-reduce 中將 coll 標記為 not-native

這是影響標準函式庫的重要內部最佳化,可以改善縮減為 IIndexedICounted 的集合時的效能。

改善 cljs.source-map.base64/encode 的效能

這改善了大量用於產生來源對應的函式效能,在我們的一次測量中效能提高了 17%。

變更清單

如需 ClojureScript 1.10.597 中的完整更新清單,請參閱 變更

貢獻者

感謝所有為 ClojureScript 1.10.597 做出貢獻的社群成員

  • Dieter Komendera

  • Erik Assum

  • Herald

  • Martin Kavalar

  • Martin Kučera

  • Michiel Borkent

  • Roman Liutikov

  • Seçkin Kükrer

  • Thomas Mulvaney