プログラムを書き始めた/書き始めたい人へ

どこぞでプログラミングの啓発ネタを見て触発されて書いてみる。

うちの学校(のうちの学科)は情報系に弱いことは周知の通りで、だけれどもそれに甘んじているわけにはいかないのもまた事実*1

うちの学科の最近の若いのならば、情報処理I,IIかもしくは教える・学ぶ「C 言語入門」あたりを持っているのだと思う。あれはあれで基本的な考え方もまとまっていていいものなのだけれども、それだけではプログラムに対する考え方が、記述するコードがC言語に特有のものなのかもしくは問題の本質的なとこなのかが区別しきれなくなるのじゃないのかなとも思う。それでかまわないならいいのだけれど、一度違う世界を見てくればその成果はC言語でのコードにも現れるのだと思う。

そんなわけで違った言語でのコーディングを進めるわけであります。もちろんはじめからこれらの言語に挑んでも問題はない。むしろC言語の悪習に染まる前に経験しておくことは大事。コードの効率なりメモリ使用量なんてのは、マイコンのプログラムを書いて実感すれば、必要に応じて対応できる。

なぜあえてマイナーなOCamlをあえて先頭に置いたかというと、自分の趣味であることも影響しているけれど、「プログラミングの基礎」という本の存在が大きい。まだ全てを読んだわけではないのだけれど、プログラムの作成手法というものも意識して書かれているのがいい。C言語で文法事項でなく書き方の勉強になるものとして「プログラミング作法」を挙げておく。C言語特有の事項については「C言語 入門書の次に読む本」を読んでいたけれどこれは問題のある記述が多いので積極的にはお勧めできない。

OCamlとともにHaskellを挙げたのはOCamlなんてマイナーなものを使いたくない人向け。どちらも関数型言語と呼ばれる言語で、C言語などに代表される古き良き時代*2手続き型言語とは違ったコンパクトなコードが書ける。即物的には手続き型での一つの壁ともいえる再帰についてもっと進んだ見地が得られる。

Lisp語族と総称される言語も一応関数型に分類されているが、別物として紹介しておく。というのも現在のプログラム言語で流行の機能の多くを初期に実現していたり、強力なマクロだったりなど歴史的に重要なのだ。大教典のようなテキストも多く山積しておりそれらを読み解くために重要でもある。魅力に取り付かれて日常的に書くようになるかもしれないが(笑 そうでなくとも教養として知っておくべきとされている。テキストとしては自分が読んだわけではないがCommon Lispのそれとして「初めての人のためのLISP」を薦める。だが独特の文体なのでもっと標準的なものとして「プログラミングGauche」がある。これはSchemeの処理系GaucheでのプログラミングのものだがScheme全体を学ぶためにも十分適している。直接的にプログラミングとは関係ない*3Schemeを利用して書かれた「計算機プログラムの構造と解釈」を一応挙げておく。

なぜ括弧つきでPrologがあるのかというと、コンピュータサイエンスを学ぶのならば関数型以前に(Prologに代表される)論理型言語を学ぶべきとの主張が一部でなされているため。自分は学んだことがないので括弧つきで一応挙げておくのみ。

RubyないしPythonはとくに重要なわけではないのだけれど、簡便で開かれた世界なのでC言語よりは始めの一歩として適している。またC言語との対比として一番わかりやすいのもある。もちろんPerlなどでもかまわない。これらについては流行っているだけあって参考書も大量に出回っているので適当に選んでもいいんじゃないのだろうか。

なぜここにC++なりJavaなりObjective Cなりといった重要な言語が含まれていないのかというと、正直学習には向かないのではないかと考えているからだ。古い時代のバッドノウハウ的なコードが多く存在しているのと、機能が複雑でとっつきにくいのもある。一番の理由は、オブジェクト指向による抽象化が好きでないからだ。使いこなせば便利なのだろうけどね。

教える・学ぶ「C言語入門」

教える・学ぶ「C言語入門」

プログラミングの基礎 ((Computer Science Library))

プログラミングの基礎 ((Computer Science Library))

プログラミング作法

プログラミング作法

初めての人のためのLISP[増補改訂版]

初めての人のためのLISP[増補改訂版]

プログラミングGauche

プログラミングGauche

*1:個人的なことを言わせてもらえば、去年の応用物理がそうだったわけで。

*2:C++なりC#なりJavaなりは進化しすぎて進化していてそれらの機能も含んでいるらしいので、適切かはわからないがこの表現にしておく

*3:関係ないわけではないのだがプログラムを書くために読むべきものではないと確信している