エラーを出すということ

拍手どうもありがとう〜。


今日は、ゲームとはあまり関係ないプログラミングの話。
プログラミング言語C(以下C)を使い始めて、数年になる。
ので、あえて語ってみる。


Cでは、コンパイルが通るが、使用方法を間違えると簡単に不正な処理のエラーが出てしまう。
これが、良くも悪しくもCの「難解」と言われる所以かもしれない。
Cにおいて重要なのは、このエラーに応じるスキルアップしかない。
なぜ、不正な処理が出るのかというと、大抵の要因は不正なメモリ領域の参照、つまりポインタの扱い如何である。
他のプログラミング言語の使い手にとっては、C特有のポインタとの戦いは、滑稽に見えるかもしれない。
「なぜ、彼等は見えない敵と戦っているのだろうか」と。
だが、私に言わせれば、C以外の言語に存在する、さまざまな仕様──関数を覚え、
使いこなすために、関数を覚え続けなければならないということに甚だいぶかしく感じてしまう。
「ここで、こういう処理をするためには、この関数を使う必要がある」というのを
辞書を引いて探すという言語、それは、プログラミングではなくて、
バラバラになったピースを集めて、ひとつの形にしているだけのものだと思われる。
用意された部品を集めて、誰もが同じように作ることのできるプラモデルようなもの──
つまり、方法さえわかれば、誰でも作ることが出来るというのは、なんだか味気ない気のする。
「エラーが出なくて、誰でも同じものが作れればそれで良い」とは、ごもっともだ。
わざわざCを選ばずに、簡易な手続きで、さまざまなことができる言語を選べばよいと思う。
そこは、価値観の違いだ。
ただ、私は、最初に触れたプログラミングがCであったことが、素直に嬉しい。
その理由は、単純に言えば、Cのプログラミングとしての純粋さだ。
Cでは、最低限のものしか用意されていない。
つまり、Cを理解するのは、その最低限のものだけを理解すれば事足りるのである。
で、その最低限のものの中に、ポインタというものが含まれている、ただそれだけである。


私は、タイピングすらままならぬ中で、Cの習得を始めた。
その頃は、ブラインドタッチも出来なかったので、午前中はブラインドタッチの練習、
午後は、渡されたCの本を最初から読んでいくというものだった。
プログラミング言語C 第2版 ANSI規格準拠」
渡されたこの本を一か月かけて、読み終えたときは、
正直に白状してしまえば、ポインタを理解していなかったのだろう。
つまりは、エラーをしょっちゅう出していたのだ。
今にして思えば、エラーを出すというのが重要だった。
前述のとおり、Cにおけるエラーといえば、不正な処理である。
しっかりと理解していないポインタを避けるために文字列をとって、
いろいろと関数を駆使してやっているソース。
そこでも容易に不正な処理が出てしまう。
で、あれこれと悩んで、ようやく文字列も単なるメモリー領域の確保に過ぎないと理解する。
行き着く先は、やはり、ポインタなのである。
さて、この、悪しき元凶と思しきポインタ。
「あそこやここで、エラーを吐きまくってなんというとんでもない代物だ」と思ってしまう時機を経て、
その思いがぽつりと折れてしまうと、
なんてことはない、エラーをはいてくれるだけありがたいではないか、
と、ある意味達観出来てしまうのである。
エラーが出て、人は、悩むものだ。
エラーを繰り返すことによって、無能の私も、
エラーを回避しなければならないという教訓を体に叩き込むことに成功する。
「ナアニ、エラーを出しているのは、ポインタではない、プログラミングをしている自分自身だ」ということを。
ここで、ようやく、ポインタと対峙できるわけだ。
「ポインタは、せいぜい4バイトしかない。そんなのに、ビビってしまってどうするんだ」
と決心して、エラーを出さないための所作法を学ぶ決心をする。
ポインタは、参照の際と、巡回の際にエラーを吐くのがほとんどだ。
だから、
*参照させる先が正しいか
*巡回させるために、節目がしっかりしているのか
という心がけが重要なのだと、学んだ。
これは、実に当たり前のことだが、しかし重要なことである。


エラーを出すことで、エラーを出さない重要性を学ぶというのは、
ナントモカントモおかしなことではあるのかもしれないが、
自身の製作過程でエラーを出す分には大いに良いことではないか。
「自身のソースが全面的に悪い」と思えば、ことごとくコメントアウトでつぶして、エラーを特定する。
で、特定出来たら、「ははん、こういった理由だったんだ」と学習する。
これによって、エラーに対する予防線になるとともに、
Cから作られたあらゆる言語に対する関数仕様への理解も深まる。
たとえば、何らかの手続きをする際に取得するハンドルというのは、
「ははん、メモリ確保のポインタ処理を隠匿するために、あえて、こういった関数の仕様にしているんだな」と気づき、
「必ず、ハンドルの閉じ忘れに気を付けよう」という身構えができるようになる……たぶん。
たとえば、バッファを確保する際に、
「あれ、ここで、こんなにメモリを確保してしまうと、動作に影響が出てしまうんじゃないかな」とか考えるようになる……たぶん。
このように、エラーを出すことというのは、案外重要で、
閾値を越えたときにちゃんとエラーを出さないような処理に導く方法などを身につけて、
プログラミングをするコツを習得していけば、
最短距離で回答を導くプログラミングを自然と思い浮かべることのできるのである。


でも、一番怖いのは、エラーの出ないバグだよね!(キリッ←これが言いたいだけ


終わり。