去年,我們在那篇《編程語言的 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 在遍歷了語法樹之后,會:

決議 markdown,尋找 Rust 語言的語法塊(如果沒有標注語言型別,默認是 Rust)
根據語法塊,做一些簡單的處理,生成可編譯的代碼
編譯上述的測驗代碼 (如果編譯失敗,則說明測驗失敗)
運行這些測驗 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 編程,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/304461.html
標籤:其他
上一篇:如何實作Android指紋登錄
