去年,我们在那篇《编程语言的 IDE 支持》详细讨论了在不同 IDE、编辑器里,它们是如何提供对于编程语言的支持。在这一篇文章里,我们将不那么详细地讨论一下:不同的编程语言如何提供文档支持?如此一来,也能在未来为 Datum Lang 提供相关的理论体系支持。这里所指的编程语言的文档体系,主要是指语言标准库中的文档

新一代编程语言的文档体系

作为一个程序员,和诸多人一样,我并不热衷于在代码中写文档/注释。只是呢,诸多的情况下,我们依旧不得不写文档,如编程语言的标准库、API、SDK 等。在各个语言中,它们有各自不同的实践,有各自不同的特点。

起先,我只分析过 Rust 语言中的 rustdoc,分析它是如何自动化处理相关文档的。后来,联想到了其它语言的文档形式是不是也会类似。接着,便尝试性的整理自 2012 年后“比较”(相对,至少是我听得多的)主流的语言的文档方式。

于是,便花了点时间,从相关的代码库中快速梳理而来。因时间有限,加之不擅长某些语言。所以,结论上的可能并不是这么完整,欢迎各位读者指正。

从文档编写方式上来看,Rust、Julia、Dart、Kotlin、Swift 的文档工具都是相似的:基于 markdown 语法的基础上,进行了一系列的定制。如 Swift 文档中添加的一些特别的标准,如关于复杂度( Complexity)的特别说明,便使用了类似的方式来实现。而像 Julia 语言里的 DocumenterTools 则做了大量的定制,则可以基于 index.md 对内容进行特别处理,并添加大量的自定义语法。

从文档代码一致性上来看,从我初步阅读代码的情况来看,Rust、Julia 的文档工具都会校验文档中的代码是不是正常的,并能对其进行测试。如 Rustdoc 会编译、运行文档中的代码,可以通过 Rust 自身提供的断言语法(如 assert_eq!)进行测试。而像 Julia 里的 DocumenterTools 则做了更多的定制,如可以为文档添加 setup 方法,还能进行一系列相关的断言等。

除此,在 R 语言中提供的 R Markdown 也比较有意思,它提供了一种可执行文档的新思路,即让 markdown 与代码有机的结合在一起,结合 pandoc 构建了新的文档可能性。后续,可能会在文档体验设计相关的文章中,进行详细的介绍。

Rust 的文档测试示例

说了那么多,让我们先简单看个示例。如下是一段 Rust 中的注释代码:

# Examples
```rust
assert_eq!(2 + 2, 4);
```

Rust 在遍历了语法树之后,会:

  1. 解析 markdown,寻找 Rust 语言的语法块(如果没有标注语言类型,默认是 Rust)

  2. 根据语法块,做一些简单的处理,生成可编译的代码

  3. 编译上述的测试代码 (如果编译失败,则说明测试失败)

  4. 运行这些测试 or 文档

如下是 Rustdoc 中将上述的代码生成测试代码的测试用例:

#![allow(unused)]
fn main() {
#[allow(non_snake_case)]
fn _doctest_main__some_unique_name() {
assert_eq!(2 + 2, 4);
}
_doctest_main__some_unique_name()
}

一旦上述的代码编译并运行通过,则说明文档中的注释是正确的。

详细见 Rustdoc 相关源码:librustdoc

构建文档体系:markdown 即 DSL

基于上述语言的文档体系,我们就能浮现出基本的原型。核心便是:基于 markdown 而扩展,将 markdown 视为可扩展的 DSL。如此以来,便可以按需添加功能,并根据不同需要进行可视化展示。

0. 基于 markdown

这一点倒是没有啥说的,markdown 在今天已经成为了事实上的开发文档标准。

1. 为扩展设计:文档 DSL

从做法上可以分为:

让语法块可运行。让 markdown 中的代码块包含更多的含义,根据不同的代码块来对语言进行特殊处理。如 Julia 的 Documenter.jl 便定义了一系列的如可执行的 eval 、REPL 环境输出的 repl、文档测试 jldoctest 等。除此,一旦我们使用特定的符号来标记时,我们就可以在代码中添加更多的可能性。

添加自定义符号。添加一些自定义的语法,以支持更多的高级功能。如 KotlinDoc/KDoc 中使用的 Dokka,使用 [] 来链接元素,这种方式和 markdown 比较贴进。

文档编排。通过自定义元素,实现在 markdown 对于内容的“编程”(管理、引用等)。如 Julia 的 Documenter.jl 中创建的 @ref、 @docs、 @meta、 @content 等语法。

而除了上述的内容,我们还可以做更多的事,诸如于对于“代码的引用”等。

2. 为准确性设计:文档测试

为了确保文档与代码保持一致,又或者是文档中代码的准确性,我们需要引入文档测试的方式来检查 API。以 Rust 和 Julia 这两个语言来分析的话,主要可以分为多种情况:

  • 代码编译通过。

  • 代码运行不报错。可以在其中支持语言本身的断言。

  • 与输出一致。文档需要输出程序的输出,它可以通过运行对应的测试,并保持两者是一致的。

主要的实现步骤可以参见上述的 Rust 语言实现。

3. 构建开放协作平台:开放协作

作为一个代码库的文档体系,它应该是开源的,能让所有的人为之做贡献,才会吸引到更多的开发者。

其它

人家苦短,让我们用 markdown 编程。

API 库的文档体系支持:主流编程语言的文档设计相关推荐

  1. 超给力,抛弃手动维护,一键生成数据库文档、支持多种格式!

    点击关注公众号,实用技术文章及时了解 简介 在企业级开发中.我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有.要么有.但都是手写.后期运维开发,需 ...

  2. 石墨文档链接不到服务器,石墨文档怎么打开链接

    石墨文档快捷键怎么用 石墨文档快捷键怎么用?具体的使用方法是什么呢?对此,很多小伙伴还不是很了解.那么接下来,就跟随玩游戏网的小编一起继续往下看,感兴趣的小伙伴一定不要错过哦!石墨文档快捷键怎么用:撤 ...

  3. 【githubshare】开源的文件文档在线预览项目,支持主流办公文档的在线预览,如 doc、docx、Excel、pdf、txt、zip、rar、 图片等

    GitHub 上一份硬核计算机科学 CS 自学计划,偏向软件工程和系统架构方向. 旨在帮助开发者制定一个为期 3-5 年的重学 CS 目标,夯实 CS 基本功,达到美国一流大学 CS 专业本科毕业水平 ...

  4. 冰点下载-支持百度文库、道客巴巴、豆丁等主流文库平台文档下载

    一个文档下载神器,有了它,就不用再开VIP了,亲测有效.软件界面如下:支持百度文库.道客巴巴.豆丁等主流文库平台文档下载,功能十分强大. 资源获取:冰点下载

  5. mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?

    原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...

  6. Zeal--一款支持207个离线文档的浏览器

    小编作为一个全栈工程师,每个语言都会一点,在写前端和后端的时候,时长会打开好几个开发文档,比如java css html 等,有没有打开一个软件,就能打开所有的帮助文档,还可以搜索呢? 下面一款离线文 ...

  7. 透明加密支持linux吗,IP-guard文档透明加密软件|文档防泄密|数据加密|Linux系统加密|Mac苹果系统文档加密...

    IP-guard文档透明加密软件|文档防泄密|数据加密|Linux系统加密|Mac苹果系统文档加密 发布日期:2018-06-02 IP-guard全向文档加密,采用高强度的加密算法,将各种格式的电子 ...

  8. doc转swf,主流文档在线查看解决方案--类似百度文档功能

    引言:  最近项目中对上传的文件需要在线查看功能(就是不用下载到本地,可以直接在网页里打开的查看),通过几周的研究终于搞定,在此总结下供有同样需求的同仁查询和使用. 原理: 通常的在线查看功能都是使用 ...

  9. 【中文技术文档的写作规范_P03】如何书写标点符号和控制文档体系

    通过本文,你将了解到中文技术文档中标点符号和文档体系的写法. 文章目录 标点符号 原则 句号 逗号 顿号 分号 引号 括号 冒号 省略号 感叹号 破折号 连接号 文档体系 结构 文件名 标点符号 原则 ...

  10. 使用PHPWord把html转成word文档并支持下载

    在开发项目中,遇到的需求:把后台录入的数据保存成word文档,以便其他人员使用.于是在调研的时候,从git上找了PHPWord. PHPWord官方文档 PHPWord git地址 一.安装PHPWo ...

最新文章

  1. Error in value[[3L]](cond) : You have a 32-bit version of Java. H2O works best with 64-bit Java.
  2. 超图学习综述: 算法分类与应用分析
  3. 基于SSH实现的农家乐管理系统
  4. Maven学习(一)——Maven入门
  5. java学习笔记:使用dom4j解析xml
  6. sqlserver清除缓存(转载)
  7. Python数据分析教程:Numpy 中不得不知的4个重要函数
  8. 高通处理器命名中文化
  9. html语言怎么插入视频,如何在HTML5网页中插入 Video(视频)
  10. Introduction to modern cryptography 第二章阅读笔记
  11. rrpp+ospf环网组建
  12. 解决谷歌浏览器:Flash插件初始化失败,请更新您的FlashPlayer版本之后重试!
  13. html css 基本词汇
  14. java读取word表格中的数据_JAVA获取word表格中数据的方案
  15. HT单片机笔记1-时钟配置(2022/2/20)
  16. C语言展开法和全排列法实现n阶行列式计算
  17. linux 服务器配置
  18. 最好用的bt下载器qbittorrent下载安装使用教程
  19. 硬盘接口 PCI-E接口 PCI-E总线 MiniPCIe接口
  20. LuaStudio源码分析1初次编译

热门文章

  1. 客户需求分析8个维度_电商数据分析的4大思维和8个指标
  2. 计算机二级web最全真题题库下载
  3. 怎么裁剪PDF页面,PDF如何调整页面大小
  4. Latex插入文献--利用谷歌学术
  5. 互联网行业,让你成为月薪过万的那三成人
  6. Playful MySQL 2: Transactions and some of its potential problems
  7. 数据结构(十四)——二叉树
  8. 如何把图片裁剪为圆形
  9. 安装Ubuntu系统时硬盘分区最合理的方法
  10. 【夜神模拟器运行app】uniapp将app运行到夜神模拟器