C言語、はじめました

去年のAdvent Calendarでもちらっと予告しましたが、

note103.hateblo.jp

Perlの基礎、Linuxコマンドの基礎などを一周した感じになったので、次なるターゲットとしてC言語の学習を始めています。

直近のステイタスとしては、Perlのコードを整形するperltidy というツールがあるのですが、C言語でも同様のことをできるようにしてみました。(C関係ない)

f:id:note103:20160515120806g:plain

このためにやったことは(関係ないまま続けると)、とりあえず ClangFormat というのを brew install 。

$ brew install clang-format

で、とりあえずこれでもうターミナルからこんな感じで実行すると、

$ clang-format -i  foo.c

foo.cを適当に書き換えてくれます。

この際、いくつかコーディングスタイルの選択肢があって、その辺の指定については後述しますが、じゃあこれをVimで手軽にやろう、と思ったらこちらのVimプラグインをインストール。

その上で、vimrcにこんな感じで。

map <Leader>ct :ClangFormat<CR>

これでひとまず完了&やりたいことはできるようになっていますが、より便利な使い方については作者さんによる以下をご参照ください。
rhysd.hatenablog.com

前述のスタイル指定などについても、同記事でわかりやすく触れられていますので、あわせてどうぞ。
ちなみに、僕自身は後述の書籍のサンプルコードのスタイルがどうやらWebKit系のそれに近いようなので、そうなるようにしています*1

さて本題のC言語ですが、冒頭に挙げた昨年の記事の段階では、どんな本を中心に勉強するか、みたいなことは書いていなかったのですが、実際には以下3冊を使っています。

C言語体当たり学習 徹底入門 (標準プログラマーズライブラリ)

C言語体当たり学習 徹底入門 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

Head First C ―頭とからだで覚えるCの基本

Head First C ―頭とからだで覚えるCの基本

で、現在は最初に挙げた『C言語体当たり学習 徹底入門』を使って、頭から順にサンプルコードの写経をしています。

写経、というのはぼくはこれまであまり重視していなかったのですが、少し前にはてブをにぎわせた以下の記事を読んで、

誰もが知ってるけど敢えて言わない確実に身につくプログラミング学習法 - WirelessWire News(ワイヤレスワイヤーニュース)

なるほど〜、やったことないけど(というか無いだけに)説得力を感じるなあ、と思って、学習に取り入れてみています。

現時点では、あまりにも頭への負荷がかからないこの感覚、果たして効果あるかあ〜? という疑念のほうが優勢なのですが、とはいえまだ10本程度写経しただけなので結論は出せません。

=追記
以下の記事にあることを留意してやるといいのかな、と今見つけて思った。
橋本商会 » プログラムの写経
関係ないけど、同記事中の初心者がエラーを読まない理由については、もしかしたら以前に書いたこれ(のp35)と補完関係になるかもしれないです。
ぼんやりした大人が趣味でプログラミングを始めたら
=追記ここまで

ちなみに、冒頭に貼り付けたGIF動画のコードもその最近写経したサンプルのひとつです。

C言語、そもそもなんで今やるの? (古い言語なのに) みたいな話については、その去年書いた記事にけっこうイヤってぐらい要点が書いてあるので、くり返す必要はないと言えばないのですが、流れ的にやはりくり返してしまうと、それは「C言語で何か作りたいから」ではなく、今触れられるプログラミング関連の話や書籍というのが、どれもこれも(すべてでは無いにせよ、その大半が)「C言語を知ってる前提で書かれているから」です。

で、今ちょっとあえて曖昧に書いたのですが、そこで言う「C言語を知ってる」のは誰か? と言うと、プログラミング関連の話をしたり、本に書いたりする人、そしてそういうアウトプットをする人が頭の中で想定している架空の受け手(話の聞き手・本の読者)です。

現在、プログラマーとして名高い人や、本などでプログラミングを教える立場にある人のうち、C言語ぜんぜん知らない、という人はほとんどいないと思います。
普段Cを書いていないとか、あまり詳しくない、という人はいるかもしれないけど、一度も書いたことないとか、まったく理解してない、という人はいないかなと。

で、そういう人の話には、否応なくCの知識というか、要素が混ざってしまっていて、その人の話を可能なかぎり理解しようと思えば、どうしてもCの知識が土台として必要になるというか、まあ無ければ無くても構わない場合もあるにせよ、知っておいたほうがいろいろラク。という印象を持っています。

つまり、C言語で何か作るためにCを勉強するのではなく、避けがたくC言語の要素に触れながら語られてしまう話を理解するためにCを勉強するという、文字通り「新たな共通言語を学ぶ目的で学習する」ということですね。

逆に言うと、もし世の中のプログラマーの大半が、「Cなんてまったく知らないし、書けないよ」という人ばかりの世界になったら、ようやくそういうことをしなくて済むかもしれないんですが、少なくとも現在はそうではないので、いろんな人の話を理解しやすいように勉強する、という。
なんというか……英語の勉強に近いものがあるかもしれないですが。

と、言いつつそれでも結局、身につけるにはその言語でなんかしら作っていかないと進まない、という気もするので、実際にはこれもPerlのときと同様、自分の生活や仕事で使える便利ツールをCで書いてみる、ということにはなるとも思うのですが。

Perlで書いたものをCで書き直す、とかもいいかもしれないですが、実際そんなことがどの程度できるものか、まだまったく未知数です。
とりあえず、今年のうちにそういう、自分が普段づかいできるツールを2つぐらい、Cで作れるといいのですが。

その他、今後の予定ですが、上に挙げた参考書3冊のうち、前橋さんによる2冊はどちらも一応最後まで通読していて、その後にヘッドファーストも通読にトライしたんだけど、p550ぐらいある本のうち、p250を越えて構造体とか共用体の話が出てきたあたりからグッと難しくなって、どうやらそれ以前の部分(とくにポインタまわり)をある程度きちんと押さえていないと、無駄に時間がかかりそうだったので、一旦ストップ。

で、あらためてその3冊の中で一番初心者向けに作られている『C言語体当たり学習 徹底入門』を、最初から読み直している感じです。
その本1冊、とりあえず全体的に理解して、少なくとも「まったくわからない部分はない(怪しいところはあるにせよ)」ぐらいになったら、次のステップに行けるかなあ、というおぼろげな期待を持っているところです。

以上、後になって「ああ〜、このとき俺、こんなこと言ってたな〜」って、自分の学習進度や差分をチェックしやすいよう、とくに進展がないにもかかわらずいろいろ細かく書いてみました。

*1:と言いながら紹介したリンク先の記事ではWebKitスタイルは紹介されてないみたい。最近追加されたのだろうか……。