- 20年間Ruby on Railsのフリーランスとして働いた経験は Common Lisp のプロジェクトへとつながったが、性能・移植性・実行環境の限界が積み重なり、再びCを選ぶことになった
- cl-facts は高速なトリプルストアとネスト可能なアトミックトランザクションを備えていたが、開発期間が長引き、クライアントを失う結果にもなった
- 仮想マシン、Linux cgroupsベースのコンテナ、ガベージコレクタへの不満は、C が依然としてシステムソフトウェアの現実的な基盤だという判断につながった
- libc3 から始まった作業は、C3言語、インタープリタ ic3、コンパイラ c3c の構想へと拡張され、名前の衝突のため後に KC3 へと変更された
- 現在のKC3には、C89へ移植したグラフデータベース、REPLの ikc3、MVCウェブサーバー kc3_httpd、Markdown-to-HTML のC実装を基盤とするドキュメントサイトまで含まれている
Common Lispでの作業がCの再実装へとつながった経緯
- 5年間フランスのコンピュータ学校で学び、20年間Ruby on Railsのフリーランス開発者として働いた後、短い学習で済むと思っていた Common Lisp が次第に大きなプロジェクトになっていった
- Common LispでCコードを生成して ASN.1 パーサー とクエリシステムを作り、この作業はカスタムの Common Lisp-to-C SNMP サーバーへと拡張された
- その後、複数のCommon Lispパッケージを書いた
- cl-unix-cybernetics は、GitHubリポジトリの中で最も多くスターを獲得したプロジェクトとなった
- cl-streams、cffi-posix も作成した
- cl-facts は、Common Lispのグラフデータベースとして使えるトリプルストアである
- cl-factsは、高速性能、アトミックトランザクション、ネスト可能なトランザクション、
unwind-protect 互換性、3つのマクロだけ覚えれば使える使いやすさを備えた成果物だった
- cl-factsはベルギーの European Lisp Symposium でライトニングトークとして発表され、発表スライドは facts.pdf にある
- Common Lispパッケージの開発には長い時間がかかり、その間にクライアントを失ったが、Common Lispは将来世代のための道具だと判断した
C、KC3、そして現在の構成
- 仮想マシンはCPUと帯域幅をエミュレーションに浪費し、Linux cgroupsベースのコンテナではRCEと権限昇格の問題が継続的に見つかっているという経験から、OpenBSD を中心に選ぶようになった
- TerraformやAnsibleのようなDevOpsツールを避け、VMやコンテナだけでなく、プログラミング言語そのものに不満を持つ人々も見てきた
- Clojureで数千のユニットがそれぞれ世界認識を持つ戦略ゲームを作ろうとした事例は、ガベージコレクタ のために失敗した
- Common Lispのプロジェクトもガベージコレクタのために適用範囲が制限され、JVMのガベージコレクタは、うまく作るには大きなコストがかかる商用上の強みだと評価された
- 性能と移植性を考えると、別の道具がない限り合理的な選択は C だと判断した
- LinuxはCで書かれている
- OpenBSDはCで書かれている
- GTK+はオブジェクト指向の純粋なCで書かれている
- GNOMEはCで書かれている
- 多くのLinuxデスクトップアプリも古いCで書かれている
- libc3 ユーティリティライブラリから出発し、C3言語、インタープリタ ic3、コンパイラ c3c の構想へと発展した
- UTF-8バッファとデータ構造が高速に行き来できるようにし、メモリコストを受け入れて bounds-check を適用した
- 防御的プログラミングを前面に据え、最初からバグを0に近づける方向を定め、KC3のコードはセキュリティ上の含意なしに実行されると述べている
- 初期のインタープリタは、言語のすべてのデータ型を格納する enum-tagged union である tags をREPLで処理する形で作られた
- 3年後、5層のリファクタリングを終え、テストは再びすべて通り、ウェブサーバーも再び壊れない状態になった
- 言語名のC3はすでに使われていたため、KC3 に変更された
- 既存のCommon Lispグラフデータベース cl-facts はC89へ移植された
- その大部分は2020年のCovid-19ロックダウン期間に書かれた
- トリプルの追加・削除、再帰クエリシステム、トランザクション、ロギング、永続性を含む
- Common Lispの元の設計をC89でほぼそのまま実装した
- KC3には、さまざまなアルゴリズム的データ型の形式的意味を扱うためのパーサーとジェネレーターも含まれている
- Structs, Linked lists, Maps, Hash tables, Time, Complex, Rationals, Tuples, Code blocks, Quotes, Unquotes, Copy on write, Skip lists, Sets などが含まれる
- マクロがあり、後続の記事で例を扱う予定である
- José Valim とElixirでの仕事から大きな影響を受けた
- ikc3 REPLはキーボードやファイル入力をパースし、KC3の評価結果を標準出力へ出力し、KC3の単体テスト第2段階の大部分で使われている
- kc3_httpd はMVCフレームワークを備えたウェブサーバーであり、現在のウェブページを生成している
- Common Lispの記事の閲覧数は700回を記録し、ドキュメントウェブサイトは kc3_httpd と拡張された Markdown-to-HTML のC実装で作られている
まだコメントはありません。