世界を動かす技術を、日本語で。

C3プログラミング言語

2026年1月4日原文(c3-lang.org)

概要

C3はC言語の進化形であり、 Cプログラマ に馴染みやすい設計。 C ABI互換性 があり、既存のC/C++プロジェクトにシームレス統合が可能。 モジュールシステム演算子オーバーロード など、現代的な機能を搭載。 コンパイル時マクロ契約プログラミング による堅牢なコード実現。 エラー処理デバッグ支援 も充実し、安全性と利便性を両立。

C3 Programming Languageの特徴

  • C言語の構文と意味論 をベースにした進化系プログラミング言語
  • C ABI完全互換性 を持ち、C/C++と混在した開発が可能
    • 特別な「C互換型」や関数指定が不要
    • C3の全機能をCから利用可能
  • シンプルなモジュールシステム
    • わかりやすい構成
    • デフォルト設定が直感的
  • 演算子オーバーロード の導入
    • C++の複雑さを排除
    • ベクトルや行列、固定小数点演算に最適
  • コンパイル時マクロとセマンティックマクロ
    • 関数のような記述で明快なマクロ定義
    • Cのプリプロセッサを大きく超える表現力
  • 段階的契約(Gradual Contracts)
    • 実行時・コンパイル時の制約を簡潔に表現
    • プログラミング・バイ・コントラクトの普及
  • ゼロオーバーヘッドなエラー処理
    • Result型エラーと例外処理の良い所取り
    • Cとのシームレスな統合
  • ジェネリックモジュール
    • シンプルかつ明快なジェネリック型の作成
  • ランタイム・コンパイル時リフレクション
    • 型情報への柔軟なアクセス
    • マクロや関数の拡張性向上
  • インラインアセンブリ
    • 通常のコードと同じ感覚でasm記述
    • 文字列や制約表現の煩雑さを排除
  • デバッグ時の安全性チェック
    • 境界チェックや値チェックを自動挿入
    • 契約機能と連携しバグ早期発見を支援
  • 詳細なスタックトレース
    • デバッグビルド時に標準ライブラリが詳細な情報を提供
    • 「セグメンテーションフォルト」だけで終わらないエラー解析

C3の実用例と互換性

  • vkQuakeプロジェクト での実証
    • コードの一部をC3に書き換え、c3cコンパイラでビルド
    • フォーク版が公開されており、既存Cプロジェクトへの適用事例を提示

C3が目指すもの

  • Cプログラマ向けの進化的言語
    • 革命的ではなく、Cの親しみやすさを維持した進化
    • 新機能と安全性を両立し、現代的な開発体験を提供

Hackerたちの意見

TsodingがC3を使ってたくさんのライブ配信をやってたよ。興味がある人は30時間以上の内容があるからチェックしてみてね。 https://youtube.com/playlist?list=PLpM-Dvs8t0VYwdrsI_O-7wpo-...

どのタイミングで言語を作る価値があるんだろう?個人的にはCでジェネリクスやスライス、エラープロパゲーションを実装したことがあるけど、結構大変だけどやれることだよね。もちろん、Cの標準ライブラリはゴミ箱行きだけど、あんまり価値もないし。コードも少ないし、かなり古くなってるしね。一方で、コンパイラはめっちゃ複雑な話だよ。自分はコンパイラを書くなんて絶対にやりたくないな。分散システムで遊んでた方が楽しかったから。イディオマティックなCは進むべき道じゃなかったから、Cの方言とGoを選んだんだ。こういうことをどうやって見積もるんだろう?それとも楽しもう、yolo?

一方で、コンパイラはものすごく複雑な話だよね。大きなプロジェクトを作るのがどれだけ大変かを軽視するつもりはないけど、LLVMにすごく合った「より良いC」言語のクラスがあるのは明らかだと思う。純粋に楽しむ目的で、LLVMを使えば午後のうちに小さなものを立ち上げることができるよ。本当に楽しいし、敷居も低いんだ。

実は、これが始まったのはクリストファー(C3の作者)がC2に貢献して、開発スピードに満足できず、自分のやりたいことを試してもっと早く進めたかったからなんだって。どうやらLLVMと一緒に、新しいコンパイラを書くのが可能だったみたいで、C2の後継となるものを作ることができたらしいよ。

いつ言語を作る価値があるのか気になるな。 どんな時でも。新しい言語がもたらす改善以上のものは存在しない。パラダイムシフトを定着させる唯一の方法だし、「規律」を「普通の仕事」に変える唯一の方法でもある。例えば、「みんなが物を変えるのが難しいって知ってる」っていうのがある。

  • オプション1: 規律
  • オプション2: 「let」と「var」(またはそれに相当するもの)を持って、誰かが「このvarは変わるのか?」って考えなきゃいけない場面を何百万回も取り除く。 「手動でメモリを管理するのは難しい」
  • オプション1: 規律
  • オプション2: 自動メモリ管理のある全てのコードベースのトリリオンのオブジェクトに対して、ほぼ100%心配しなくて済む。
  • オプション3: そして、今はもっと安全にスレッド間でこれを確実に行える。 言語で実際に進展を得るのは難しい。改善が必要な競合するものがフラクタルのように存在していて、大部分のユーザーは進歩に反対で、Cのようなものを数十年も苦しむ方が、Pascalのようなものでの徐々に進展する方が好まれるから。言語は構文(重要)と標準ライブラリ(重要)、フレームワークの終わり方(重要)、コンパイル時と実行時の結果(重要)、ツール(重要)を調整する必要がある。これらのどれかを欠けてしまうと、失敗することになる。でも、OSやファイルシステム、DB以外に、将来的にポジティブな影響を及ぼすプロジェクトは他にない。

自分はC3を試したことはないけど、クリストファー・レルノやジンジャービル、いくつかのZigのメンテナーとたくさんやり取りしたことがあるんだ。C3、オーディン、Zigが互いに競争してるんじゃなくて、お互いから学び合って、言語設計の際にどんなトレードオフをしたかを話し合ってるって知れてすごく良かったよ。彼らから、どうやってなぜ異なるビルド方法を実装したのか、特定の機能を実装するかしないかの理由を学ぶのは本当に楽しい経験だった。

互いに競争してるんじゃなくて、お互いから学び合ってる それってどう違うの?丁寧な言葉でコミュニケーションしてるってこと?

C3をしばらく追いかけてるけど、デザイン哲学の discipline にすごく感心してる。新しいメモリモデルを強制することもないし、C++になろうともしない。自分にとってのキラーフィーチャーは完全なABI互換性だね。バインディングを書く必要がなくなって、C3のファイルを既存のCビルドシステムに混ぜられるのは、摩擦をほぼゼロにしてくれる。進化を重視するビジョンを守ってくれてるメンテナーに感謝!脳をリセットする必要がなくて、C99よりもモダンに感じる週末の言語を探してるなら、ぜひ試してみてほしい。チームの素晴らしい仕事だよ。

C3でライブラリを書いて、シンボルをエクスポートしてバインディングに使うことってできるのかな?キャリアの残りをフルCで過ごすのを妨げているのは、C文字列や、プロセスが終わった後にクリーンアップされない生メモリへのダングリングポインタなんだよね。

もっとシンプルなものを期待してたけど、新しくて便利な機能がたくさんあってびっくりしたよ。あんまり深いことじゃないかもしれないけど、C3の例外に相当するものが「Excuses」って呼ばれてるのを見て、思わず笑っちゃった。

GitHubプロジェクトにはもっと詳しい情報があるよ: https://github.com/c3lang/c3c C3がCと違う点: - ヘッダーファイルが必須じゃない - 新しいセマンティックマクロシステム - モジュールベースの名前空間 - スライス - 演算子のオーバーロード - コンパイル時のリフレクション - コンパイル時実行の強化 - ジェネリクス(ジェネリックモジュールを通じて) - "Result"ベースのゼロオーバーヘッドエラーハンドリング - Defer - 値メソッド - 関連付けられた列挙データ - プリプロセッサなし - 未定義動作が少なく、「安全」モードでランタイムチェックが追加 - 限定的な演算子オーバーロード(ユーザーランドの動的配列を有効にするため) - オプションの前提条件と後提条件

ドキュメントをざっと見て、2つの重要な質問の答えを見つけたから、他の人の時間を節約できるかもしれないのでここに書いとくね: - LLVMを使ってる(つまり、LLVMと同じくらいポータブル) - 残念ながら、タグ付き列挙はサポートしてない それ以外にも、イントロスペクションやマクロなど、非常に望ましい機能がいくつか追加されてるよ。

Hacker Newsで議論の続きを見る