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

C言語でゲームを作ります(はい、C言語です)(2016)

概要

  • 筆者がゲーム開発にC言語を選ぶ理由 の説明
  • 信頼性・移植性・シンプルさ を重視する姿勢
  • 他の言語(C++、C#、Java、Go、Haxe等)との比較
  • C言語の危険性と利点 の両面を評価
  • 個人的な選択であり、他人に強制しない 立場

私がゲームをC言語(そう、C)で書く理由

  • 最近の個人プロジェクトゲーム はすべて 「バニラ」C言語 で開発
  • 一般的でない選択、理由の共有

言語に求める絶対条件

  • 信頼性重視、自分で起こしていないバグに時間を割きたくない
  • Flash向けゲーム の経験、Flashの終焉による教訓
  • 長期間存続するプラットフォーム の必要性
  • 特定OSへの依存回避、コンソール開発の選択肢確保
  • 移植性と移植性の高いライブラリサポート の重要性

言語に望むこと

  • シンプルさ重視、複雑な言語機能やAPIに疲弊
  • 覚えやすい言語、何度も調べる手間の削減
  • 厳格な型付け、強力な警告、静的解析 によるバグ削減
  • 優れたデバッガや動的解析 でバグ発見容易化
  • 高精細リアリズムは不要 だが、パフォーマンスは少し気にする
  • コンパイラの速度重視、10秒以上待つと集中力が切れる
  • OOP(オブジェクト指向)への懐疑、データとコードの柔軟な分離志向

他の選択肢との比較

  • C++

    • ゲーム開発で主流、契約仕事でも多用
    • 複雑さ・バグの発生しやすさ・コンパイルの遅さ が大きな不満
    • 不要な機能が多く、シンプルさに欠ける
  • C#・Java

    • 冗長・複雑、OOPに強く誘導
    • 隠蔽された複雑性 が時に問題化
  • Go

    • Cの現代版 という印象で好感
    • GC(ガーベジコレクション)による停止 がゲーム開発に致命的
    • ゲーム向けライブラリ不足、Cラッパー作成の手間
    • ニッチさ による将来性への懸念
  • Web(JavaScript、Haxe等)

    • Web環境の変化の速さ、Flash終了の恐怖
    • JavaScriptの緩さ に不信感、大規模開発への不向き
    • Haxe は将来性に不安も、Web開発時に有力候補
  • 自作言語

    • 独自言語開発への憧れ はあるが、ライブラリ資産の喪失や互換性維持の負担
    • 本業はゲーム制作、言語開発に本腰を入れる気はなし

C言語が今も最適な理由

  • 危険だが信頼できる、鋭い包丁のような存在
  • 高速な実行とコンパイル、開発効率の高さ
  • ほぼ全ての環境で動作可能、移植の容易さ
  • 強力なライブラリとツールサポート の継続
  • 特別推奨はしない、個人的な快適さと経験による選択
  • 他人の選択を否定しない姿勢、自分のスタイルへの納得

まとめ

  • C言語の選択は極めて個人的なもの
  • シンプルさ・信頼性・移植性・高速性 を重視
  • 他言語の複雑さや制約に対する違和感
  • 「Cを使うべき」とは言わないが、自分には最適

Hackerたちの意見

自分の根本的な部分は変わらないよ。Cは俺の言語で、何十年も役に立ってきた。大きな問題はないけど、2つのうちのどちらか(または両方)に達すると痛みが出てくる。Cのコードベースでグループで作業すると、他の言語とは違っていろんなレベルで苦労することが多いんだ(そう、C++も含めてね)。もう一つは、現代の代替手段と比べて何をするにも時間がかかること。特にゲームを開発している場合は、これが問題になるかもしれない。とはいえ、シンプルさの魅力には引かれるから、反論はできないな。

なんでCのコードベースでグループ作業すると他の言語とは違って痛みが出ると思う?グループで作業すること自体はいつも苦労を伴うけど、Cの場合はC++よりもその苦痛はずっと軽いと感じたよ。

とはいえ、反論はできないな。さっきも言ったけど、俺も「少ない言葉で多くを語る」ことに引かれているから。

Cのコードベースでグループ作業すると、他の言語とは違っていろんなレベルで苦労する。Linuxは2025年に2,134人の開発者を惹きつけたから、その主張はちょっと弱まるね。

投稿の著者には完全に共感する。言語を深く楽しむための主な要件はシンプルさだから、CやGolang、Odin、Zigみたいな言語が大好きなんだ。ただ、時には必要な複雑さを受け入れつつも、エレガントに問題を解決する言語が必要だと認めている。特にコードの正確性、特にメモリや並行性の安全性を優先する必要があるときは、OOPではなく主に関数型のパターンを使うけど、Haskellほど極端にはならない。そんな時は、俺の好きな複雑な言語であるRustを選ぶ。ネットワークコードを扱うことが多くて、すごく並行性が高く、できるだけ正確で、良いパフォーマンスが求められるから、Rustはここでは自然に感じる。一方で、シンプルなインディーゲームを作るのが好きで、その場合は命令型でOOPでないスタイルのシンプルでパフォーマンスの良い言語が好きだ。俺の意見では、C、特に最近のOdinはかなり良い選択だと思う。もしジョナサンがこのコメントを読んでいるなら、彼がGolangを挙げたことを考えると、CとGolangのいいとこ取りのOdinを勧めたいな。Golangのシンプルさを持ちながら、ガベージコレクタがなくて、Raylibを使ってゲームを作るのもかなり簡単だよ。

言語の名前はGoで、golangはウェブサイトのドメインだよ。

フラッシュの死 >ゲーム用のライブラリサポートはかなり貧弱で、Cライブラリをラップするのはそれほど難しくないけど、そうすると余計な作業が増える。これがいつ書かれたのかは分からないけど、2015年頃だと思う。つまり、約10年前だね。彼の意見は今どうなっているんだろう。

インターネットアーカイブのWayback Machineでのページの最初のキャプチャは2016年1月9日だよ。だから、少なくともそれくらい古い。あと、その時の彼のウェブサイトのメインページのスナップショットもあるよ。ゲームのスクリーンショットが載ってて、ブログ投稿が書かれた時にどんなゲームを作って公開していたのかのコンテキストを提供してる。https://web.archive.org/web/20160110012902/http://jonathanwh... これも3Dっぽくて、かなりユニークなスタイルだね:https://web.archive.org/web/20160112060328/http://jonathanwh...

「誰もこれをやらない」 まあ、これは少し言い換えた方がいいね。Cを使うのは普通じゃないけど、かつてはそうだったし、今でも多くの人がゲームを書くためにCを使っている。俺もその一人だよ。

人々が「誰も…」や「みんな…」って言うとき、彼らはしばしば、たぶんほとんどの場合、100.000000%の人を文字通り意味してるわけじゃないんだよね。君は例外だよ。彼が「誰もこれをやらない」と言うのは正しい。

文字通り何千ものゲームがCで書かれていて、すべてのグラフィックスAPI(OpenGL、Vulkan、DX)はCのAPIだから、全然変じゃないよ。主要なゲームエンジンもC/C++で書かれているし。

DirectXはC++(技術的にはCOMインターフェースのセット)で、ほとんどのゲームエンジンもC++だよ。LinuxプログラミングみたいにCが標準の環境とは違って、ほぼすべてのゲームは長い間C++で書かれてきたから、もう30年くらいになるんじゃないかな。

Hacker Newsで議論の続きを見る