msksgm’s blog

msksgm’s blog

Webエンジニアです.日々の勉強,読書,映画観賞,美術観賞の記録を載せます.勉強日記と読書日記は定期的に削除します.

「コーディングを支える技術」まとめと感想

「コーディングを支える技術」[2013, 西尾 泰和]を読んでいます.

まとめと感想について記述していきます.

概要・まとめ

全体感

本は,プログラミング言語に共通する特性や,枝分かれした特性などの,成り立ちについて学ぶことができます.
主なテーマは,文法,処理の制御,関数,エラー処理,名前とスコープ,型,コンテナと文字列,並行処理,オブジェクトとクラスなどです.
序盤の方はアセンブリや C などの初期に生まれた言語から始まり,そこから派生していった Ruby,Python,Java関数型言語で有名な Haskell などの特徴を交えて解説が進みます.
現在の使用方法にいたるまでに,プログラミング言語のアップデートだけでなく,ハードウェアの進歩,新しい規格の制定が生まれたことを学ぶことができます.
しかし,現在も議論が重ねられている要素があり,それが言語の特有の機能などになっていることわかります.

それぞれの章について

簡単に要約

文法

スタックマシンと FORTH の説明から,文法の始まりについて学びます.スタックマシンの原理は,JavaPythonRuby などといった現代のプログラミング言語にも用いられている.
その後 LISP を経て,様々な論理的な破綻がしない文法が考えられていった結果,FORTRANプログラマが慣れた方法(中置記法)で書くのが一般的になった,

処理の制御

while 文,for 文,if 文以前にあった goto について学びます.
while,for,if はそれぞれ,goto を用いても実装ができますが,可読性が大幅に向上した.

関数

関数は理解と再利用のために生まれました.
関数は意図的にコードの塊をくくり出した名前をつけることで,そのコードが何をしているか把握しやすくなった.
再帰呼び出し」というコーディングテクニックによって,入れ子になったデータを扱うのに適している.

エラー処理

失敗を伝える方法は「返り値で伝える方法」から始まった.
しかし,失敗を見落としたり,エラー処理のせいでエラーが読みづらかったりする問題があった.
そこで,「失敗したらジャンプする方法」が言語(COBOL, PL/I)が生まれ,「失敗の種類を追加できる」,「失敗を発生させられる」要素が,その後の言語(CLU, C++, Java)にも受け継がれている. try-catch-finally は多くの言語で採用されているが,例外処理の結論は決まっておらず,Java の検査例外は他の言語で採用されていない.

名前とスコープ

メモリの場所を指定していたが,わかりづらいので名前を付けたのが変数の始まり.
最初はグローバル変数しかなかった,そのための解決策が「長い変数名をつける」,「スコープを利用する」だった.
スコープで,名前の有効範囲であり,プログラム全体で名前が衝突しないようにする方法.動的スコープは,関数を入り口で元の値をとっておき,出口で書き戻す方法があった.影響範囲が大きかったので,「静的スコープ」が生まれ,今のスコープになった.

型とは人間がデータにつけた「追加のデータ」,元々 0 と 1 で表現するビット列のあつまり.
整数型,不動小数点などを,型によって管理する.
言語に決められた型から,「ユーザ定義型」,「仕様としての型」がつくられ,総称型,ジェネリクス,テンプレートが

コンテナと文字列

プログラミングには,いろいろな種類のコンテナ(配列,連結リスト,ハッシュ,木,辞書など.)が用意されている.それぞれに,メリット,デメリットがある 計算量やメモリの観点から,万能なコンテナはない.

文字は,人間が決めた記号の集合のようなもの.
文字集合で,何が文字であるかを定義し,文字符号化方式で,どうやって文字をビット列に表現するかを考え,文字列の実装では

並行処理

処理を切り替える二通りの方法の「協調的マルチタスク」,「プレンプティブマルチタスク」は,後者が一般的,
リソースを競合させないために,様々な手法が考えられてきた.

オブジェクトとクラス

クラスは言語によって意味が違う.C++では,class はユーザ定義型を作るための仕組みとしたが,オブジェクト指向を作った Alan Kay は「メッセージ」だといった.
クラスは3つの役割をもっており,「まとまったものを作る生成器」,「どういった操作が可能かという仕様」,「コードを再利用する単位」がある.
継承にはさまざまな考え方があり,「一般化・特殊化」,「共通部分の抽出」,「既存のクラスを継承して差分を実装」などがある.しかし,継承をしすぎると深い継承ツリーがうまれ,わかりづらいコードが生まれてしまう.
多重継承は,名前の衝突がおこるというデメリットから,Java では採用されていない.

感想

「コーディング」というタイトルから,vimemacs などのエディターを想像できてしまいますが,まったく関係ありません.
しかし,あくまで「コーディング」なので,コンパイルの方法やメモリの割り当てなどのプログラミング言語と低レイヤーの内容もほとんどありません.

全体的な説明が現在使われるプログラミングの仕様の成り立ちについてなので,業務に役立つ知識があるかと言われたら微妙だと思います.
複数の言語の経験があったら,その仕様の違いについて納得することができる内容が多いです.
業務に関係なく,言語について少しでも詳しくなりたいなら買いだと思います.

全体的に難易度は低く,ソースコードの記述量も少ないです.
言語はアセンブリ,C,haskellPythonJavaScriptJava などが使われいます,私は,C,JavaJavaScriptPython を用いたことがあるのでサクサク読めました.
ただ初版が 2013 年なので,ES2015 以前の JavaScript や Python2 系などと,あまり使わないバージョンが使われていたりや,Kotlin,Go,Rust などのモダンな言語が使われていないので,あまり親しみのない言語しか使っていなかったら,得られる物が少ないかもしれません.