ユーニックス総合研究所

  • home
  • archives
  • c-kouhinshitsu

C言語で高品質プログラムを作る方法

  • 作成日: 2022-10-25
  • 更新日: 2023-12-24
  • カテゴリ: C言語

C言語で高品質プログラムを作る

C言語で高品質プログラムを作る。
高品質なプログラムはだれだって作りたい。

しかしCのような古代の言語では高品質なプログラムを作るのも大変である。
なぜならCはガバガバにメモリリークすることがあるし、もちろんこれは開発者のせいだけど、だがGoogleのエンジニアでさえCのメモリリークにはお手上げなのである。

アルゴリズムも大事だ。データ構造も。
そして何より大事なのはテストである。

この不安定な世界の中で唯一確かと言えそうなもの。
少なくとも99%は確かだと言えそうなものはテストの結果である。
残り1%は不運の産物である。

つまりC言語で高品質なプログラムを作りたいなら以下の項目を気を付けないといけない。

  • テスト
  • メモリリーク
  • アルゴリズム
  • データ構造

Cではテストを書かないと死ぬ

Cで開発するならテストを書かないと最悪死ぬことになる。
どう死ぬかと言うと無数のバグという得体のしれない何者かによってその身をずたずたにされてしまう。

Cではテストの重要性がほかの言語と比べても違う。重要性が高い。
これは、Cがバグを作りやすい言語だからである。
だからテストを書かないでリリースなんかすると、十中八九そのプログラムにはバグが内包することになる。

つまりバグを出荷してるのと同じである。

だからCではいかにしてプログラムの機能をテスト可能にするか、というのが重要である。
美しいコードよりもこれは重要性が高い。

多少ブサイクになってもいいので機能をテスト可能なように作る必要がある。
そして機能は徹底的にテストを行う。

テストを重ねた機能はバグが含まれる可能性が下がる。
悲しいのは、0にはできないのだ。バグが含まれる可能性は。

だから我々C言語使いはバグを0に近づける努力をしなければならない。

メモリリークという妖精

この世は不思議に満ち溢れている。
疑問が生まれその疑問が物語を作る。

原子の森には妖精が存在し人々をたぶらかすこともある。

それはCも同じである。
Cにはメモリリークと言う妖精がいる。
この妖精は油断しているとすぐに生まれてクスクスと笑いながらプログラムに居座ることになる。

妖精を追い出さないと大変である。
妖精は気まぐれでプログラムをクラッシュさせたり大事なデータを消したりする。

この妖精とうまく付き合い、そして妖精を極力出さないようにするのが高品質なプログラムの条件になる。

CではValgrindなどのメモリチェックツールがあるのでバグを検出できる。
オプション--leak-check=fullを忘れないようにしたいところである。

しかしメモリリークは肯定的にとらえることもできる。
Cでメモリリークが発生している場合、プログラムのロジックが間違っている可能性が高い。
つまりメモリリークはロジックの間違いを視覚化できることがあるのである。

だからメモリリークを全てつぶすというのはロジックを完全にするということになる。
ガベージコレクションのある言語ではメモリリークを視覚化できないので、これはある意味Cのメリットと言えないこともない。

しかし現実的に言ってメモリリークを全部つぶすのは骨の折れる仕事である。
そうするとやはりメモリ安全なRustなどの言語の人気が出るのである。

アルゴリズム

高品質なプログラムではアルゴリズムが重要だ。
O(1)やO(log n)などの性能のアルゴリズムを実装すればプログラムは速くなる。

Cで開発しているのにプログラムが遅いというのは、アルゴリズムやデータ構造が不適切な場合が多い。
Cから動作速度を取ってしまったらCで開発する意味も無くなってしまう。
Cでノロいプログラムを作るならガベージコレクションのある言語でリッチに開発した方がマシである。

速度は正義でありCの存在意義の1つであると言える。

データ構造

Cではクラスがなく構造体しかない。
そしてその構造体も機能はそれほど多くない。

だからデータ構造については自分で工夫しなければならない。
ハッシュマップを使いたいとしてもCにはデフォルトでそんなものはないのだ。

データ構造が適正かどうかは速度にも影響が出るので適切なデータ構造を使う必要がある。

アルゴリズムとデータ構造がマッチしたときそれは速度と言う結果になって現れる。