平台新闻: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 的编辑器支持引入 Web 和第三方平台,例如 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 中的一个补丁上游到 删除向后兼容代码的预处理 。这有助于减少在 Dune 中对 opam 进行捆绑时需要捆绑的依赖项数量。
- 我们合并了 一个 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 上安装了互补的 (32 位在 64 位平台上,64 位在 32 位平台上) C 编译器 ocaml/opam#5522
- 如果不存在 C++ 编译器,请不要静默禁用 MCCS ocaml/opam#5527
- 将
.ocamlinit
脚本移出根目录 ocaml/opam#5526 - Windows 上的 MCCS 不尊重 avoid-version ocaml/opam#5523
- 使用 current-bench 设置基准测试 ocaml/opam#5525
- 更新到最新的
msvs-detect
ocaml/opam#5514 - 修复
camlheader
在 BINDIR 包含转义字符时的编译 ocaml/opam#12214 - doc: 如果定义了 ? 则计算为 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,它带来了 使用Dune合并Coq理论的支持!
这是一个由Ali Caglayan和Emilio Jesús Gallego Arias领导的重大努力,从今年年初开始。从Dune 3.8开始,Coq用户将能够使用Dune,即使他们依赖于使用其他构建系统(如make)的Coq项目。
活动:
- 合并了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,它 在Dune中实现了新的并发操作,允许你并发执行操作。
- 我们还合并了PR,该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-to-JavaScript编译器。
Melange的目标是提供一个替代ReScript的方案,它与OCaml生态系统很好地结合。为此,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。
- 实现了
module_system
字段 用于melange段落(例如(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和手册页中不可用)。我们正在努力在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上的结果,包括 构建时间 和 cmt大小。 - 我们还重新设计了执行索引的迭代器,并在索引器中添加了大多数缺失的情况。但是,由于
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,从而缩小 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 上取得了进展,该 PR 旨在 保留附加到带标签参数的注释,修复了更多回归。
- 我们实现了一个更改,以 在解析期间保留字面字符值。
- 我们致力于 在 Parsetree 中保留函子的具体语法。
- 我们 在解析器中规范化函数。
ocp-indent
之间的差距
[OCamlFormat] 缩小 OCamlFormat 和 贡献者: @gpetiot (Tarides), @EmileTrotignon (Tarides), @Julow (Tarides)
OCamlFormat 团队一直在与 Jane Street 团队合作,将 Jane Street 的代码库从 ocp-indent 迁移到 OCamlFormat。因此,我们在最近几个月对 janestreet
配置文件进行了大量更改。也许最值得注意的是,这项工作使我们能够识别出不特定于 janestreet
配置文件的问题,因此我们一直在修复错误并在整个过程中实现格式化改进。
我们即将完成这个项目,但四月份看到了许多我们将在下面详细介绍的错误修复和改进。
活动
- 我们调整了对几种语言特性的缩进,包括 扩展、类表达式函数体 和 模块表达式扩展。
- 我们修复了与 ocp-indent 兼容性 和 'struct' 后的 Let vs LetIn 检测 相关的问题。
- 我们改进了 模块参数的格式化,并致力于 保留附加到带标签参数的注释。
- 我们修复了导致由于字符串在 代码块 和 注释 中而对 AST 进行更改的问题。
- 我们改进了 带有字符串的 cinaps 注释的格式化,并致力于解析和 规范化 cinaps 注释。
- 我们对某些语言结构的处理进行了调整,例如 保护
fun _ : _ ->
后的匹配 和 一致地包装 ( :: )。 - 我们使用 numstat 和 ocp-indent 的单次运行 扩展了测试套件。