平台電子報:2023 年 4 月

歡迎來到 OCaml 平台電子報的第一期!

我們承襲 OCaml.org 電子報的傳統,並受到 Multicore 和 Compiler 電子報的啟發,很高興為您帶來每月更新,內容涵蓋我們在改善 OCaml 開發人員體驗方面取得的進展。

OCaml 平台是推薦用於使用 OCaml 並提高生產力的工具組合。平台工具填補了 OCaml 開發人員體驗中的缺口,並允許開發人員執行特定的工作流程(例如,建置套件、格式化程式碼、產生文件、發布套件等)。

歸根結底,我們在 OCaml 平台上所做的一切工作都有一個目標:改善 OCaml 開發人員的體驗。因此,在本電子報中,我們將從這些開發人員工作流程的角度,介紹我們在不同專案上取得的進展。基於 OCaml 調查的結果(2020 年2022 年)、與業界使用者的討論、在 Discuss 上的持續社群回饋以及其他使用者輸入來源,以下是我們目前正在處理的工作流程:

  • 建置套件:我們建置工作流程的當務之急是消除與使用兩個不同工具進行套件管理和建置系統相關的摩擦。為此,我們計畫將 opam 功能直接整合到 Dune 中,將其確立為建置 OCaml 專案所需的單一工具。作為此整合的副產品,我們的目標是改善其他工作流程,例如處理多個專案、交叉編譯以及改善 OCaml 入門的整體體驗。
  • 編譯為 JavaScript:我們不斷支援將 OCaml 編譯為 JavaScript 的工具。Dune 與 Js_of_ocaml 整合良好,而且我們一直在努力將 Dune 與 Melange 整合,Melange 是 ReScript 的一個新分支,旨在與 OCaml 生態系統緊密整合。
  • 產生文件:OCaml 套件文件的狀態在 OCaml 調查中被報告為一個主要的痛點(2020 年2022 年)。我們正在努力使 OCaml 開發人員能夠為他們的套件建立高品質的文件。現在套件的文件在 OCaml.org 上隨時可用,我們希望讓撰寫文件變得有價值且直接。我們正努力使 Odoc 適合建立手冊,方法是新增功能、改善導覽,以及擴展 odoc 標記語法以支援豐富的內容,例如表格、圖像和圖表。
  • 編輯和重構程式碼:我們的目標是透過更多的工作流程來豐富 OCaml 編輯器支援,以改善程式碼導覽並自動化重構。我們目前的主要重點是為 Merlin 新增專案範圍內的參考支援。未來的工作將包括實作專案範圍內的重新命名查詢和諸如重新命名引數之類的查詢。我們也正努力將 OCaml 的編輯器支援帶到網頁和第三方平台,例如 OCaml Playground、ReplIt 和 GitHub Codespaces。
  • 格式化程式碼:我們格式化程式碼的目標是著重於提高準確性,尤其是註解方面。我們也希望在提供一個吸引大多數使用者的預設設定檔與不需設定即可格式化您的 OCaml 專案之間取得適當的平衡,同時仍保持完全可設定的格式器。此外,我們計畫增強 ocamlformat 的向後相容性,並更好地整合 Dune 和 ocamlformat。

我也想藉此機會呼籲新的貢獻者。平台專案一直在尋找新的維護者和貢獻者,因此如果您對 OCaml 開發人員體驗的未來感興趣,並希望與我們共同塑造這個未來,請與我或任何平台維護者聯繫。如果您是希望獲得 OCaml 平台支援的業界使用者,並希望資助平台工具的維護者和開發,也請隨時與我聯繫

4 月份的活動非常活躍,我們迫不及待地想與您分享我們的進展。因此,讓我們開始吧!

在本創刊號中,我們將討論以下專案的進展:

發布

以下是我們在 4 月發布的平台工具新版本。請查看OCaml 更新日誌,以閱讀公告和功能重點!

建置套件

[Dune] 探索 Dune 中的套件管理

貢獻者:@rgrinberg (Tarides)、@Leonidas-from-XIV (Tarides)、@gridbugs (Tarides)、@kit-ty-kate (Tarides)

本月初,我們宣布我們已開始探索 Dune 中的套件管理。您可以在GitHub 上閱讀詳細說明我們功能開發中計畫的意見徵求(RFC)。

我們目前專注於為 Dune 工作流程的不同部分建置原型:來源擷取、建置非 Dune opam 套件以及產生鎖定檔案。

在 4 月,我們合併了第一個版本的來源擷取。我們也開始思考 Dune 如何建置 opam 套件,並合併了一個 PR,為在 Dune 中建置它們的規則奠定了基礎。

活動:

[opam] opam 2.2 中的原生 Windows 支援

貢獻者:@rjbou (OCamlPro)、@kit-ty-kate (Tarides)、@dra27 (Tarides)、@emillon (Tarides)、@Leonidas-from-XIV (Tarides)

將 Windows 的第一層支援提上日程已經有一段時間了,4 月份我們比以往任何時候都更接近 opam 2.2 的第一個 alpha 版本,我們預計在 5 月推出。此早期 alpha 版本是朝著發布具有原生 Windows 支援的 opam 2.2 邁出的一大步,並且是多年來許多人共同努力的成果。

活動

[Dune] 改善 Dune 的文件

貢獻者:@emillon (Tarides)

在 3 月,我們開始根據 Diataxis 架構重組 Dune 文件。我們開啟了草稿 PR,以展示整體目標結構。新的結構將改善文件的可用性,允許使用者找到他們正在尋找的資訊,並使我們能夠更好地識別需要解決的差距。

在 4 月,我們繼續這項工作,填補其中一些差距,並改寫文件以更好地符合架構的預期象限。

活動

[Dune] 組成已安裝的 Coq 理論

貢獻者:@Alizter 和 @ejgallego (IRIF)

我們已合併 PR,該 PR 為 Dune 帶來了組合 Coq 理論的支援

這是由 Ali Caglayan 和 Emilio Jesús Gallego Arias 領導的巨大努力,從今年初開始。從 Dune 3.8 開始,即使 Coq 使用者依賴於使用其他建置系統(例如 make)的 Coq 專案,也能夠使用 Dune。

活動:

[Dune] Dune 終端使用者介面

貢獻者:@Alizter, @rgrinberg (Tarides)

我們正在為 Dune 開發新的終端使用者介面(TUI)模式。我們的目標是讓 Dune 使用者直接從終端獲得互動式 GUI 體驗,以便更輕鬆地與建置目標互動、觀察進程等等。這項工作仍在進行中,但未來幾個月 dune build --display tui 的功能將會逐步改進。

upload_83a40a9ebf9a1196579f609933b1ce14|690x487

活動:

[Dune] 同時執行動作

貢獻者:@Alizter 和 @hhugo (Nomadic Labs)

一月份,我們開始研究允許 Dune 同時執行動作並運行內聯測試。本月,我們合併了兩個 PR,該功能將在即將推出的 Dune 3.8 中提供。我們對同時運行內聯測試以加速測試週期感到特別興奮!

活動:

[Dune] 在大型程式碼庫上對 Dune 進行基準測試

貢獻者:@gridbugs (Tarides)、@Leonidas-from-XIV (Tarides)

三月份,我們新增了在 48 核心裸機系統上對 Dune 建置進行連續基準測試。這是一個龐大工作量的成果,包括為 opam 套件建構一個大型單一程式碼庫,讓使用者能夠在大型程式碼庫上運行 Dune 基準測試。

四月份,我們也新增了對監看模式中基準測試建置的支援。這讓我們能夠在我們推進重大專案(例如套件管理)時監控迴歸。

活動

編譯為 JavaScript

[Dune] 在 Dune 中使用 Melange 編譯為 JavaScript

貢獻者:@anmonteiro、@jchavarri (Ahrefs)、@rgrinberg (Tarides)

您可能已經讀到Ahrefs 將其程式碼庫從 ReScript 遷移到 Melange,這是一個基於 ReScript 的新 OCaml 到 JavaScript 編譯器。

Melange 的目標是提供一個與 OCaml 生態系統搭配使用的 ReScript 替代方案。為此,Antonio Nuno Monteiro 和 Javier Chávarri 一直在研究整合 Melange 和 Dune,允許它使用 Melange 輕鬆地將 OCaml 專案編譯為 JavaScript。

該功能將在即將推出的 Dune 3.8 中提供。您已經可以在 Dune 的手冊中閱讀相關文件,大致瞭解該功能的工作方式。您也可以查看 Melange 團隊建構的opam Melange 範本

活動

產生文件

[Odoc] 將搜尋功能新增至 odoc

貢獻者:@panglesd (Tarides)、@EmileTrotignon (Tarides)

我們正在研究產生搜尋索引並將搜尋列新增至 odoc 產生的文件。我們仍在探索不同的方法,並且正在與 OCaml.org 團隊合作,在 OCaml 套件文件中實作搜尋列。

upload_4c851e860bc169f2919e1da3ca60c1b8|690x471

活動:

  • 我們開始建立搜尋索引和搜尋列的原型,並且正在討論其設計。特別是,我們在原型中使用了編譯器 Shapes,並且將探索使用 odoc 的路徑解析器來作為下一步。

[Dune] 用戶友善的產生文件命令

貢獻者:@EmileTrotignon (Tarides)、@jonludlam (Tarides)

我們正致力於讓在 Dune 中產生文件更易於使用,特別是對新手而言。目前,dune build @doc 命令在 _build 目錄中產生文件,使用者只需要知道他們需要 open _build/default/_doc/_html/index.html。為了解決這個問題,我們正在開發一個新的 dune ocaml doc 命令來產生文件並直接在瀏覽器中開啟。

活動:

  • 我們在三月份開啟了一個 PR,實作 dune ocaml doc 命令。這個月,我們在 macOS 上測試了該功能。我們現在正致力於完成 Windows 測試。

[Odoc] 支援 odoc 中的表格

貢獻者:@gpetiot (Tarides)、@panglesd (Tarides)、@Julow (Tarides)、@jonludlam (Tarides)

目前,使用 odoc 建立表格的唯一方法是在文件中內嵌 HTML 程式碼。這不是理想的方法,因為 HTML 表格語法不太適合做為文件標記,而且表格只能由 HTML 渲染器呈現(因此表格在 LaTex 和 manpage 中不可用)。我們正在開發一種 odoc 中新的特殊語法來建立表格,這種語法更容易使用,並且可以由所有渲染器呈現。

語法支援已合併至 odoc-parser。它提供了繁重的語法,以及受 Markdown 啟發的輕型語法

{t
  a  | b | c | d
  ---|:--|--:|:-:
  a  | b | c | d
}

odoc 中對該功能的支援尚未合併,但應在下一個 odoc 版本中提供!

活動

  • 三月份沒有新的活動,但以下是我們到目前為止一直在進行的提取請求

編輯和重構程式碼

[Merlin] 支援 Merlin 中的專案範圍參考

貢獻者:@voodoos (Tarides)

我們在 Merlin 上的工作重點是為 Merlin 新增專案範圍出現次數支援的長期專案。在四月份,我們繼續研究允許從編譯器產生索引的編譯器修補程式,並更新 Merlin 修補程式以與編譯器修補程式搭配使用,從而簡化了現在可以依賴編譯器的 Merlin 邏輯。

該功能需要針對 OCaml 編譯器、Dune 和 Merlin 的修補程式,這些修補程式仍未發佈,但如果您夠勇敢,您可以依照 voodoos/merlin-occurrences-switch 上的文件嘗試一下。

活動

  • 我們將編譯器端索引反向移植到 4.14。我們執行基準測試來評估對建置時間和已安裝 cmt 大小的影響。我們在 PR 上發佈了結果,包括建置時間cmts 大小
  • 我們也重構了執行索引的迭代器,並將大多數遺失的案例新增至索引器。但是,由於 Typedtree 的限制,某些元素仍未建立索引。
  • 我們在編譯器中實作部分索引之後更新了「索引」外部工具。
  • 我們也將新的編譯器變更移植到 OCaml 5.1 預覽中的 Merlin,這將讓我們能夠研究專案範圍出現次數支援。
  • 最後,我們開始重構和簡化 Merlin 修補程式,以查詢索引,因為現在編譯器完成了更多工作。

[Merlin] 提升 Merlin 的效能

貢獻者:@pitag-ha (Tarides)

在收到 Merlin 在大型程式碼庫中效能不佳的報告後,我們一直在研究 Merl-an,這是一個用於測量不同 Merlin 請求效能的工具。

三月份,我們能夠使用它來識別主要的效能瓶頸,其中最大的瓶頸是 PPX 階段。我們為 PPX 實作了快取策略,並在整個四月份繼續進行研究。

活動

  • 我們致力於修正 PPX 快取,並探索切換 PPX 階段快取的機制。最終,我們實作了基於旗標的方法
  • 我們新增了六項測試,涵蓋預設行為、快取命中、三種類型的快取失效,以及 PPX 相依性情況下的行為。

[OCaml LSP] 在 Windows 上使用 Dune RPC

貢獻者:@nojb (LexiFi)

在二月份,我們發布了 Dune 3.7.0,其中支援 Windows 上的監看模式。基於這項工作,本月我們修正了 Dune 和 OCaml LSP 中的幾個問題,以允許 OCaml LSP 使用 Dune RPC。這讓 VSCode 用戶能夠利用 Dune RPC,並在 Dune 於監看模式下執行時,在編輯器中取得建置狀態和更詳盡的建置錯誤。這些修正尚未發布,但將在即將發布的 Dune 和 OCaml LSP 版本中提供。

活動:

[OCaml LSP] 將 OCaml LSP 的 Merlin 分支上游化

貢獻者:@voodoos (Tarides), @3Rafal (Tarides)

我們正處於將 OCaml LSP 的 Merlin 分支上游化,以縮小 Merlin 和 OCaml LSP 之間差距的最後階段!本月,我們繼續處理 Merlin 的 PR,該 PR 為 OCaml LSP 新增了一個掛勾,使其能夠執行系統命令。我們也開啟了 一個關於 ocaml-lsp 的 PR,以使用上述修補程式並完全移除 Merlin 的分支。我們預計很快會發布一個將 Merlin 作為函式庫使用的 OCaml LSP 版本。

活動

  • 我們討論並審閱了讓您在使用 Merlin 作為函式庫時,設定 PPX 程序衍生之方式的變更。這引導我們實作了關於 PPX 程序衍生所公開的掛勾的想法。隨後,我們記錄了在程式和引數之間分割 PPX 命令的複雜性。
  • 我們在 ocaml-lsp 上開啟了 一個 PR,以移除 Merlin 的分支並將 Merlin 作為函式庫使用。

程式碼格式化

[OCamlFormat] 將 OCamlFormat 從 AST 遷移到 CST

貢獻者:@gpetiot (Tarides), @EmileTrotignon (Tarides)

早在 2022 年,@trefis 就建立了一個新的 OCaml 格式化程式的原型,該程式使用具體語法樹 (CST) 而不是抽象語法樹 (AST)。此模式保留更多資訊,並在許多情況下產生更精確的格式化,尤其是在格式化註解時,這是 OCamlFormat 的一個大痛點。

從那時起,我們一直致力於將 OCamlFormat 的語法樹遷移到這個 CST。我們選擇不一次性遷移所有內容,以盡可能減少對用戶的影響,並確保我們僅在格式化變更是錯誤修正或明顯改進時才進行變更。

您可以追蹤我們在此 PR 中的進度,該 PR 顯示了目前語法樹與目標 CST 的差異。

活動

[OCamlFormat] 縮小 OCamlFormat 和 ocp-indent 之間的差距

貢獻者:@gpetiot (Tarides), @EmileTrotignon (Tarides), @Julow (Tarides)

OCamlFormat 團隊一直與 Jane Street 團隊合作,將 Jane Street 的程式碼庫從 ocp-indent 遷移到 OCamlFormat。因此,我們在最近幾個月對 janestreet 設定檔進行了大量變更。最值得注意的是,這項工作讓我們能夠識別出不屬於 janestreet 設定檔的特定問題,因此我們一直在修正錯誤並實作全面的格式化改進。

我們即將完成這個專案,但四月份看到了許多錯誤修正和改進,我們將在下面詳細說明。

活動