コーディングを支える技術

ーー 第1章 言語を深く効率的に学ぶには ーー

 

■「比較から学ぶ」

・複数の言語を比較しながら学ぶ。

・何がいくつもの言語で共通していることなのかを学べる。

 

■「歴史から学ぶ」

・言語がどう変わったか、変わる前にはどういう問題点があったかを学ぶ。

・言語が持ついろいろな機能がなぜ生まれたのかを学べる。なぜ存在するのか。

 

 

ーー 第2章 プログラミング言語を俯瞰する ーー

 

プログラマの三大美徳ー無精・短気・傲慢ー

・「無精」エネルギーの総支出を減らすために、多大な努力をするようにあなたを駆り立てる性質。

 

■言語により「楽さ」は異なる

・高速なコードを書くのが楽な言語、可読性の高い言語、言語仕様を把握するのが楽な言語など、楽なことはそれぞれ。

・目的によって適切な言語は異なる。

 

 

ーー 第3章 文法の誕生 ーー

 

文法とはどういう文字列を書いたらどういう構文木ができるか、というルール

簡単な文法ではなく、自然と思える書き方を実現できる文法が受け入れられた。

 

 

ーー 第4章 処理の流れのコントロール ーー

 

while は条件式、for は回数で繰り返しを制御。

if や for や while などの制御構文は、これらがなくとも go to を使うことで実現できる。この意味で、制御構文は 「 制限付きのgo to 」と言える。しかし、可読性や簡易さを考慮すると制御構文を使うべき。

 

 

ーー 第5章 関数 ーー

 

■関数の役割

「理解」意味的にひとかたまりのコードをくくり出して名前をつけることで、そのコードが何をしているか把握しやすくなる。

「再利用」プログラムが短くなる。何度も同じコードを読む必要がなくなる。

 

 

ーー 第6章 エラー処理 ーー

 

■エラー処理の2つの方法

「返り値で伝える」失敗を見落としたり、コードが読みづらくなったりすることが。

「例外処理」対にしなければならない処理を正しく対にしづらくなったり、関数がどんな例外を投げるかが、その関数のコードからは伝わらなくなる。

 

 

ーー 第7章 名前とスコープ ーー

 

ローカルな「静的スコープ」とグローバルな「動的」スコープ

 

 

ーー 第8章 型 ーー

 

正直あんまりよく分からんかった。

以前は「静的型付け」が多かったが、最近は「動的型付け」が増えている。

「静的型付け」ー「変数名」「値が保存されているメモリ上の位置」「そのメモリの内容はどういう種類の値か」をセットにして持っている。

「動的型付け」ー上記の「種類の情報」に加えて、値自体までセットになっている。

 

 

 ーー 第9章 コンテナと文字列 ーー

 

■配列と連結リスト

・多くの言語が配列と連結リストともにサポートしている。

・「配列」メモリ上に連続して値を格納している。

 ○ n番目の要素をすぐに取り出せる。(O(1))。メモリの容量が少ない。

 × 値の挿入には時間がかかる。

・「連結リスト」メモリ上で値と次の値のアドレスを連続して格納する。

 ○ 挿入が容易。

 × n番目の要素の取り出しに時間がかかる。

 

■ハッシュテーブルと木

・辞書、ハッシュ、連想配列の格納にはハッシュテーブルか二分木が用いられる。

・「ハッシュテーブル」キーをハッシュ関数を使って整数に変換し、その整数のアドレスに値を格納する。

 ○ 計算量が少ない、被りがなければO(1)。

 × ハッシュテーブル用の大きな配列を用意する必要があるため、メモリを消費する。

・「二分木」右を大きい、左を小さい値として、木を形成する。

 ○ メモリの消費が少ない?

 × 計算量がかかるO(log n)。

 

■文字列

・何が文字であるかは、取り決めによって決まる。

文字集合文字符号化方式、文字列の実装は言語によって異なっている。

 

 

ーー 第10章 並行処理 ーー

 

これでプロセスとスレッドの違いや仮想アドレスなんかをまず見てみよう。

http://moro-archive.hatenablog.com/entry/2014/09/11/013520#

 

■処理を切り替える2通りの方法

・「協調的マルチタスク」区切りのいいところでタスクを交代する。タスクが無限ループになった場合などは変更されないなどのデメリット。

・「プリエンティブマルチタスク」強制的にタスクが交代される。現在のOSで採用されている方法。

 メモリを複数のプログラムで共有するか否かで問題が起こった。トランザクションなどの解決策が模索されている。

 

 

ーー 第11章 オブジェクトとクラス ーー

 

■オブジェクト

オブジェクト指向は現実世界のモノの模型を作るために生まれてきた。

・言語によって言葉自体の意味や実現方法は異なる。

 

 ■クラス

・まとまったものを作る生成器

・どういう操作が可能かという仕様

・コードを再利用する単位

 

 

ーー 第12章 継承によるコードの再利用 ーー

 

■3種類の継承

・一般化 / 抽象化

・共通部分の抽出

・差分実装

 

■多重継承による名前解決の問題へのアプローチ

・多重継承自体の禁止

・メソッド解決順序自体の工夫

・Mix - In による処理の混ぜ込み

・トレイト

 

■クラスの役割

・「再利用の単位」機能ごとの、余計なものを持っていない、小さなクラス

・「インスタンス生成器」完結した、必要なものを全部持った、大きなクラス

 

 

 

ーー 感想 ーー

・後半になるにつれてちょっと難しくなった。ある程度の具体を経験していないと分かりにくかったり、例外処理や並列処理なんかは前提がないと分からなかったりするのではないかな、と。

・とはいえ、この本の目的である、比較や歴史からプログラミングを学ぶという目的はある程度は達成できたのではないかと思う。

・後半はもう少し経験を積んで、あるいは他の言語を自分で学んで違いを実感した上で再読したいと思った。