2012/06/13

C言語 2ヶ月学習してみて

C言語かじりはじめてから約2ヶ月経った

ANSI C89 の範囲内で、エディタは Meadow。コンパイラーは MinGW GCC を使用。OSはWindows XP。プラットフォーム非依存の、なるべくピュアなC言語のところだけを学習中。注意している点は学習間隔をあけないこと。今のところ比較的成功している。Java学習のときは半年ぐらい間隔があいたりしていたので。でも学習内容をプログラムにまとめてBlogにアップしたりしているので、思ったよりも学習スピードはのろい。それでも現状でwavファイルを加工するプログラムぐらいは作れるようになった。現時点で思うことを書いてみる。

C言語はメモリを意識しないと組めない

これは良い勉強になったと思う。Javaでは、あまり意識しなくても動いてしまうので手軽なのだが、Cではちゃんとイメージして組まないと、とんでもないことになる。抽象的なJavaに対して現実的なCというところ。Cではメモリのアドレスとポインタの動きを正確に把握することが、すごく重要だと思えた。メモリを意識し始めると、プログラムに応じて、メモリをたっぷり使って高速に処理させたり、スピードを犠牲にしても省メモリで組むなど、自在にコントロールが出来るようになる。今後Javaで組む場合にもCのメモリ管理スキルはプラスになるはず。Javaの隠れたポインタを意識しまくることになるだろう。

C言語は環境に依存する

コンパイラによっても違いが出るし、プラットフォームでも違いが出る。教科書的に学習しても、それが使えるとは限らない。型なども環境でサイズが違ったりするので、Javaの固定的な仕様からすると、何ともつかみ所のない言語。まぁそこにローレベルなプログラミングを実感できるのだが。

とっつきにくさ

推奨でない関数等が平気で存在している。廃止することもできないらしく、いつまでも存在し続けている。入門では scanf なんて必ず出るのに実際には使わないという。Cにはそういう部分が結構あって戸惑うところ。使わないなら学習する必要もないけど、読むという意味では理解しておく必要があったりする。また同じようなことを実現する場合、いくつかの手段があるのが普通で、その違いが十分理解できてない。たぶんハードウェアレベルの勉強もしないと、ちゃんとした理解につながらないような気がする。

1行が短かくて済む

Javaは決まった書式でちゃんと書かないとエラーが出て怒られてしまう。結構くどくど書く必要があるので、1行がダラダラと長くなる。プロンプトに表示するだけでも
System.out.plintf("hello\n");
と書く必要がある。全部打つのも面倒なのでEclipseを使って効率化を図ることになる。対してCは短い。1行がすごく短い。Javaの長いメソッドに対して
pfintf("hello\n");
だけ。打つのも苦ではないので、現状では、すべて手で打っている。これってとても手軽。Blogにソースを載せるときも、460ピクセルの範囲に問題なく入ってしまう。これに慣れてしまうとJavaは面倒に感じてきた。

GUIはこれだけじゃ作れない

承知ではあったが、GUI抜きでは使い勝手のよいプログラムは作りにくいと改めて痛感。だからと言ってwxWidgetsなどのGUI作成ツールを使うとなると、C++の学習も必要だし、それ以上にGUI関係の学習負荷が高い。そこまでやる気もなかったりするので、Javaでいいか・・・と思ってしまう。とりあえずCUIでいくつか作ってみるつもり。音処理のひたすら計算するプログラムではC言語の処理スピードは捨てがたい。さらに起動スピードも高速で、余計なメモリも食わない。やっぱり魅力的だ。

ネットで学習

今回ネット上の解説ページなどで学習しているのだが、十分すぎる学習ができることがわかった。本に頼らなくてもほとんど問題ない。ただ本だと後からパラパラ読み返して思い出せるよさがある。ネットであちこち参照していては読み返すのは難しい。そこで今回は後で思い出せるように、なるべくblogに学習した内容を独自にプログラムして残すようにした。このまとめる作業が結構負担だったりする。5分で学習完了して、30分以上かけてプログラムからアップまでするという感じなので。まぁ、その手間が定着に結びつくのだけど。

図書館でC言語の本を借りてみる

最近借りてみた。改めて基礎的な確認などもしてみるが、入門書の内容ならすでに理解済みで、読む必要もなかった。バイブルのようなC言語の本は残念ながら図書館にはない。深くC言語を学びたいなら、そういう本を購入したほうがいいかもしれない。

学習は続行するつもり

基礎的な学習を続けつつ、実際に使うプログラムも作って行こうと思う。まだ作っていないリバーブとかを作ってみるかな。FFTもCで組んでJavaでは無理な高速処理をやってみるか。その前にリバーブの理論的な勉強が必要だなぁ。

C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら