
2026/10/25 6:44
小さなプログラムと言語
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要:
本テキストは、微小なプログラムの独自の魅力を称賛し、膨大なコードベースと比較して、極度の簡潔さがプロジェクトの親しみやすさと読み易さを大幅に向上させると主張する。この視点は、システムが予測不可能な行動をとるのを防ぐため、複雑な表現力よりもシンプルさを優先することを示唆している。これを支援するために、著者はいくつかの超小型プロジェクトを紹介する:Luke Jackson の 25 行の DOM 差分化ライブラリ (ijk)、Arthur Whitney の J 用の 122 行の C インタプリター(「Incunabulum」)、および Roger K.W. Hui の単一ページ C インタプリターである。議論には、Philippe Brochard による 46 バイトの Forth 実装、Frank Force による 2Kb の JavaScript 3D ブラウザゲーム、そして bootable 90 Kb の kOS(Whitney の k 配列言語を採用し、kdb は reportedly 100 行の C で実現)が含まれる。歴史的文脈は、David Ungar の講演への言及で彩られており、そこではシンプルさが表現力を上回るべきであると論じられている。また、Arthur Whitney の J のフラグメントが単一の午後で提示されたこと、および William Byrd の「Ever Written 最も美しいプログラム」——Lisp に書かれた Lisp インタプリター——への言及も含まれる。Kolmogovorev 複雑性(特定の結果を生成する最短のプログラムを測定する概念)や、ビジネスクリープサイズのレイトレーサー、あるいはガベージコレクションが 436 バイトに削減された Lisps のような例は、ミニマリズムの力をさらに示している。これらの最小限のコードベースと小さな言語を採用することは、新規ユーザーも seasoned industry practitioners も容易に理解でき、アクセスしやすくすることでソフトウェア開発を革命させることができる。究極的には、不必要な機能よりも明瞭さが最優先される文化を育成する結果となる。
本文
小型化されたコードとプログラムへの魅力:複雑性の極限と人間性の探求
小型プログラムの魅力
小型なプログラムは直感的で親しみやすいものです。
- 読解性の向上: コード行数が少ないほど、読む確率は高くなります(例:200 行 vs 20,000 行)。
- 驚きと発見: 「想定していた膨大な処理量が、実は数行で達成されていた」という発見は、学習意欲を劇的に引き立てます。
具体例による考察
Luke Jackson の ijk
リポジトリ(DOM 差分計算)
ijk- 大型 JavaScript ライブラリに慣れた筆者にとって、このライブラリがたった 25 行であることを知った時は衝撃的でした。
- この極小サイズが示すのは、実用性と最小限の複雑性の調和です。
Philippe Brochard の 46 バイト Forth
- 46 バイトという極端な短さで動作する「Forth」が存在します。
50b8 8e00 31d8 e8ff 0017 003c 0575 00ea 5000 3c00 7401 eb02 e8ee 0005 0588 eb47 b8e6 0200 d231 14cd e480 7580 c3f4 - 意味: ヘキサダンプとして並べることも可能というほどです。
- 心理: 「恐ろしい」ではなく、「解明可能な謎」として捉える姿勢が重要です。工夫次第で仕組みは理解できます。
Arthur Whitney の「インクンブゥラム(初版)」
- AT&T 3B1 コンピュータ上のインタプリタ断片で、1 ページ・1 日で作成された物語です。
- 難解さの示唆: C 言語だけで記述されつつも、構造とスタイルについて一週間の勉強が必要でした(付録 A に掲載)。
- 高密度な価値: 社会から追放されて山奥に避難する場合、持ち歩くべき「高密度な知識」としての側面があります。
- 補足: J 言語(APL ファミリー)は、簡潔さと難解なパズル、高性能計算を追求する方々にとって最適です。
Alex Alejandre と Geo Carncross の kOS (2026 年更新)
- kOS: Whitney 氏の配列言語「k」の特徴を持つ OS で、起動イメージは90KBです。
- GUI ウィンドウマネージャ:60 行の C実装。
- kdb データベース:100 行の C実装(Whitney の C とするならばさらに驚異的です)。
- 関連リソース: Impending kOS (vector.org.uk) も必見です。
William Byrd の「有史以来最も美しいプログラム」
- ネタバレ注意: それは Lisp を使ったLisp インタプリタそのものです。
(define eval-expr (lambda (expr env) (pmatch expr [`,x (guard (symbol? x)) (env x)] [`(lambda (,x) ,body) (lambda (arg) (eval-expr body (lambda (y) (if (eq? x y) arg (env y)))))] [`(,rator ,rand) ((eval-expr rator env) (eval-expr rand env))]))) - 意義: 極めて少ないコードでインタプリタの核心を表現する能力。
再構築か、根本的な真実か?
コードゴルフは娯楽ですが、その実用性や意味は存在します。
コードゴルファーの真摯な意図
- レイ・トレーサーの例: ビジネスカード一枚(有限スペース)で動作する最小複雑性の達成は、ビジネス上の制約下でも実現可能であることを示唆します。
- Kolmogorov 複雑性: 「与えられた出力を生成する最短プログラム」の概念は、人類全体の利益のために最小限の表現を探す行為そのものです。
本質的な複雑性の極致
- Gzip と Lisps: ガベージコレクション付き Lisps の根本的複雑性を抽出すると、436 バイトに収約できます。
- これは人間が頭で理解可能なサイズです。
- Frank Force の 3D ブラウザゲーム: 異常に圧縮された JavaScript ソース(2KB)で実現されています。
結論:ミニチュア化の真価
- ミニチュアプログラムは「時計仕掛けのパズル」ではなく、**「この概念はビジネスカード一杯に収まり、かつあなたの頭の中で処理できる」**という事実そのものです。
- 推奨アプローチ:
- ミニチュア自体よりも、それを読み解くことに集中してください。
- 小型なプログラムには多くの教訓(作成方法を含む)が含まれています。
小型言語への魅力
小型言語は、表現力と簡潔さのバランスを探求する面白さがあります。
小型言語の特徴
- 制約: サイズが小さいほど表現力は低下しうる(例:アセンブリ言語)。
- アセンブリ言語は opcode の厳格なシーケンスであり、文法的な構造そのものはほぼ存在しません。
- 例外となる「奇妙」な言語:
- SNOBOL: 制御フロー面でアセンブリ言語のような挙動を示しますが、文字列処理においては劇的に異なり、極めて効果的です。
傑出した小型言語(文法的コア:インデックスカード分以下)
| 言語 | 特徴と魅力 |
|---|---|
| Forth | 唯一の構文要素がスペースのみ。驚くほど柔軟かつ強力な表現力を持ちます。 |
| Lisp (特に Scheme) | シンプルな文法ながら、膨大な表現力と柔軟性を備えたコア言語を有しています。 |
| Tcl | 「すべてが文字列」であり奇妙ですが、独自の言語構築が可能で面白いです。 |
- 思考の変革: これらの言語は小さな核から無限のパワーを引き出しますが、Algol 風の手続き型言語からの慣習からの脱却が必要です。
他の候補:Lua と Zig
- Lua: 非常に薄手で(印刷版27 ページ)、ゲームマニュアルより薄いほど説明が簡潔です。
- C よりも扱いやすく、表現力とサイズが良いバランスです。
- C: サイズは小さいですが、安全かつ効果的に使うのは容易ではありません。
- Zig: C に似ていますが、学習曲線が大きく、多くの知識を要求します(ファンにとってはその大きさが理由でしょう)。
- JavaScript: コア言語は小さく、関数・配列・オブジェクトの組み合わせで十分表現力が得られます。
David Ungar による「単純性の優先」
「システムを少しばかり単純に作っておき、人が余計なものを書かねばならない状況—even 同じことを二回書いて 'Look over here' と注釈をつけても— より、奇妙な振る舞いをするシステムで誰もその理由が理解できない状況を避ける方がよほど良い。つまり、単純さが表現力よりも優先される。」
- マイクロワールド (Microworld): David Ungar の講演から発見された概念。小さく自立した学習環境です(例:Self 言語)。
- ARK: Smith と Ungar が作成し、今日も開発が続いている Self 言語のプロジェクト。
- ライブラリの重要性:
- 言語そのもののサイズだけでなく、「標準ライブラリ」や「関数ライブラリ」が表現力を左右します。
- 例:Ramda(JavaScript 関数型プログラミング)はカルリー関数の一貫性で開眼体験をもたらしますが、全てをマスターする必要はありません。「少し使うだけで十分」です。
なぜ小型言語なのか?
- 感覚: 簡潔さは実用性を超えた「喜び」や「魅力」を生みます。
- 慎重な設計: 小型であるためには、非常に慎重な設計が不可欠です。
小型の事物全般への魅力
コード以外にも、ミニチュアや超小型スケールへの愛着は多くの人が共有しています。
ステファニー・M・ランギン=フーパー氏の説
「…実寸のものを小さなスケールに縮小するという行為には大きな影響力があります。対象は現在、愛らしく、アクセスしやすく、繊細で、'squee(喜び)になります。また無力であり、したがって制御可能—その小ささゆえに心地よく、全く脅威にならない。」
- コンピュータ文脈での「制御可能」:
- 巨大で不吉な宇宙の中で、小さな部分を制御することで秩序感と自らの価値を取り戻せます。
- 広大な現実とは異なり、オフラインのコンピュータは努力次第で全てを理解できる幻想的な場所です。
シモン・ガーフィールド氏の見解
「答えは支配欲と明快さへの渇望にあります。秩序と照明を混沌とした世界に持ち込み、本来なら自分がそれをほとんど制御できないと感じる世界を一層豊かな人生に変える能力は過大評価されるべきではありません。 […] 最も単純に言えば、ミニチュアは『少ないもので多くを学び、賞賛する』方法を教えてくれます。」
アセンブリ・ナイツとの関係
- 小型スケール: 整然とした論理と内部的一貫性をもたらします。
- 瞑想的な活動: 「現実生活を一時的に閉ざす」という行為は、パズル愛好家や大人向け塗り絵作家にとって不可欠です。
- 小さないくつかの詳細に膝を屈している人々は、世界がそれが必要としているかのように振る舞っていますが、それはその世界が実際、そのように依存しているからです。
結論: 私たちの分野における「大きな」ものは、個々が新しい方法で「小さな」問題を解決する多数の「小さな」勝利の集積に過ぎません。