「コーディングを支える技術」
どんな人におすすめか
- プログラミング「言語」に興味がある人
- 非CSのプログラマーで2個目3個目の言語にチャレンジしようと思ってる人
- 「オブジェクト指向」や「関数型プログラミング」が全く直感できない人
どんな本か
プログラミング初学者を対象に「関数」「エラー処理」「並列処理」「オブジェクト指向」といった幅広いプログラミング言語の要素について比較・言語史を用いつつ解説を加えている書籍です。
他の本ではあまり説明されないがちな「関数」「オブジェクト指向」の意義などについてフラットに各言語の比較・言語史的「〇〇をいままでパラダイム前はこのようにしてやってたけどこれを言語機能にしたのが××」といった解説が付け加えられ、プログラミングへの深い理解を助けてくれます。
特になるほどなと思った章について軽く紹介
構文木
構文木とは、Wikipedia1によると
構文木(こうぶんぎ)とは、構文解析の経過や結果(またはそれら両方)を木構造で表したもの。
とあり、実際にプログラミング言語の処理系は一度構文木を中間状態として持っている言語もあると思います。
Pythonではastライブラリーによって途中の構文木を確認することができるということを知り、結構中身ではいろんな処理が走ってるのだなと触って少し感激しました。
どうやって入力値を木構造に変えているか興味を持ったので後日C#で再起下降パーサーというパーサーを書く記事でまた詳しく構文木については触れていきたいと思います。
関数・例外処理
関数: 以前はポインターでここに戻って処理をしてね!」と次のやる作業のポインターを変えることで実装していた処理でした。これを言語機能として一塊の処理のまとまりとすることで、可読性と再利用性を高めることができるようになった。またこれによって「再帰呼び出し」をやりやすくなった。
特に再起呼び出しについては、図表を用いて丁寧に説明しているため関数型プログラミングの初歩でつまづいている場合この辺りを読んでみると嬉しさがわかるようになる気がします。
例外処理: 失敗時の処理を昔は返り値や割り込みをおこなっていたが、 返り値には可読性やエラーの原因究明に時間がかかるという課題があった。そこで割り込み処理を応用した「例外処理」のための文法が生まれた。例外の文法には、try-catch-finally構文(失敗しそうな部分を囲むことができる。また、必ずやる処理を規定できる)や検査的例外(例外処理として行う例外をあらかじめ宣言するJavaの機能)など様々な例外時の問題を解決する方法が提案されている。
個人的には、まだ実装時の課題が残りまだまだ新しい例外処理の概念が提唱されそうだなとワクワクするような部分もありました。また、関数にも例外処理にも言えるのですがこれらは「善く」コードを書かないと活用できてないことによる可読性の低下やトレーサビリティの低下を招いてしまうなということを感じ、意味を知りより善く書いていきたいということを改めて感じさせる文でした。
オブジェクト・継承
いわゆる「オブジェクト指向」に関連する事項が2章に分けられており、そこからもオブジェクト指向というパラダイムの難しさ載せられている期待感がいかに大きかったかを感じることができます。また、型という概念もオブジェクト指向を難しくさせている一つの要因に思えます。
オブジェクト指向: 少なくとも二種類の考え方があり、その上でオブジェクト思考を実践している言語には型がついている言語と型タグのみ採用している言語があることも述べられています。その上で
つまり、現実世界の「モノ」の「模型」をコンピューターの中に作るにはどうすればいいか?どうすれば楽に作ることができるか?それを色々な人が考えた結果「オブジェクト指向」という概念が生まれたきたのです2
と紹介されています。その後、ParlやJavascriptを例にしてクラスについての解説が行われています。図表やコードが多く書かれており、かなり短い分ではありますがわかりやすく概念を説明しているように思えます。
他のおすすめ書籍
この本と一緒に読むと良い本としては以下があげられます。
- C#/Javaの入門書
- Python/Rubyの入門書
- オブジェクト指向でなぜ作るか
個人的にオブジェクト指向はプログラミング言語的な概念以外にも広がってしまった概念であるためそれに言及された本を一緒に読むとオブジェクト指向についての理解や認識が持てるのかなというふうに感じています。
-
https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E6%9C%A8# ↩
-
西尾 泰和 (2013) 「コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)」 技術評論社 188 7−10 ↩