19 ポイント 投稿者 GN⁺ 2026-01-04 | 4件のコメント | WhatsAppで共有
  • C言語の文法と意味を継承しつつ、安全性と使いやすさを強化した進化型言語で、既存のC開発者にとってなじみのある環境を維持
  • 完全なC ABI互換性を提供し、C/C++プロジェクトにそのまま統合可能。vkQuakeの一部コードがC3に変換され、c3cコンパイラでビルドされた事例あり
  • モジュールシステム演算子オーバーロードコンパイル時マクロなどにより、コード構造と表現力を向上
  • 契約ベースプログラミング(Gradual Contracts)ゼロオーバーヘッドのエラー処理ランタイムおよびコンパイル時リフレクションなどの現代的機能を含む
  • デバッグモードでは安全性チェックと詳細なスタックトレースを自動提供し、バグ検出と安定性確保に有利

C3 概要

  • C3は、C言語の**文法(syntax)意味(semantics)**を基盤として発展したプログラミング言語
    • 目標は、既存のCプログラマになじみのある形を保ちながら、言語を進化させること
  • 正確で目的指向の演算子オーバーロードをサポート
    • C++の複雑なオーバーロード構造なしに、ベクトル、行列、固定小数点演算を自然に表現可能
  • 契約ベースプログラミングをサポートし、ランタイムおよびコンパイル時の制約を明示可能
    • コードの安定性と仕様の一貫性を強化
  • Resultベースのエラー処理と**例外(exception)**の長所を組み合わせる
    • Cコードと自然に統合されるエラー管理構造を提供
  • **型情報参照(type introspection)**をコンパイル時とランタイムの両方でサポート
  • インラインアセンブリ:文字列や複雑な制約なしに、通常のコードのようにアセンブリを記述可能
  • デバッグモードでランタイムの**境界チェック(bound checks)値チェック(value checks)**を自動挿入
  • C3標準ライブラリはデバッグビルドで詳細なスタックトレースを標準提供
    • 単なる「segmentation fault」ではなく、具体的なエラー位置を確認可能

Ergonomics and Safety

  • Optionalsによりエラーとnull処理の安全性を提供
  • defer構文でリソース解放の自動化をサポート
  • slicesとforeachで安全な反復処理が可能
  • コメントベースのcontractsでコードの制約条件を明示可能
  • @poolコンテキストでメモリの自動解放をサポート

Performance by default

  • SIMDベクトルを直接記述し、ハードウェアレベルの制御が可能
  • さまざまなメモリアロケータの選択により性能の微調整をサポート
  • エラー処理でオーバーヘッドのない設計を採用
  • 高速なコンパイル時間とLLVMバックエンド最適化を活用
  • 使いやすいインラインアセンブリを提供

Batteries included standard library

  • 動的コンテナや文字列を含む標準データ構造を提供
  • クロスプラットフォーム抽象化によりプラットフォーム間の移植性を確保
  • 必要に応じてネイティブプラットフォームへのアクセスを許可

Leverage existing C or C++ libraries

  • C3はC ABIと完全互換であり、別途「C互換型」や関数宣言は不要
  • C3からCコードをリンク可能で、CからもC3コードをリンク可能

Modules are simple

  • シンプルで直感的なモジュールシステム
    • デフォルト設定が合理的に構成されており、開発フローを妨げない
  • モジュールによる名前空間管理を提供
  • 明示的な制御でカプセル化構造を簡素化
  • インターフェースで共有動作の定義が可能
  • ジェネリック型の生成をシンプルかつ明確に実装できるgeneric modules機能を提供
  • 構造体サブタイピングによる構造の再利用をサポート

Macros without a PhD

  • コンパイル時マクロを通常の関数に近い形で記述可能
  • コードの型情報を理解する型認識マクロをサポート
  • Cのプリプロセッサよりも明確で強力なコード生成をサポート

4件のコメント

 
kayws426 2026-01-06

いろいろ出てきていますね。LONG LIVE C-LANG !!!
でも後でc4が出てきたら、まさに爆発的な人気になるのでしょうか…

 
bus710 2026-01-05

Zig は毎年 breaking changes が入るので、言語自体は気に入っているのですが、もう手が伸びなくなってきました。
一方で C3 の紹介を見ると、全体的に C + Go のような感じで読み書きしやすく、バージョンアップによるストレスもずっと少なそうな印象ですね。

 
mhcoma 2026-01-05

少しは支援もしつつ……最近使っているんですが、面白いです。
Cをやっていて不便だった点だけを改善しようとしている感じで、そこがいいですね。
公式ドキュメントはまだあまり成熟しておらず、
(あれこれ機能を調べようとすると、思いがけない場所に書かれていることが多いです……)

 
GN⁺ 2026-01-04
Hacker News の意見
  • C3の設計思想の抑制された方向性が気に入っている
    新しいメモリモデルを強要せず、C++のようになろうともしていない
    特に完全なABI互換性のおかげで、既存のCビルドシステムにそのままC3ファイルを混ぜて使え、バインディングを書く必要がなくなる
    革命より進化を目指すメンテナーのビジョンに拍手を送りたい
    週末に学んでみる言語として勧められる。C99よりモダンだが、なじみのある感じだ
    • C3でライブラリを書いてシンボルをエクスポートし、バインディングで使えるのか気になる
      自分がCを完全に捨てきれない理由はcstringと解放されないポインタにある
    • 完全なABI互換性が本当に重要なのか疑問だ
      C自体が危険な言語というより、実装とABIが危険なのだ
      fat pointer、varargsの改善、UBSan、MTEなどを適用すればかなり良くなる
  • C3公式ドキュメントのContractsセクションを読んでいて疑問が湧いた
    コンパイラが契約を必ず検査しなくてもよく、違反時に未定義動作になりうるなら、これをどう信頼して使えばいいのかわからない
    すばらしい機能だが、やや危険に見える
    • 契約は「常に真であるべき条件」を表す**不変条件(invariant)**だ
      これを無視したり、ランタイムで検査したり、あるいは常に真だと仮定して最適化に利用したりできる
      たとえばポインタの妥当性は検査し、奇数入力条件は仮定として置く、といった選択が可能だ
    • 契約は意図を標準化された方法で表現できるようにする手段だ
      大規模チームでは強制できるし、Visual Studioのようなツールは警告だけを出して段階的に学べるようにする
    • ドキュメントの3つの文はそれぞれ
      1. コンパイラが契約を必ず使う必要はない
      2. 違反時に未定義動作になる可能性がある
      3. セーフモードではランタイムassertとして検査する
        つまり、開発中は有効にし、配布時には無効にして性能への影響をなくせる
    • 結局のところ、コンパイラがすでに行っている仮定ベースの最適化をコード内で明示的に表現するものだ
    • 契約は「ほとんど到達しない条件」を表す緩やかな制約として理解している
      必ず検査すべき条件は関数内で直接コードとして処理すべきだ
  • C3 GitHubリポジトリに詳しい内容がある
    Cとの違いとしては、ヘッダーファイルなし、モジュールベースの名前空間、スライス、演算子オーバーロード、ジェネリックモジュール、Resultベースのエラー処理、セーフモードでのランタイム検査などがある
    • 機能は良いが、ややバランスの悪い構成にも感じる
      個人的には関数オーバーロード、デフォルト引数、タプル返却が欲しい
  • C3でResultExpectedOptionalと呼ぶのは紛らわしい
    「T または空」ではなく「T または E」を意味すべきなのに、名前が間違っているように思える
    関連ドキュメントへのリンク
    • C3のOptionalはOption<T>Result<T, E>とは異なる
      エラー型が整数コード1つに制限されていて、これは「革命ではなく進化」という思想によく合っている
      type?構文も直感的だ
    • コードの中で「Optional」という単語を直接使うことはない
      Cの意味を保ちながら、out paramの負担を減らす設計だ
    • 概念名を勝手に変えるのはあまり良くないが、どちらか1つしかサポートしないならOptionalのほうがより明確な名前だ
      Resultはすでに一般的な返り値の意味を持つので混乱を招く可能性がある
    • それでも「Option」や「Maybe」は別の意味なので、「Result」や「Either」のほうが適切だと思う
  • TsodingがC3で30時間以上ライブストリーミングした動画がある
    YouTubeプレイリスト
  • 私はC3、Odin、Zigの開発者たちと交流したことがある
    3つの言語が競争するというより、互いのトレードオフを共有しながら学ぶ関係である点が印象的だった
    • 組み込み環境では、どの言語が最も合理的なのか気になる
    • 「競争ではなく学習」とは言うが、結局は表現が丁寧な競争なのではないかとも思う
  • ドキュメントをざっと見て、2つの疑問が解決した
    1. LLVMベースなので移植性が高い
    2. Tagged enumは未サポート
      その代わり、マクロやリフレクションのような機能が追加されている
    • Tagged unionはシステム言語では非効率的だと思う
      最も大きい型ぶんのメモリを占有し、ランタイム型検査へと流れが移るので、静的型付け言語の利点を失ってしまう
      必要なときに自分で実装するほうがよいと思う
  • 言語を新しく作ることにいつ価値があるのか考えてしまう
    Cでジェネリクス、スライス、エラー伝播を自前実装したが、コンパイラ制作は複雑すぎる
    だから私はCの派生とGoを並行して使っている
    • LLVMのおかげで「より良いC」系の言語を作るのは思ったより簡単だ
      1日でプロトタイプを作れるほど、参入障壁は低い
    • 言語を作ることには常に価値がある
      新しいパラダイムを現実のものにする唯一の方法だからだ
      言語は文法、標準ライブラリ、ツーリング、ランタイムまですべてを調整しなければならないので難しいが、そのぶん未来への影響も大きい
    • C3はもともとC2に貢献していたChristofferが開発速度へのもどかしさを感じて独立して始めたプロジェクトだ
      LLVMのおかげで新しいコンパイラを自作できた
    • 言語の価値は他者との共有理解を作ることにある
      1人で使うC派生なら問題ないが、他人と協業したり外部ライブラリを使ったりするには共通言語が必要だ
  • 最初は単純な言語だと思っていたが、意外と豊富な機能一覧に驚いた
    そして例外を「Excuses」と呼ぶ点がかわいくて気が利いている
  • こういうウェブサイトこそ、プログラミング言語サイトの模範だと思う
    • 逆に、デザインが子どもっぽくアマチュアっぽいと感じた
      特にナビゲーションにDiscordリンクがあるのが、その印象を強めている