平台電子報: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 時要供應到 Dune 中的相依性數量。
- 我們合併了一個 PR,它為與建置 opam 套件相關的功能奠定了基礎並提供了框架。
- 在完成 0install-solver 的工作後,我們將在 Dune 4 中使用它作為解算器,我們在
ocaml/opam-repository
上開啟了一個 PR,以移除衝突中套件版本的限制,並在 opam 上為相同的衝突提供了一個修補程式。
[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 邁出的一大步,並且是多年來許多人共同努力的成果。
活動
- 組態:確保在 Windows 上安裝互補的 C 編譯器(64 位元平台上 32 位元,32 位元平台上 64 位元)ocaml/opam#5522
- 如果不存在 C++ 編譯器,則不要靜默停用 MCCS ocaml/opam#5527
- 將
.ocamlinit
指令碼移出根目錄 ocaml/opam#5526 - Windows 上的 MCCS 不會考慮避免版本 ocaml/opam#5523
- 使用 current-bench 設定基準測試 ocaml/opam#5525
- 更新至最新的
msvs-detect
ocaml/opam#5514 - 修正在 BINDIR 包含逸出字元時編譯
camlheader
的問題 ocaml/opam#12214 - 文件:如果已定義,?評估為 true ocaml/opam#5512
- 停止組態指令碼下載和供應相依性 ocaml/opam#5511
- 移除向後相容性程式碼的預處理 ocaml/opam#5508
- 修正
opam-crowbar.opam
上的 linting ocaml/opam#5507 - depexts:重新措辭訊息 ocaml/opam#5499
- 取代 CPPO 的使用 ocaml/opam#5498
- 在組態指令碼中檢查 swhid_core 的存在 ocaml/opam#5497
- 在所有依賴
opamMain.exe.exe
的規則上新增套件節 ocaml/opam#5496
[Dune] 改善 Dune 的文件
貢獻者:@emillon (Tarides)
在 3 月,我們開始根據 Diataxis 架構重組 Dune 文件。我們開啟了草稿 PR,以展示整體目標結構。新的結構將改善文件的可用性,允許使用者找到他們正在尋找的資訊,並使我們能夠更好地識別需要解決的差距。
在 4 月,我們繼續這項工作,填補其中一些差距,並改寫文件以更好地符合架構的預期象限。
活動
- 將「自動格式化」改為操作指南 ocaml/dune#7479
- 將詞法慣例移至參考文件 ocaml/dune#7499
- 將
opam.rst
轉換為 3 個指南 ocaml/dune#7515 - 新增一些關於撰寫文件資訊 ocaml/dune#7537
- 將
classical-ppx
合併至preprocessing-spec
ocaml/dune#7538 - 合併有關 findlib 的參考資訊 ocaml/dune#7567
- 為 opam 檔案新增詞法分析器 ocaml/dune#7574
[Dune] 組成已安裝的 Coq 理論
貢獻者:@Alizter 和 @ejgallego (IRIF)
我們已合併 PR,該 PR 為 Dune 帶來了組合 Coq 理論的支援!
這是由 Ali Caglayan 和 Emilio Jesús Gallego Arias 領導的巨大努力,從今年初開始。從 Dune 3.8 開始,即使 Coq 使用者依賴於使用其他建置系統(例如 make)的 Coq 專案,也能夠使用 Dune。
活動:
- 已合併 PR,該 PR 將 對已安裝理論的組合支援新增至 Coq 規則
[Dune] Dune 終端使用者介面
貢獻者:@Alizter, @rgrinberg (Tarides)
我們正在為 Dune 開發新的終端使用者介面(TUI)模式。我們的目標是讓 Dune 使用者直接從終端獲得互動式 GUI 體驗,以便更輕鬆地與建置目標互動、觀察進程等等。這項工作仍在進行中,但未來幾個月 dune build --display tui
的功能將會逐步改進。
活動:
- 為 Dune 引入了 新的
tui
模式。 - 啟用 Dune 以重新顯示 24 位元色彩輸出。
[Dune] 同時執行動作
貢獻者:@Alizter 和 @hhugo (Nomadic Labs)
一月份,我們開始研究允許 Dune 同時執行動作並運行內聯測試。本月,我們合併了兩個 PR,該功能將在即將推出的 Dune 3.8 中提供。我們對同時運行內聯測試以加速測試週期感到特別興奮!
活動:
- 我們已合併 PR,該 PR 在 Dune 中實作新的並行動作,允許您同時執行動作。
- 我們也合併了以此功能為基礎的 PR,啟用 Dune 同時運行內聯測試。
- 我們已修補
ppx_inline_test
以利用新功能。
[Dune] 在大型程式碼庫上對 Dune 進行基準測試
貢獻者:@gridbugs (Tarides)、@Leonidas-from-XIV (Tarides)
三月份,我們新增了在 48 核心裸機系統上對 Dune 建置進行連續基準測試。這是一個龐大工作量的成果,包括為 opam 套件建構一個大型單一程式碼庫,讓使用者能夠在大型程式碼庫上運行 Dune 基準測試。
四月份,我們也新增了對監看模式中基準測試建置的支援。這讓我們能夠在我們推進重大專案(例如套件管理)時監控迴歸。
活動
- 使用 Dune 的串流 RPC 介面新增 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 範本。
活動
- 在 Dune 中撰寫一個手冊頁面,使用 Melange 編譯為 JavaScript。
- 讓 Melange 適用於 4.13-5.1 而不僅僅是 4.14
- 除了我們在四月份所做的工作之外,以下是過去幾個月中進行的一些值得注意的 PR
- 為程式庫新增了新的欄位
melange.runtime_deps
,以便 Melange 程式庫作者可以告訴 Dune 哪些前端資產(例如 CSS 或影像檔案、字型等)必須與他們的程式庫一起安裝 - 加速程式庫和可執行檔的規則產生。這對 Melange 非常有用,但每個 Dune 專案都受益。
- 讓 reactjs-jsx-ppx 成為獨立的 ppx
- 為 melange 節點實作了
module_system
欄位(例如(module_systems (es6 mjs) (commonjs js) (commonjs cjs))
,允許同時將多個模組系統/js 擴充功能輸出到 melange 輸出資料夾
- 為程式庫新增了新的欄位
產生文件
odoc
[Odoc] 將搜尋功能新增至 貢獻者:@panglesd (Tarides)、@EmileTrotignon (Tarides)
我們正在研究產生搜尋索引並將搜尋列新增至 odoc
產生的文件。我們仍在探索不同的方法,並且正在與 OCaml.org 團隊合作,在 OCaml 套件文件中實作搜尋列。
活動:
- 我們開始建立搜尋索引和搜尋列的原型,並且正在討論其設計。特別是,我們在原型中使用了編譯器 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 版本中提供!
活動
- 三月份沒有新的活動,但以下是我們到目前為止一直在進行的提取請求
- 在 odoc-parser 中新增表格的新語法 (odoc-parser#11)
- 修正輕型表格剖析 (odoc-parser#14)
- 將表格支援新增至 odoc (odoc#893)
編輯和重構程式碼
[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 實作了快取策略,並在整個四月份繼續進行研究。
活動
[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 版本中提供。
活動:
- 我們在 Dune 中製作了一個修補程式,以便在 Windows 上使用 RPC 協定。
- 我們修正了 OCaml-LSP 中的一個錯誤,以啟用與 Windows 上 Dune RPC 的通訊。
[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 的差異。
活動
- 我們在正在進行的 PR 上取得了進展,以便保留附加到標籤引數的註解,修正了更多迴歸。
- 我們實作了一個變更,以在剖析期間保留字元值的字面值。
- 我們致力於在 Parsetree 中保留函子的具體語法。
- 我們正規化了剖析器中的函式。
ocp-indent
之間的差距
[OCamlFormat] 縮小 OCamlFormat 和 貢獻者:@gpetiot (Tarides), @EmileTrotignon (Tarides), @Julow (Tarides)
OCamlFormat 團隊一直與 Jane Street 團隊合作,將 Jane Street 的程式碼庫從 ocp-indent 遷移到 OCamlFormat。因此,我們在最近幾個月對 janestreet
設定檔進行了大量變更。最值得注意的是,這項工作讓我們能夠識別出不屬於 janestreet
設定檔的特定問題,因此我們一直在修正錯誤並實作全面的格式化改進。
我們即將完成這個專案,但四月份看到了許多錯誤修正和改進,我們將在下面詳細說明。
活動
- 我們調整了幾個語言功能的縮排,包括擴充功能、class-expr 函式主體和module-expr 擴充功能。
- 我們修正了關於ocp-indent 相容性和在 'struct' 之後的 Let 與 LetIn 偵測的問題。
- 我們改進了模組引數的格式化,並致力於保留附加到標籤引數的註解。
- 我們修正了因程式碼區塊和註解中的字串而導致 AST 變更的問題。
- 我們改進了含有字串的 cinaps 註解的格式化,並致力於剖析和正規化 cinaps 註解。
- 我們調整了對某些語言結構的處理,例如保護
fun _ : _ ->
之後的 match 和一致地包裝 ( :: )。 - 我們使用numstat 和 ocp-indent 的單次執行擴展了我們的測試套件。