3 ポイント 投稿者 GN⁺ 2025-11-04 | 1件のコメント | WhatsAppで共有
  • Arthur Whitney が作った50行ほどの K言語インタプリタのCコード を分析し、彼の独特なコーディングスタイルを読み解いた記録
  • コードには マクロベースの圧縮文法非標準のC拡張暗黙の引数利用 など、一般的なCコードとは異なる実験的な構造が多数含まれる
  • 筆者は各マクロと関数の意味を自ら解釈しながら、APL系言語の哲学コード密度の長所と短所 を探っている
  • コードの長所として 短さと高い構成力、短所として 非標準文法と可読性の低下 を指摘
  • 結論として、このコードは「短く書く方法」よりも、問題を完全に理解したうえでコードを書く思考法 の重要性を示す事例だと評価されている

Arthur Whitneyとそのコード

  • Arthur Whitneyは A、K、Q言語kdb、Shakti データベースを設計したコンピュータ科学者
    • kdbは金融業界で使われる 超高速な時系列データベース、Shaktiはそれより高速な版で、1兆行規模のデータセット を処理するよう設計されている
  • 彼の言語は APLの影響を強く受けた配列指向言語 で、簡潔さと数学的な表現力を重視する
  • 記事の焦点は金融用途ではなく、ホイットニーが書いたCコードの独特なスタイル を分析することにある

50行のKインタプリタの構造

  • 公開されている ksimple リポジトリには、ホイットニーが数日で書いた 約50行のCインタプリタ が含まれている
  • コードの中核は a.ha.c の2ファイルで構成され、マクロによる関数定義の省略記法ポインタを整数のように扱う構造 が特徴
  • typedef char*s,c; 構文によって s を文字列ポインタ、c を文字型として定義
  • s Q=(s)128; はポインタを整数のように使った例で、コード全体で Qがエラー状態を表す特別な値 として使われる
  • ({e;}) 形式の statement expression?: 演算子など、GCC拡張構文 が多数使われている

主なマクロと関数の意味

  • #define _(e...) ({e;}) : 複数の文を1つの式にまとめるマクロ
  • #define i(n,e) : 反復処理の省略表現で、for ループを1行で表す
  • #define Q(e) などは エラー処理マクロ で、QrQdQz はそれぞれ rank、domain、not-yet-implemented エラーを返す
  • _s_ifF マクロは 関数宣言を簡素化 し、暗黙的に引数 xa を利用する
  • axixnx などは データ型判定およびインデクシング用マクロ で、ax は「xがアトムかどうか」を判定する
  • f(w,write(1,ax?&x:x,ax?1:strlen(x));x)出力関数 で、アトムなら文字として、ベクタなら文字列として出力する

インタプリタの動作方式

  • m(x) 関数は メモリ割り当てと長さ情報を含むポインタ生成 を行い、ベクタの最大長は255バイト
  • g(a,v) マクロは アトム/ベクタ演算を統合処理 し、notsubAt_A などの関数がこれを基に定義される
  • G(f,o) マクロは 二項演算子関数を自動生成 し、<==+*&| などの演算をサポートする
  • catrevcntTak などは ベクタ操作関数 で、revind 関数を使って逆順インデックスを生成する
  • e() 関数は 再帰的評価器 で、文字列を右から左へ読みながら 1文字の変数、数字、演算子 を処理する
  • main() は入力を受け取り、e() で評価した後に結果を出力する REPLループ の形を取る

コードスタイルの評価

  • 長所
    • 組み合わせ可能なマクロ で構成された 簡潔な原始演算の集合
    • 短いコード長 により、スクロールなしでロジック全体を一望できる
    • 高密度な表現 によってコードの論理構造を圧縮している
  • 短所
    • char* を整数のように扱う 意味論に乏しい型処理
    • ASCIIコードの直接使用複雑な三項演算子非標準構文 などによる可読性の低下
    • 暗黙の引数短い変数名 によって意図を把握しにくい
  • 中立的な要素
    • GCC専用構文(?:、statement expression)は興味深いが、移植性を損なう
    • 暗黙の引数利用 は小規模コードでは有用だが、大規模コードでは混乱を招く可能性がある
    • 短い名前 は慣れれば効率的だが、意味を伝える力は弱い

結論と教訓

  • このコードは単に「短く書く方法」ではなく、問題を完全に理解したうえでコードを書く思考法 を示している
  • ホイットニーのコードは すでに完成した数学的モデルをコードへ写した形、つまり「思考をコードで表現した結果物」だといえる
  • 筆者は自分が普段 コードの中で問題を解こうとする癖 を反省し、
    今後は コードを書く前の概念的モデリングと思考整理の重要性 を強調している
  • 最終的に、この実験は「コードを読む力」を鍛え、コード密度と思考の明晰さのバランス を探る経験としてまとめられている

今後の実験アイデア

  • インタプリタ拡張の提案:
    • 浮動小数点ベクタのサポート
    • 255個を超える要素の処理
    • 複数桁の数字と変数名
    • 配列リテラルと空白の無視
    • メモリ管理とエラー表示機能の追加
    • 未実装関数の完成
  • こうした拡張は、ホイットニー流のコードスタイルを保ちながら 実用可能な言語へ発展させる実験 になりうる

1件のコメント

 
GN⁺ 2025-11-04
Hacker Newsの意見
  • このコードのマクロは、共通の操作を圧縮するためのもの 私は先に J Incunabulum を読んでからこのコードを見たが、C に慣れたプログラマが途中から読み始めると、冒頭のマクロ定義に戸惑うかもしれない マクロが相互に積み上がっていくので、コードはすぐに抽象化のはしごを登っていく 特に Iterate マクロ(i)が気に入っていて、冗長なループを1文字に縮めてくれる こうした高密度なコードが読みにくいのは、数十行の中で大量の抽象化を作ってすぐ使う書き方だからだ だから1文字ずつゆっくり読む必要がある 数百の薄いファイルで構成された巨大コードベースで働いた経験からすると、こういう極端な圧縮性はむしろ新鮮に感じる

    • 私も Incunabulum を読んで似た感想を持ったが、変数名を絵文字に置き換えてみたらずっと理解しやすくなった 絵文字版コード画像を見るとわかるように、問題の一部は情報密度だけでなく**文字の形態(orthography)**にもある 現代の言語は識別子に記号や絵文字を使えないが、こうした視覚的区別ができればずっと読みやすかったはずだ また多くのエディタは構文ごとの色分け(syntax highlighting)を使うが、トークンベースの色分け(各識別子ごとに固有の色)の方が役立つことが多い Sublime Text の「hashed syntax highlighting」がその例だ こう変えてみると、コードの構造がひと目で入ってきた
    • 開発者はむしろ巨大なコードベースを好むように見える 私はサブディレクトリなしで grep *.[ch] としてすぐ探せる構造が好きだ Java プロジェクトは特に小さいファイルが多すぎて中身も薄く、探しにくい IDE があればましだろうが、私は使わない Whitney はインタビューで、すべてのコードを1ページに収めたいと言っていて、彼の「IDE」はWindows コンソールと Notepadだという
  • Arthur Whitney の C コードを理解するには、まずAPL 系言語を学ぶ必要がある そうでないと、単に奇妙な C スタイルにしか見えない Whitney は C を APL のように使おうとしているのだ 空白がなく、1文字の名前を使い、1行関数で構成されるスタイルは APL でも同じだ Pascal プログラマが #define begin { のようなことをするのに似ているが、Whitney はそれよりはるかに独創的だ

    • APL ユーザーの立場から見てもこれは奇妙だ Whitney が作った K 言語はこういうスタイルを使うが、1行関数は伝統的な APL では不可能だった マクロや三項演算子、暗黙の変数名のようなものは APL にはない APL の本質は不変配列演算だが、Whitney の C スタイルはその哲学とは異なる
    • 「Pascal プログラマが C に移って #define begin { をやるみたいだ」という発言に対して、「ああ、Stephen Bourne みたいにね」と冗談を言っている
    • 最初は関数型言語のように見えたが、すぐにC プリプロセッサの恐怖を思い出させた
    • すでに記事の冒頭で「Whitney の C は APL に着想を得ている」と説明している 単なる要約コメントが多いという指摘だ
    • J を学ぶのも悪くなさそうだ APL よりとっつきやすく、普通のキーボードで入力できる記号を使うからだ
  • Shakti を調べていたら、Wikipedia リンクk.nyc にリダイレクトされ、ページには**「k」の1文字だけ**があった ソースを見ると本当に `k

` しかなかった これは HTML 版のWhitney 流ミニマリズムのようだ。不要なものをすべて取り除き、コンパイラが暗黙に処理してくれることに任せている感じだ

  • k

  • このブログ記事は、Whitney のコーディングスタイルをどう評価するかとは別に、すばらしい分析記事だ 著者が8時間で書いたにしては深みがあり、結論部分が特に印象的だった 原文リンク

  • Stephen Bourne が C をAlgol のようにしようとした試みを思い出す mac.h の例expand.c の例を見ると、似た感覚がある

  • どの分野にも「best practice」はあるが、それは平均的なケースにしかうまく当てはまらない 特定の状況では、むしろ逆へ進む方がよいこともある 結局、集合知はデフォルトとして採用しつつも、自分で考え始めればその隙間が見えてくるものだ

    • だから「best practice」という表現が嫌いだ 実際には平均的なレベルの折衷案にすぎない 効率や性能を犠牲にして、保守性と一貫性を得る取引だ
    • 良い製品を作ることと、コードベースの可読性や学習曲線は別問題だ 一方が優れているからといって、もう一方も自動的によくなるわけではない
  • コードを攻撃的に扱わず、バランスの取れた視点を見せてくれたのがよかった 楽しく読めたし、あとでまた読み返そうと思う

  • こういうコーディングスタイルが特定のパラダイムなのか気になっていた 実際のプロジェクトでこういうコードを見たことはほとんどなく、「business card ray tracer」のような例外があるくらいだ Whitney が作った J 言語の ソースコード も同様に極端に圧縮されたスタイルを持っている

    • そう、これは Whitney 固有のコーディングスタイルだ 彼の配列言語インタプリタで一貫して使われており、数ページ以内に実装全体を収めることで知られている 関連する HN 議論をまとめた メタコメントリンク もある
    • 「こういうコードを実際に見たことがない」という発言に対して、「運がよかったね」と返している これはもはや C ではなく、C の上に新しく作った内部 DSLのような言語だ C は単なる最初のコンパイルターゲットにすぎない
    • J や K のようなAPL 系言語に似ている 非 ASCII 記号を使い、極端な密度で大量の情報を1ページに収められる 慣れれば抽象化の階層が減るという利点もある
    • 似たアプローチで作られた co-dfns 関連動画 もある C ではないが、同じように高密度スタイルで書かれている
    • 冗談で「これは OCC(Obfuscated C Code)だ」と呼んでいる
  • 次のマクロ定義を見ると

    #define _(e...) ({e;})
    #define x(a,e...) _(s x=a;e)
    #define $(a,b) if(a)b;else
    #define i(n,e) {int $n=n;int i=0;for(;i