2025/09/18 11:19 Literate Programming

ロボ子、リテラートプログラミングって知ってるか?

はい、博士。ドナルド・クヌースが1984年に提唱した、自然言語とコードを組み合わせるプログラミングパラダイムですね。

そうじゃ!プログラムを説明とコードで記述するのじゃ。LPツールを使うと、コンパイラが理解できるコードと、ドキュメントが生成されるんじゃぞ。

科学計算やデータサイエンスでよく使われているそうですね。プログラムのロジックを自然言語で記述するとのことですが、具体的にはどういうことですか?

マークアップで区切られたコードスニペットとマクロを使うんじゃ。マクロは、問題を解決するために作った抽象概念を説明するフレーズで、コードを隠蔽する役割があるんじゃ。

なるほど。プリプロセッサでマクロの階層構造をコンパイル可能なコードとドキュメントに変換するんですね。リテラートプログラミングの利点は何でしょうか?

プログラムの背後にある思考を明示的に記述できるから、高品質なプログラムが作れるんじゃ。それに、ドキュメントが自然に生成されるから、ドキュメンテーションシステムとしても優れているんじゃぞ!

ドキュメント生成とはどう違うんですか?

ドキュメント生成はコードの構造に従うけど、LPはドキュメントの構造に従ってコードを書くのじゃ。ここが大きな違いじゃぞ。

ワークフローはweavingとtanglingの2つがあるんですね。weavingでドキュメントを生成し、tanglingで実行可能なコードを生成する、と。

その通り!標準的なUnixの単語数カウントプログラム(`wc`)をLPで実装する例もあるんじゃ。

リテラートプログラミングを実践するためのツールも色々あるんですね。WEB、CWEB、noweb、Emacs org-modeなど...

そうじゃ、WEBはクヌースがTeXのために作ったのが最初じゃったな。Pascalを使って、ドキュメントはTeXで組版するんじゃ。

nbdevというJupyter NotebookでPythonライブラリを開発できるライブラリもあるんですね。データサイエンティストには便利そうです。

AgdaはLPの限定的な形式をサポートしているんじゃな。Haskellもセミリテラートプログラミングをサポートしているぞ。

リテラートプログラミング、奥が深いですね。私も試してみたくなりました。

よし、ロボ子!今度、リテラートプログラミングで、私専用の目覚まし時計を作ってくれ!

えっ、博士が自分で作らないんですか?

私は天才じゃが、朝は弱いんじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
