Help us understand the problem. What is going on with this article?

テクノとしてのC言語、あるいはC99的書き方のすすめ

More than 3 years have passed since last update.

以下、読書感想文としてのポエムである。

21st Century C1(以下 21CC と略)という、いささか変わった本がある。C言語のプログラマの多くが1980年代の知識に固まってしまっているのを打破しようと書かれた本なのだろうと、ざっと自分が1st editionを読んだ感じ2では思っている。C89 aka ANSI Cがいまだに標準だと思っている人3には、おすすめかもしれない。

「Cはパンクロックだ」

21CCでは C is Punk Rock 4 という表現が書籍の最初と最後に出てくる。このパンクロックが何であるかについての議論はしない5。ただ、パンクロックの例えが「シンプルかつ荒削りだけど力強い」言語に対するものであるというのは、個人的なパンクロックへの印象、そしてC言語の特徴をふまえれば良くわかる。

私も気がつけば30年ぐらいC言語で仕事をしていたりする。そして現在の2015年12月に至るまで、まともにC++(やObjective-Cなどの派生言語)のコードを書いたことがない。こんなことを誇るつもりは全然ないが、必要がないままそれだけの年月が過ぎてしまった。もちろん<<演算子が何を意味するかぐらいは知っているし、C++のコードをちょこっと直すぐらいのことはしたけれど、大半のことはCで済んでしまうからだ。FreeBSDのカーネルを直すにはC言語を知っていればいい。Erlangの仮想マシンBEAMはC++ではなくC言語で書かれている。

そういう意味ではCはギターのスリーコードだけで音楽が成立するパンクロックの世界なのかもしれないとは思う。

「Cはテクノだ」

ただ、C言語そのものも、C89当時とは別世界になっていることぐらいは、さすがに2015年の現在になると意識せざるを得ない。いつまでもunsigned intのビット長に悩むくらいなら、あっさりuint32_tを使ってしまったほうがいいだろうし。このuint32_t#include <inttypes.h>同様、C99で追加された規格の一部だそうだ。

intをポインタが同じビット長であることを仮定するのもまあパンクな伝統に浸るなら悪くないのかもしれないが6、私はテクノ7が大好きなので、パンクよりはもうちょっと頭を使いたい(パンクの人達ごめんなさい)。というわけで、最近は少なくともC99までは使うようにしている。C11はまだ理解できていない。

C99的書き方

21CC 1st edition のChapter 7には C Syntax You Can Ignore 8という、まあ物騒なタイトルの章がある。でもここで書かれていることは結構面白いのでまとめておく。

  • main()でなにかreturnする必要はもうない。何も書いてなくても0を返すものとみなすそうだ。
  • 変数の宣言を関数定義の最初にまとめる必要はない。最初に使う時に書けばいい。これはたとえばfor (int i = 0; i < 10; i++){double f = i/10.0; ...}みたいな書き方をしたほうが、よりわかりやすいという話である9
  • 配列の大きさは動的に定義できる。これはint count = atoi(argv[1]); char parameters[count];みたいに、実行時に配列の大きさを決められるということだ。うまく使えばmalloc()free()の繰り返しを無理にせずにすむかもしれない。
  • malloc()などの返り値はvoidのポインタなので、あるデータ型の領域を取るときに無理にcastする必要はない。たとえば、uint32_t *uintlist = malloc(LENGTH * sizeof(uint32_t))と書いても、uintlistには自動的にcastしてくれる。
  • 無理にenumを使うな。enum型はグローバルスコープなのが問題だと21CCでは主張している。まあ私もあまり使ったことはない。
  • goto文は関数内ブロックから脱出する際のエラー処理には有用。
  • switch文はやめてif...else if...で書くべし10
  • floatを使うのはやめよう。イマドキ32bitしか浮動小数点型の数を許していないCPUは珍しいことを考えれば、double(64bit)にしたほうがいいだろうというのは想像はつく。あえてfloatにして得られるものは少ない。

パンクとテクノの違い

以下個人の好みでしか書いていない本当の寝言ポエムなので、こういうのが嫌いな人は読み流してくれたらいい。

テクノ、ハウス、ヒップホップ、ラップ、どれも音楽のコアな部分の楽しさを高めるために、極力余計なものを削ぎ落とす方向へ向かっているという意味では共通していると思う。ただ初期のパンクと違うのは、適度に自動化するなりツールを効果的に使っているところだろう11

21CCの筆者は「伝統を破りCがパンクロックであり続けるために」(breaking tradition and keeping C Punk Rock) 同書を書いたということだが、個人的にはむしろテクノの方法論だろうなあ、と感じている。

まとめ

もう世の中はC++11ですらなくC++14だそうで、かつC言語もC99ではなくC11だそうで、自分にはついていけそうにないのだけど、それでも新しい機能は使ったほうがいいのかな、と思ってこんな寝言ポエムを書いてみた。


  1. オライリージャパンのカタログを見る限り、日本語には訳されていないようだ。 

  2. 今出ているのは2nd editionである。2nd editionのO'Reillyのsamplerを見た限りでは、この記事で指摘する内容については大きくは変わっていないと推測できる。 

  3. 私も他所様のことを語れる資格はないと思うが、自分を含めたぶんK&Rで勉強した人の多くがそうなっていると思う。個人的にはK&Rはもうおすすめしない。大学の教科書でK&Rを使おうとしている先生方はぜひ再考して欲しいと思う。 

  4. 元ネタとしてこういうThe Pragmatic Bookshelfの文章があったらしい。 

  5. そのへんのオッサンをつかまえるといろいろ教えてくれると思う。私自身はコアなパンクをまじめに聞けていないので、語れる話ではない。 

  6. この仮定は成立しないので絶対にやってはいけない。 

  7. テクノ・ポップ、デトロイト・テクノ、どちらも聴いているし、かつては演奏していた。個人的には今の音楽の大半はテクノだと思っている。自分の作品はこのへんにまとめてある。かつてはこんなプロジェクトのマスタリングとかもやっていた。 

  8. 21CC 2nd editionでは Inessential C Syntax that Textbooks Spend a Lot of Time Covering という、もっと穏健なタイトルに変わっている。 

  9. 当然ながら変数定義(とブロック)のスコープは考慮する必要がある。 

  10. これはネスティングとラベルやbreak文に頼る構文が読みにくいということだと私が21CCを読んだ限りでは理解している。 

  11. DEVOやP-MODEL、The PLASTICSはパンクなのかテクノなのかとかいう議論はあるだろうし、そもそも1980年代前半のテクノ・ポップの文脈から見ると、両者はクロスオーバーしていたというか、同じ精神性を持っていたと個人的には思っている。 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away