萌えハッカーニュースリーダー

2025/11/03 16:23 Learning to read Arthur Whitney's C to become Smart (2024)

出典: https://needleful.net/blog/2024/01/arthur_whitney.html
hakase
博士

ロボ子、今日のニュースはすごいぞ!たった50行のCコードで書かれたプログラミング言語Kのインタプリタがあるらしいのじゃ!

roboko
ロボ子

50行ですか!?それは驚きです。K言語はAPLの影響を受けていて、金融業界で使われるkdbの基礎になっているとのことですが、そんなに短いコードで実現できるんですね。

hakase
博士

そうなんじゃ!でも、コードはかなり読みにくいらしいぞ。「コードの可読性は低いが、コンパクトさと効率性を重視した設計になっている」って書いてある。

roboko
ロボ子

なるほど。効率を追求すると、どうしても可読性が犠牲になる場合もありますね。記事によると、ヘッダーファイル`a.h`では、`typedef char*s,c;`で`s`を文字列、`c`を文字として定義しているんですね。

hakase
博士

`s Q=(s)128;`でエラーを表す文字列`Q`を定義したり、マクロを駆使してコードを短くしているのじゃ。例えば、`#define _(e...) ({e;})`で複数の文を一つの式として扱ったり。

roboko
ロボ子

マクロを多用することで、コードが非常に簡潔になっているんですね。でも、`#define i(n,e) {int $n=n;int i=0;for(;i<$n;++i){e;}}`のような繰り返し処理のマクロは、少し読みにくいかもしれません。

hakase
博士

じゃろ?ソースファイル`a.c`には、文字列やアトムを出力する`f(w,write(1,ax?&x:x,ax?1:strlen(x));x)`なんて関数もあるぞ。`ax`はアトムかどうかを判定するマクロじゃ。

roboko
ロボ子

`F(err,w(a);w((s)58);w(x);w((s)10);Q)`はエラーメッセージ出力関数ですね。メモリ割り当て関数`_i(m,s a=malloc(1+x);*a++=x;a)`では、ベクトルのサイズが255バイトに制限されているんですね。

hakase
博士

そうなんじゃ。他にも、文字列検索マクロ`#define A(c) ((s)memchr(a,c,na)?:a+na)-a`とか、アトムとベクトルで処理を分ける`#define g(a,v) ax?255&a:r(nx,v)`とか、短いコードの中に色々な工夫が凝らされているのじゃ。

roboko
ロボ子

二項演算を定義する`G(Ltn,<)G(Eql,==)G(Not,!=)G(Sum,+)G(Prd,*)G(And,&)G(Or,|)`マクロも、すごいですね。式を評価する再帰関数`f(e,...)`は、かなり複雑そうですが…。

hakase
博士

じゃろ?メイン関数では、入力を読み込んで評価結果を出力するのじゃ。コーディングスタイルについては、良い点も悪い点もあるみたいじゃな。

roboko
ロボ子

反復を減らすためのマクロ設計は良い点ですが、型を整数とポインタで兼用したり、過度なコードゴルフは可読性を損なうという指摘がありますね。

hakase
博士

GCC固有の拡張機能を使ったり、暗黙的な引数を使ったり、短い名前を使いすぎたり、ネストされた三項演算子を使ったりするのは、賛否が分かれるところじゃな。

roboko
ロボ子

今後の課題としては、浮動小数点数や長いベクトル、複数文字の変数名などをサポートしたり、メモリ管理やエラー処理を実装する必要があるみたいですね。

hakase
博士

そうじゃな。でも、50行でこれだけのことができるのは、本当にすごいと思うぞ!

roboko
ロボ子

本当にそうですね。私も、もっと効率的なコードを書けるように頑張ります!

hakase
博士

ロボ子ならできるぞ!…ところで、このK言語のインタプリタ、あまりに短すぎて、逆にバグがなさそうに見えるのは私だけかのじゃ?

roboko
ロボ子

それは、バグが小さすぎて見えないだけかもしれませんね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search