【読書】コーディングを支える技術
普段何気なく触っているSwift、コンパイルを行なってコードをビルドしていますが、コンパイルの中身は完全にブラックボックスでコードを書いています。
コーディングについて、大学で学んだことを少しずつ思いだし、コンパイラなどのより深いところを学ぶきっかけにできればと思い、本書を読みました。
読んだ本
コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)
- 作者: 西尾泰和
- 出版社/メーカー: 技術評論社
- 発売日: 2013/04/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (37件) を見る
コーディングについて、比較・歴史から見えてくるものを記載し、「学び方」自体を学ぶことを目的とした本です。
比較から学ぶ
複数の言語を比較することで、言語特有のことが見えてくる。
歴史から学ぶ
言語の発展の歴史を追う。
この間先輩から教えてもらった、A Programming Language for Everyoneもいつか見てみたいです。
作ることで学ぶ
自分で言語を作ることで学ぶ。
学んだこと
プログラミングの歴史・比較
コードの設計によって、言語によって異なる「楽さ」の意味がある。
C++は「高速さ」、Pythonは「他人が書いたコードを読むのが楽になる」ことを売りにしているため、C++と比較して、Pythonが遅いといった議論はあまり有益にならない。
文法
構造化プログラミング
- if
- while, for
関数
- 再利用の概念
- 戻る命令
- 再帰呼び出し
エラー処理
- goto
- try- catch-finally
名前、スコープ
- グローバルスコープ
- 動的スコープ
- 静的スコープ
型
型は、人間がデータに付けた「追加のデータ」。種別などを書く。
- ジェネリクス(Java)、テンプレート(C++)、型コンストラクタ(Haskell):型を引数にとって、型を作る関数
- 動的型付け(LISP, Smalltalk, Python)
- 型推論(Scala, Haskell)
コンテナと文字列
C言語の配列、LISPのリスト、Pythonのタプル、Rubyのアレイなど
平行処理
- 協調的マルチタスク:切りのいいところで交代
- プリエンプティブマルチタスク:一定時間で交代
共有→非共有→共有、協調→非協調→協調と振り子のように2つの解の間を揺れている。
オブジェクトとクラス
- クラス
- モジュール、パッケージ
クラスは必要か?
Javaのようなオブジェクト指向プログラミングでは、クラスは必須。
C++やPython、Rubyなどの言語では、クラスを使わなくても良い。
継承
- 一般化、共通部分の抽出、差分実装
- リスコフの置換原則
- 多重継承の問題点
その他、周辺環境
- 富豪的プログラミング、YAGNI
- デバッグ、テスト
- CI/CD
- シンタックスハイライト、統合開発環境、補完
- バージョン管理