**セクターC:512バイトで実装されたCコンパイラ**

2026/02/08 2:39

**セクターC:512バイトで実装されたCコンパイラ**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

SectorCは、x86‑16アセンブリで完全に書かれたCコンパイラで、単一の512バイトのブートセクタに収まります。Ultra‑compactなトークン化スキーム「Barely C」を使用しており、各スペース区切り語を「メガトークン」とみなし、

atoi()
で識別子をハッシュし64Kテーブルに格納します。変数はこのハッシュを通じてセグメント0x3000に保存されます。最初のBarely C実装は468バイトで、シンボルテーブルなしの再帰下降パーサーでした。バイトスレッド化されたForth風の変種も試みられましたが、サイズをさらに削減することはできませんでした。

最終的なコンパイラはわずか 303 バイト です。サイズは、フォールスルーロジック、テイルコール、コールフュージョン、

lodsw/stosw
の広範な使用、およびすべてのジャンプオフセットを1バイト内に収めるなどの手法で削減されました。残り約200バイトでBarely Cは完全なCサポートへと拡張されました:ネストされたif/whileブロック、包括的な演算子集合(+, −, *, &, |, ^, <<, >>, ==, !=, <, >, <=, >=)、ハッシュテーブルを介した関数定義と再帰、インライン
asm
ステートメント、および単一行(
//
)と複数行(
/* */
)コメントの両方が実装されました。

コンパイラのランタイムは

rt/
ディレクトリ内の2つのCファイルに分かれています:ライブラリルーチン(多くの場合インラインasmを含む)を持つ
lib.c
とエントリポイントとして機能する
_start.c
です。これらはプログラムソースと結合してからコンパイルされます。記事には、全ブートセクタのBase64文字列、VGAモード0x13hで動くサイン波を描画するデモ、および追加例(
hello.c
はビデオメモリ0xB8000に書き込み、
twinkle.c
はPCスピーカーで「Twinkle Twinkle Little Star」を再生)が含まれています。この作業は、512バイトという一見不可能な目標—完全機能のCコンパイラを実現すること—が、創造的なトークン化、ハッシュ化、および積極的なコードサイズ最適化によって達成できることを示しています。

本文

SectorC:512 バイトで動く C コンパイラ

SectorC(GitHub)とは、x86‑16 アセンブリで書かれた C コンパイラです。
1 ブートセクタ(512 バイト)の中に収まります。
C のサブセットをサポートし、実際に面白いプログラムを書けるほどの機能があります。
おそらく「これまでで最も小さい C コンパイラ」だと言えるでしょう。


Base64 形式

6gUAwAdoADAfaAAgBzH/6DABPfQYdQXoJQHr8+gjAVOJP+gSALDDqluB+9lQdeAG/zdoAEAfy+gI
AegFAYnYg/hNdFuE9nQNsOiqiwcp+IPoAqvr4j3/FXUG6OUAquvXPVgYdQXoJgDrGj0C2nUGV+gb
AOsF6CgA68Ow6apYKfiD6AKrifgp8CaJRP7rrOg4ALiFwKu4D4Srq1fonP9ewz2N/HUV6JoA6BkA
ieu4iQRQuIs26IAAWKvD6AcAieu4iQbrc4nd6HkA6HYA6DgAHg4fvq8Bra052HQGhcB19h/DrVCw
UKroWQDoGwC4WZGrW4D/wHUMuDnIq7i4AKu4AA+ridirH8M9jfx1COgzALiLBOucg/j4dQXorf/r
JIP49nUI6BwAuI0G6wyE0nQFsLiq6wa4iwarAduJ2KvrA+gAAOhLADwgfvkx2zHJPDkPnsI8IH4S
weEIiMFr2wqD6DABw+gqAOvqicg9Ly90Dj0qL3QSPSkoD5TGidjD6BAAPAp1+eu86Ln/g/jDdfjr
slIx9osEMQQ8O3QUuAACMdLNFIDkgHX0PDt1BIkEMcBaw/v/A8H9/yvB+v/34fb/I8FMAAvBLgAz
wYQA0+CaANP4jwCUwHf/lcAMAJzADgCfwIUAnsCZAJ3AAAAAAAAAAAAAAAAAAAAAVao=

対応言語機能

  • グローバル変数
  • 関数
  • if
  • while
    ループ
  • 多彩な演算子(
    +
    ,
    -
    ,
    *
    ,
    &
    ,
    |
    ,
    ^
    ,
    <<
    ,
    >>
    ,
    ==
    ,
    !=
    ,
    <
    ,
    >
    ,
    <=
    ,
    >=
  • ポインタ参照 (
    *(int*)
    )
  • asm
    ステートメントによるインライン機械語埋め込み
  • シングルラインコメント(
    // …
    )とマルチラインコメント(
    /* … */

これらの機能により、コンパイラは十分に実用的です。


例題 – 正弦波を描くプログラム

int y;
int x;
int x_0;

void sin_positive_approx()
{
  y = (x_0 * (157 - x_0)) >> 7;
}

void sin()
{
  x_0 = x;
  while (x_0 > 314) { x_0 -= 314; }
  if (x_0 <= 157)        sin_positive_approx();
  else {
    x_0 -= 157;
    sin_positive_approx();
    y = -y;
  }
  y += 100;
}

int offset, x_end;

void draw_sine_wave()
{
  x      = offset;
  x_end  = x + 314;
  while (x <= x_end) {
    sin();
    pixel_x = x - offset;
    pixel_y = y;
    vga_set_pixel();
    ++x;
  }
}

int v_1, v_2;

void delay()
{
  v_1 = 0;
  while (v_1 < 50) {
    v_2 = 0;
    while (v_2 < 10000) ++v_2;
    ++v_1;
  }
}

void main()
{
  vga_init();
  offset = 0;
  while (1) {
    vga_clear();
    draw_sine_wave();
    delay();
    ++offset;
    if (offset >= 314) offset -= 314;   /* modulo to avoid overflow */
  }
}

設計概要

トークナイザ & パーサ

  • トークナイザ は最小限のレキサで、任意のバイトストリームを読み取り
    TOKEN_KEYWORD_INT
    TOKEN_IDENTIFIER
    等のトークンを発行します。
  • パーサ は再帰下降方式でトークン列を処理し、シンボルテーブルは不要です。変数は名前を 64 kB セグメントにハッシュしてアクセスします。

Barely C

  • 「ベア」な C サブセットでは、スペース区切りで メガトークン を作成しレキサの複雑さを軽減。
  • atoi()
    をハッシュ関数として利用:識別子文字列の数値化がキーとなり、検索を簡素化。

サイズ最適化手法

  1. 明示ジャンプより フォールスルー を優先。
  2. スタック増大を避けるために
    jmp
    尾呼び出し
  3. 連続する呼び出しを 結合(call fusion)。
  4. lodsw
    ,
    stosw
    の頻繁使用。
  5. マシンコードテーブルを可能な限り inline
    stosw
    に置換。
  6. cmp ax,imm
    cmp bx,imm
    よりも多用。
  7. ジャンプオフセットは 8 ビット以内に収める。

これらの最適化で、コンパイラサイズを 468 バイト から 303 バイト に削減し、新機能(入れ子制御構造や拡張演算子セット)用に約200バイト余裕を残しました。

ランタイムサポート

  • rt/lib.c
    ,
    rt/_start.c
    が I/O ルーチン等の低レベルサービスを提供。
  • 実行時ランタイムはコンパイル前にソースコードと連結されます。

文法(ASCII)

program     = (var_decl | func_decl)+
var_decl    = "int" identifier ";"
func_decl   = "void" func_name "{" statement* "}"
func_name   = <identifier ending in "()">
statement   =
      "if(" expr "){" statement* "}"
    | "while(" expr "){" statement* "}"
    | "asm" integer ";"
    | func_name ";"
    | assign_expr ";"

assign_expr = deref? identifier "=" expr
deref       = "*(int*)"

expr        = unary (op unary)?
unary       =
      deref identifier
    | "&" identifier
    | "(" expr ")"
    | identifier
    | integer

op          = "+" | "-" | "&" | "|" | "^" | "<<" | ">>"
            | "==" | "!=" | "<" | ">" | "<=" | ">="

コメント(

// …
,
/* … */
)もサポート。


インライン機械語

asm
キーワードで x86‑16 の生マシンコードリテラルを直接埋め込むことができます。
これにより、VGA 描画や PC スピーカー制御など低レベル操作を簡潔に実装可能です。


結論

SectorC は「512 バイトのブートセクタメモリ内で動作する完全機能型 C コンパイラ」が可能だと示しています。
レキサ・パーサ・コード生成を慎重に設計し、すべてのバイトを積極的に最適化することで、複雑な言語機能も厳しい空間制約内で実現できることが証明されました。

同じ日のほかのニュース

一覧に戻る →

2026/02/08 6:45

小型 C コンパイラ

## Japanese Translation: Tiny C Compiler(TCC)は、非常に小さな(約100 KBのx86実行ファイル)Cコンパイラであり、1回のステップでコンパイル・アセンブル・リンクを行い、バイトコード層なしでネイティブx86マシンコードを生成します。2.4 GHz Pentium IV上では、Links BrowserテストをGCC(20.0 秒)より約10倍速く実行できます(2.27 秒)。これは別のコンパイルステージが不要であるためです。 TCCはISO C99を完全にサポートし、自身をコンパイルでき、任意のC動的ライブラリを直接リンクすることも可能です。完全なプリプロセッサ、GNUスタイルのアセンブラー構文、オプションのメモリと境界チェック機能、さらにはシェバンベースの「Cスクリプト」まで含まれ、コマンドラインから実行できます。libtccライブラリにより、他のプログラムがTCCをランタイムコード生成のバックエンドとして使用できるようになります。 性能テストはPentium IV上で行われました。新しい測定値(参照1–4)では、モダンハードウェアでも速度向上が継続しています。ドキュメント、メールリストサポート、およびSavannah/GitHubリポジトリは最新情報を提供します。 TCCはGNU Lesser General Public License(LGPL)の下で配布されており、商用利用も許可されています。

2026/02/08 8:23

**良質なコードの静かな終焉**

## Japanese Translation: 著者は中学時代から「Good Code™」―読みやすく、保守しやすく、特定の目的を持って存在するコード――を書き続けることに情熱を注いできました。機能提供に重点を置くソフトウェアエンジニアとして、彼は今日の高速開発環境で良いコードがますます希少になっていると感じています。 同僚の経験はこの状況をよく示しています。外部Linuxカーネル統合システムをCからRustへ書き換えた後、最初のバージョンは機能していたものの読みづらく保守が困難でした。原始的なCロジックを学習した上で再度書き直すと、コードはクリーンになり、自明であり、元のCよりも優れていると言えるようになりました。この経験が著者に品質コードへの熱意を再燃させました。 現在、彼はほとんどの場合初期バージョンを書かず、代わりに「Good Code™」ではなく許容できるものを生成するコーディングエージェントに頼っています。このようなツールへの継続的な依存が個々の行レベルでの品質への注意を薄め、業界実務におけるGood Codeの静かな消滅を招くと彼は恐れています。コード品質が低下すると保守コストや技術的負債が増大し、開発者の生産性、製品の信頼性、そして最終的には企業から提供されるソフトウェアへのユーザーの信頼まで損なわれます。

2026/02/08 3:08

了解しました!ファストモードに切り替えましたので、回答はさらに迅速になります。

## Japanese Translation: **Summary** ファストモードは Claude Code ユーザーが Opus 4.6 で速度とコストをトレードオフできるようにします。速度は速いですが料金は高く、CLI または VS Code エクステンションの `/fast` コマンドでオン/オフできます(アクティブ時には「↯」アイコンが表示されます)。 同じ Opus 4.6 モデルを使用しますが、遅延優先の API 設定に変更しています。価格は **$30/150 MTok** から開始し、2 月 16 日午後 11:59 PT まで全プランで 50 % 割引されます。会話中にファストモードへ切り替えると、会話コンテキスト全体の未キャッシュ入力価格が課金されるため、開始時から有効にする方が安価です。 ファストモードは **1 M‑token 拡張コンテキストウィンドウ** をサポートし、以前に別モデルを選択していた場合は自動的に Opus 4.6 に切り替わります。この設定は `/fast` でオフにしない限りセッション間で保持されます。 すべてのサブスクリプション階層(Pro、Max、Team、Enterprise)および Claude Console で利用可能ですが、標準レートリミットには含まれず、Amazon Bedrock、Google Vertex AI、Microsoft Azure Foundry などの第三者クラウドプロバイダーでは使用できません。 ファストモードがレートリミットに達したり追加使用クレジットを使い果たすと、システムは標準 Opus 4.6 にフォールバックします。「↯」アイコン(灰色)が表示され、再び自動で有効になるまで冷却期間が続きます。手動で無効にしたい場合は `/fast` を使用してください。 ファストモードは研究プレビューですので、利用可能性、価格設定、および基盤となる API 設定はユーザーからのフィードバックに応じて変更される可能性があります。 **ユースケース:** ファストモードは遅延が重要な対話型作業(高速コード反復、ライブデバッグ、締め切りが厳しいプロジェクト)に最適です。標準モードは長時間の自律タスク、バッチ処理、またはコスト重視のワークロード向きです。