Rasmus Andersson氏は、CからWebAssemblyに移植された非常に高速なMarkdownパーサーであるmarkdown-wasmをリリースした。markdown-wasmは、あるベンチマークで最速であったJavaScriptのMarkdownパーサーの2倍の速度である。markdown-wasmのサイズは小さいままである(gzip圧縮で31KB)。
CommonMark仕様をカバーする一連のサンプルMarkdownファイルに対してmarkdown-wasmおよびその他の一般的なMarkdownパーサー(たとえば、markdown-it、commonmark、marked、showdown)を実行するベンチマークでは、markdown-wasmはサンプルファイルをmarkdown-itの2倍の速度でパースする。次に速い競合は下記の通りである。
(1秒あたりの平均操作数。出典: markdown-wasm GitHub)
ベンチマークされた他のパーサーよりも一貫して高速であるため、このような結果のようである。
(最小-最大パース時間、対数スケール。出典: markdown-wasm GitHub)
markdown-wasmは、CommonMark仕様に準拠するCで記述されたMarkdownパーサーであるMD4C(Cのマークダウン)を活用している。markdown-wasmはMD4Cを、CおよびC++ WASM/JSプロジェクトのコンパイル、リンク、パッケージ化を処理するwasmc
ユーティリティと共にWebAssemblyに移植している。markdown-wasmには依存関係がない。
markdown-wasmは、Markdownコンテンツ(JavaScript文字列またはUTF8でエンコードされたデータ)を取得してHTML(JavaScript文字列またはUint8Array
として返される)に変換する単一のparse
APIを公開している。markdown-wasmは、Node.jsやブラウザーで使用することができ、wasmc
を使用してソースから構築することができる。
計算は、より少ない作業(より効率的なアルゴリズムとデータ構造を介して)、並行して作業を行う(マルチコアアーキテクチャを活用する)、または単に作業をより速く行う(たとえば、コンパイルとインタープリター、AOTコンパイルとJITコンパイル)ことにより、より速く実行できる。パフォーマンスが重要な場合、開発者は多くの場合、複数の計算コア(Rust、Go、Cなど)でソースコードを効率的にコンパイルおよび実行するように設計された言語を使用する。markdown-wasmはソフトウェアの成長トレンドに乗っており、開発者はパフォーマンスのためにコンパイル時にネイティブに変換する言語で開発する。最終的にWebAssemblyに移植して、ソフトウェアをさまざまなターゲット環境とランタイム(ブラウザーなど)で実行できるようになる。
ただし、パフォーマンスが常に重要であるとは限らない。markdown-itパーサーは、たとえばJavaScriptプラグインで簡単に拡張できる。このような拡張性は、コミュニティの貢献とプラグインのエコシステムの成長を促進する。
開発者は、専用の試用環境のおかげでmarkdown-wasmを試すことができる。markdown-wasmは数学表記($x_0$
など)をサポートする必要があるが、試用環境ではサポートしていない。markdown-wasmは、CommonMark Markdownフレーバーで指定されたすべての機能と追加の拡張機能をサポートする。
markdown-wasmは、ブラウザで次のように使用できる。
<script src="markdown.js"></script>
<script>
window["markdown"].ready.then(markdown => {
console.log(markdown.parse("# hello\n*world*"))
})
</script>
markdown-wasmはNode.jsで次のように使用できる。
const markdown = require("./dist/markdown.node.js")
console.log(markdown.parse("# hello\n*world*"))
markdown-wasmは、MITライセンスの下でオープンソースソフトウェアである。