私はC(はい、C)でゲームを書いています(2016年)。

2026/02/08 2:45

私はC(はい、C)でゲームを書いています(2016年)。

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

要約

Japanese Translation:

要約

著者は、将来性を備えたプラットフォームに不可欠な信頼性・移植性・速度を満たすため、すべての単独プロジェクト用ゲームを「ベーシック」Cで書くと説明しています。彼はシンプルさ、厳格な型付け、強力な警告、静的/動的解析、高速コンパイル、バグの最小化、堅牢なデバッガなどを重視し、これらがすべてCで利用可能です。著者はオブジェクト指向プログラミング(OOP)を嫌い、クラス構造に縛られるよりも、特定の問題に合わせたコードでデータを扱うことを好みます。

彼は一般的なゲーム開発言語を評価しています:

  • C++ – 広く使われているが過度に複雑で微妙なバグが起きやすく、コンパイル速度が遅い。不要な機能が増え、複雑さが高まる。
  • C# / Java – 冗長性とOOP偏重の問題があり、ガベージコレクションにより停止時間が発生する可能性がある。
  • Go – ストップ・ザ・ワールド型ガベージコレクタとゲームライブラリのサポート不足からリアルタイム要件には不向き。
  • JavaScript – すべてが緩く、著者は大規模ソフトウェアプロジェクトでの使用に興味を持っていない。
  • Haxe – ウェブサポートが期待できるが、その若さゆえ長期的な存続性に懸念がある。

また、自分自身の言語を作ることも考えているものの、既存ライブラリの喪失と将来互換性の問題から手間がかかりすぎると判断しています。

結局のところ、彼はプロジェクトでCを使い続けます。他者にCを推奨することは自分の好みが極めて個人的なため不適切だと強調しますが、Cの軽量で効率的な性質は安定性と速度が最重要視されるニッチな単独プロジェクトには役立つと述べています。

本文

なぜ私は(本当に)Cでゲームを作るのか

私はちょっと変わった人間です。私が手掛けたすべてのソロプロジェクトは、ベーシックな C で書かれています――ほとんど誰もやらないことです。以下ではその理由を説明します。


私が言語に求めるもの

  • 信頼性 – 自分が作ったわけではないバグの修正に時間を割く余裕はありません。
  • 長寿命 – フラッシュは消滅しました。私は残り続けるプラットフォームを望みます。
  • 移植性 – 一つの OS に縛られず、できればコンソールにもターゲットできるようにしたいです。言語自体がポータブルで、クロスプラットフォームライブラリも充実している必要があります。

私が欲しい特徴

  • シンプルさ – 独特な API を調べて疲弊します。覚えやすいものを求めています。
  • 強い型付けと警告 – バグを減らし、デバッグや静的解析を容易にしたいです。
  • パフォーマンス – 余分なサイクルは創造性の余地を広げます。
  • 高速コンパイル – コンパイル時間が長いとフローが崩れます(Twitter は 5 分で中断します)。
  • 手続き型志向 – データをデータとして扱う方針で、オブジェクト指向に強制されたくありません。

他の選択肢

言語なぜ不十分か
C++ゲーム業界ではまだ主流ですが、過剰に複雑でバグが発生しやすい。コンパイルも遅い。
C# / Java冗長で強力な OOP を押し付ける。抽象化の裏側に複雑さを隠している。
GoC の再来というイメージはあるが、GC がリアルタイム性能を損ねる。ゲーム向けライブラリも乏しい。
JavaScript柔軟すぎて私には合わない。
HaxeWeb 向けに有望だが、ライブラリは十分でなく長期的な安定性は不確か。
独自言語既存のライブラリを失い、互換性を保つためには手間が大きすぎる。

なぜ C が最適なのか

  • 危険だが信頼できる – 鋭いツールでありながら、慎重に使えば十分に安全です。
  • 高速 – コンパイルオーバーヘッドがなく、どこでも動きます。
  • 移植性 – ほぼすべてのプラットフォームで手間を最小限に抑えて利用できます。
  • 強力なライブラリとツールサポート – 継続的に発展し、成熟しています。

C を選ぶよう勧めるわけではありません。私の好みは特異で個人的です。多くの人よりもベーシック 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 2:39

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

## 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コンパイラを実現すること—が、創造的なトークン化、ハッシュ化、および積極的なコードサイズ最適化によって達成できることを示しています。