
编程语言编译器语言运行时标准库【免费下载链接】ocamlThe core OCaml system: compilers, runtime system, base libraries项目地址https://gitcode.com/gh_mirrors/oc/ocaml点击查看免费下载OCaml 官方语言手册是随编译器源码一起维护的巨型文档工程它以扩展 LaTeX 方言.etex为唯一源码通过ocamltex、texquote2、transf等自研工具链生成 HTML、纯文本、Info 与 PDF 四种发布格式。本文以仓库 manual/README.md 为骨架结合 manual/Makefile、manual/src/Makefile 与各工具源码完整讲解手册的目录组织、构建流程、扩展语法与一致性测试读完即可在本地复现官方手册的全部构建产物并理解每个工具在流水线中的职责。一、手册在仓库中的位置与整体构建入口OCaml 手册的全部源码位于仓库的manual/目录其下分为四个子目录目录职责manual/src/手册主体源码.etex、macros.tex、manual.tex、manual.hva等与生成产物的输出位置manual/tools/构建辅助工具源码texquote2.ml、transf.mll、transfmain.ml、fix_index.sh及 Makefilemanual/tests/手册与编译器源码的一致性测试manual/styles/LaTeX 样式文件.sty、.tfm等构建的顶层入口是 manual/Makefile其目标结构为all: tools manual tests # 一次构建全部 tools: 清理并构建 manual/tools 下工具再构建 tests/tools manual: tools → 进入 manual/src 执行 make all pdf/html/web/release: 进入 manual/src 执行对应目标 pregen-etex / pregen: 预生成 .etex 与标准库 API 文档 tests: 进入 manual/tests 清理并重新构建注意tests目标依赖manual且每次都会先clean再重建Makefile 注释给出的原因是tools and the tests are rebuilt each time in order to avoid issues with different compiler versions——即手册测试必须使用当前源码树编译出的编译器避免与系统已安装的编译器版本不一致导致误判。二、构建前置条件根据 manual/README.md构建手册需要满足三个前提可用的 OCaml 编译器源码构建环境任何从源码构建 OCaml 编译器所需的前置依赖工具链、C 编译器、make 等都是手册构建的前置条件。一套 LaTeX 安装用于生成 PDFpdflatex以及 HeVeA 的样式支持。HeVeALaTeX-to-HTML 转换器可通过 OPAM 安装。HeVeA 官方网站为 hevea.inria.fr。HeVeA 有一个常见坑hevea.sty必须被正确安装进 TeX 的宏包搜索路径而很多发行版的包管理器并不会自动完成这一步。README 明确给出了检查命令kpsewhich hevea.sty若该命令没有输出hevea.sty的路径说明样式文件未被 TeX 系统识别需要手动安装后重试。手册构建过程中不需要先make install编译器——手册始终使用源码树内刚刚构建出来的编译器例如 manual/src/Makefile 中TEXQUOTE $(ROOTDIR)/runtime/ocamlrun ../tools/texquote2直接调用runtime/ocamlrun解释器运行texquote2而不是系统安装的ocamlrun。这一点保证了手册示例的执行结果与当前源码版本的语义严格一致。三、构建步骤与产物3.1 标准构建命令在manual/目录下直接执行make该命令等价于make all会依次完成tools → manual → tests。若只想要某一种格式可以单独执行make html # 仅 HTML make pdf # 仅 PDF make web # HTML html_processing 后处理 make pregen # 预生成 .etex 与标准库 API 文档pregen-etex目标专门用于在发布前把.etex转成 LaTeX 文件并执行其中的 OCaml 片段Makefile 注释强调this phase of the manual build process, which may execute OCaml fragments and expect certain outputs, is correct——即它是验证手册示例代码正确性的关键一环。3.2 四种输出产物构建完成后产物位于manual/src/下的四个目录manual/src/Makefile中DIRS infoman texstuff textmanhtmlman由html目标创建格式位置入口文件HTML 手册manual/src/htmlman/index.html纯文本手册manual/src/textman/manual.txtInfo 手册manual/src/infoman/ocaml.infogzip 压缩PDF 手册manual/src/texstuff/manual.pdf从 manual/src/Makefile 可以看到各格式的生成参数INFO_FLAGS -fix -exec xxdate.exe -info -w 79 -s HTML_FLAGS -fix -exec xxdate.exe -O TEXT_FLAGS -fix -exec xxdate.exe -text -w 79 -s其中-ssuppress warnings在 Info 与 text 模式下关闭警告是因为hevea listings emit DIV blocks that the text modes do not know how to interpret——hevea 的代码块会输出 DIV 元素纯文本模式无法解释这些标记因此需要静默处理。HTML 构建命令的核心见 manual/src/Makefilecd htmlman \ hevea -fix -exec xxdate.exe -O \ -I .. -I ../cmds -I ../library -I ../refman \ -I ../refman/extensions -I ../tutorials \ -I ../../styles -I ../texstuff \ manual.hva -e macros.tex ../manual.tex \ hacha -tocter manual.htmlhacha是 HeVeA 配套工具-tocter负责为 HTML 手册生成目录table of contents。-I参数通过TEXINPUTSmanual/src/Makefile.:..:../refman:../refman/extensions:../library:../cmds:../tutorials:../../styles:把各章节目录纳入搜索路径。PDF 构建使用pdflatex manual.tex并经过两次makeindexmanual/src/Makefile第一次用 manual/tools/fix_index.sh 修复索引格式之后运行makeindex manual.idx与makeindex manual.kwd.idx生成普通索引和关键词索引。3.3 库 API 文档的注入手册第 IV 部分标准库、编译器前端、unix、str、threads、dynlink、runtime_events 等库的 API 文档并非手写而是由 api_docgen 目录中的文档生成器产物注入。构建逻辑根据配置变量DOCUMENTATION_TOOL分支manual/src/MakefileDOCUMENTATION_TOOLodoc调用make -C api_docgen latex/html将api_docgen/odoc/build/latex/*/*.tex拷贝进library/HTML 则整体拷贝到htmlman/默认ocamldoc调用make -C api_docgen latex/html将api_docgen/ocamldoc/build/latex/*.tex拷入library/HTML 中生成htmlman/libref与htmlman/compilerlibref两个子目录并拷贝style.css保持风格统一。ifocamldoc.tex手册中接口文档章节的插入点也按同样的分支逻辑由对应工具链生成。四、源码组织四大部分与 .etex 文件映射手册正文以**扩展 LaTeX 方言.etex**书写按主题拆分为四大部分每个部分对应manual/src/下的一个子目录每个独立章节有时是节映射到一个.etex文件manual/README.md 原文Part I —— Introduction to OCamltutorials/章节文件核心语言coreexamples.etex模块系统moduleexamples.etexOCaml 中的对象objectexamples.etex标签与变体lablexamples.etex类与模块的高级示例advexamples.etexPart II —— The OCaml languagerefman/分为两个截然不同的章节OCaml 语言refman.etex对语言的规范性技术描述每一节映射为独立 LaTeX 文件lex.etex词法、values.etex值、names.etex名字、types.etex类型、const.etex常量、patterns.etex模式、expr.etex表达式、typedecl.etex类型声明、classes.etex类、modtypes.etex模块类型、compunit.etex编译单元语言扩展exten.etex描述 OCaml 语言的所有新特性。Part III —— The OCaml toolscmds/覆盖全部工具链文档该目录在仓库中实际存在见 manual/src/cmds主题文件批量编译ocamlccomp.etextoplevel 系统ocamltop.etex运行时系统ocamlrunruntime.etex本地代码编译ocamloptnative.etex词法/语法分析器生成器ocamllex、ocamlyacclexyacc.etex依赖生成器ocamldepocamldep.etex文档生成器ocamldococamldoc.etex调试器ocamldebugdebugger.etex性能分析ocamlprof、perfprofil.etexOCaml 与 C 的互操作intf-c.etexFlambda 优化flambda.etexafl-fuzz 模糊测试afl-fuzz.etexRuntime_events 运行时追踪runtime-tracing.etexTail Modulo Constructor 变换tail-mod-cons.etexThreadSanitizer 数据竞争检测tsan.etexPart IV —— The OCaml librarylibrary/简要介绍随编译器捆绑的所有库及其 API 文档核心库core.etex标准库stdlib-blurb.etexmanual/src/library/stdlib-blurb.etex编译器前端compilerlibs.etexUnix 系统调用libunix.etexstr 正则表达式与字符串处理libstr.etexthreads 库libthreads.etexruntime_events 库libruntime_events.etexdynlink 动态加载libdynlink.etex已移除/迁移的库Graphics、Bigarray、Num、LablTkold.etex4.1 命令行选项的统一管理ocamlc、ocamlopt与 toplevel 的命令行选项存在大量重叠。为避免三处文档反复维护这些选项集中写在 manual/src/cmds/unified-options.etex 中再由comp.etex、native.etex、top.etex分别\input引入。README 特别提醒If you need to update this list of options, the top comment of unified-options.etex contains the relevant information——新增选项时只需改这一个文件。与此配合警告列表也是自动生成的cmds/warnings-help.etex由 manual/src/Makefile 中的规则从utils/warnings.ml运行ocamlc -warn-help的输出转换而来并针对 52、57 号警告插入指向ss:warn52、ss:warn57章节的交叉引用确保警告编号与语言参考正文永远同步。五、构建流水线四个自研工具的分工.etex无法被 LaTeX 或 HeVeA 直接理解必须经过工具链转换manual/README.md 与 manual/src/library/Makefile.etex ──ocamltex── .gen.tex ──texquote2── .tex ──hevea/pdflatex── html/text/info/pdf 执行示例代码 引号/转义处理ocamltex位于仓库根tools/目录在 manual/src/library/Makefile 中以如下方式调用CAMLLATEX $(OCAMLRUN) -I otherlibs/str -I otherlibs/unix \ tools/ocamltex -repo-root $(ROOTDIR) -n 80 -v false它负责处理caml_example/caml_eval伪环境详见第七节-repo-root指定仓库根、-n 80限制输出宽度、-v false关闭啰嗦输出。texquote2manual/tools/texquote2.ml处理普通正文中的引号与特殊字符转义。transfmanual/tools/transf.mll处理 BNF 文法记号详见第八节。fix_index.shmanual/tools/fix_index.shPDF 索引预处理。两个可执行文件texquote2、transf均由 manual/tools/Makefile 用源码树内的$(BEST_OCAMLC)编译transf由transf.mll先经ocamllex生成transf.ml再与transfmain.ml链接。六、Latex 扩展一带稳定锚点的章节宏为了给手册的每一节提供稳定链接标准\section、\subsection、\subsubsection被替换为把 label 作为第一个参数的变体。手册中必须写作\section{s:basics}{Basics}而不是\section{Basics\label{s:basics}}这一约束的意义在于HeVeA 生成 HTML 页内锚点时只会读取该变体宏的第一个参数从而保证s:basics这样的标签稳定地成为 HTML 头部 id外部引用如警告章节的ss:warn52不会因 LaTeX 排版漂移而失效。段落级别也有对应的\lparagraph宏。七、Latex 扩展二caml_example 与 caml_eval 伪环境手册中手把手式的 OCaml 示例全部由tools/ocamltex处理。它实现两个伪环境caml_example展示代码与运行结果与caml_eval只求值、不输出。7.1 caml_example三种模式caml_example用 OCaml 解释器求值其内容再把输入代码与解释器输出一起翻译成 LaTeX。环境参数指定模式\begin{caml_example}{toplevel} let f x x;; \end{caml_example}toplevel模式模拟 toplevel 的外观与行为示例必须以双分号;;结尾否则ocamltex会报错verbatim模式不要求结尾;;是更轻量的纯代码展示模式signature模式声明接口而非实现\begin{caml_example*}{signature} val none : a option \end{caml_example*}环境名带*后缀如caml_example*表示抑制 toplevel 输出只显示输入代码。7.2 预期错误与警告的标注ocamltex的默认行为是一旦示例输出包含意外错误或警告立即报错并停止构建。当错误/警告确实是预期的时有两种标注方式方式一环境选项\begin{caml_example}{toplevel}[error] 1 2. ;; \end{caml_example} \begin{caml_example}[warning8] let f None None;; \end{caml_example}方式二逐条短语注解[expect ...]推荐粒度更细\begin{caml_example}{toplevel} 1 2. [expect error] ;; let f None None [expect warning 8];; 3 4 [expect ok];; \end{caml_example}[expect ok]显式声明该短语必须求值成功与默认行为一致但意图更明确。7.3 省略与隐藏代码不想展示的代码片段可以用[ellipsis]属性省略\begin{caml_example}{toplevel} let f: type a. a list - int List.length[ellipsis] ;; \end{caml_example}对于模块内部的大段内容用[ellipsis.start]/[ellipsis.stop]成对标记区间\begin{caml_example*}{verbatim} module M struct [ellipsis.start] type t T let x 0 [ellipsis.stop] end \end{caml_example*}7.4 caml_eval静默求值caml_eval是caml_example的伴随环境用于在 toplevel 中求值表达式但不打印任何输出典型用途是预先定义后续示例依赖的辅助值\begin{caml_eval} let pi 4. *. atan 1.;; \end{caml_eval} \begin{caml_example}{toplevel} let f x x . pi;; \end{caml_example}7.5 一个重要的实现约束README 明确警告the detection code for these pseudo-environments is quite brittle and the environments must start and end at the beginning of the line——伪环境的识别代码相当脆弱\begin{caml_...}与\end{caml_...}必须位于行首否则不会被识别。这与 manual/tools/texquote2.ml 中的实现一致texquote2通过is_prefix \\begin{caml_ line判断行首前缀进入Verbatim_like状态直到行首出现\end{caml_才恢复普通模式。八、Latex 扩展三texquote2 的引号与转义机制texquote2manual/tools/texquote2.ml为普通正文提供类 verbatim 的引用在 caml 环境与 verbatim 环境之外双引号包裹的文本text会被翻译成\machine{escaped_text}并以等宽字体排版。其escape函数manual/tools/texquote2.ml给出了完整的字符转义表输入字符LaTeX 输出说明空格 / 换行\引用内的空格{}{\char123}{\char125}花括号^{\char94}脱字符_{\char95}下划线\{\char92}反斜杠~{\char126}波浪号$\$美元符号{\char38}与号#\#井号%\%百分号{\textquotesingle}单引号{\textasciigrave}反引号从源码manual/tools/texquote2.ml可以看到它的处理细节普通模式逐字符扫描遇到切换\machine{/}}状态并在\machine内部对上述字符逐一转义同时它识别\verb命令要求其后紧跟非字母字符作为分隔符在\verb区间内原样输出。九、Latex 扩展四transf 的 BNF 文法记号语言参考部分用transfmanual/tools/transf.mll书写文法。在syntax环境中可以用 BNF 记号描述语法终结符用单引号...或双引号...包裹\begin{syntax} expr: value-path | constant | ( expr ) | begin expr end | ( expr : typexpr ) | expr {{, expr}} | constr expr | tag-name expr | expr :: expr | [ expr { ; expr } [;] ] | [| expr { ; expr } [;] |] | { field [: typexpr] expr% { ; field [: typexpr] expr } [;] } \end{syntax}syntax环境之外还可以用引用来插入文法片段( module-expr )。因此一旦启用该扩展正文中的字符必须转义为\。从 manual/tools/transf.mll 的 lexer 规则可以看到转换的对应关系\begin{syntax}→ 进入syntax词法状态起始的片段 →\synt{...}单引号x→\token{x}双引号x→\token{x}标识符序列 →\nonterm{...}ident→\nt{...}关键字epsilon→\emptystring。该扩展主要服务于语言参考部分完整的记号说明见 manual/src/refman/refman.etex 的第一小节。十、一致性测试让手册与源码永不脱节manual/tests/目录包含两项关键测试见 manual/tests/README.md目标都是检验手册与编译器源码之间的同步性cross_reference_checker.ml检查编译器源码中对手册的交叉引用是否仍然准确——编译器源码中会以[manual:xxx]形式引用手册章节一旦章节标签被改名或删除该测试就会失败check-stdlib-modules检查所有标准库模块是否都从手册中标准库主入口 manual/src/library/stdlib-blurb.etex 被链接——新增标准库模块但忘记写进手册时此测试会报警。此外如第四节所述cmds/warnings-help.etex由ocamlc -warn-help实时生成library/下的 API 文档由api_docgen产物注入manual/tests又随每次构建强制重建避免编译器版本漂移——这套生成 校验 重建机制共同保证了手册正文、工具选项、警告编号与 API 签名四者之间的强一致。十一、实践建议本地复现完整手册要在本地复现官方手册可按如下顺序操作仓库为只读仅需查看与构建# 1. 从源码构建 OCaml 编译器含原生编译器 ocamlopt make -C /data/web/disk1/git_repo/gh_mirrors/oc/ocaml world # 2. 确认 hevea 可用且 hevea.sty 已被 TeX 识别 kpsewhich hevea.sty # 3. 进入 manual 目录构建全部格式HTML/text/Info/PDF 一致性测试 cd /data/web/disk1/git_repo/gh_mirrors/oc/ocaml/manual make # 4. 只构建单一格式时 make html # 产物manual/src/htmlman/index.html make pdf # 产物manual/src/texstuff/manual.pdf构建完成后可对照 manual/src/Makefile 核对产物位置若make pdf报错多半是hevea.sty未安装到位或 LaTeX 宏包缺失优先用kpsewhich hevea.sty排查。若需验证示例代码与当前源码语义一致可单独执行make pregen-etex它会在不产出最终格式的情况下先完成所有.etex到 LaTeX 的转换与 OCaml 片段求值是排查示例报错类问题的首选入口。赞分享编程语言编译器语言运行时标准库【免费下载链接】ocamlThe core OCaml system: compilers, runtime system, base libraries项目地址https://gitcode.com/gh_mirrors/oc/ocaml点击查看免费下载相关推荐TinyColor 完整构建与发布指南从源码到多格式发布的终极教程 TinyColor 完整构建与发布指南从源码到多格式发布的终极教程 TinyColor 是一个轻量级的 JavaScript 颜色操作和转换库它支持多前端开发工具TensorTrade 文档构建指南从 Sphinx 源码到可发布的 HTML 文档TensorTrade 文档构建指南从 Sphinx 源码到可发布的 HTML 文档 本篇技术指南围绕 TensorTrade 仓库中的 docs/ 目录展开人工智能金融科技机器学习Dendron导出格式详解从PDF到HTML的全格式转换指南Dendron导出格式详解从PDF到HTML的全格式转换指南 你是否还在为知识管理工具导出格式单一而烦恼是否遇到过导出的PDF文件排版错乱、HTML页面链接知识管理知识库上一篇突破性AI代码评测框架LiveCodeBench深度技术解析下一篇Claude Context MCP 服务器开发指南工具设计、stdio 协议规范与多客户端联调实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考