【読書】コーディングを支える技術

普段何気なく触っているSwift、コンパイルを行なってコードをビルドしていますが、コンパイルの中身は完全にブラックボックスでコードを書いています。

コーディングについて、大学で学んだことを少しずつ思いだし、コンパイラなどのより深いところを学ぶきっかけにできればと思い、本書を読みました。

読んだ本

コーディングについて、比較・歴史から見えてくるものを記載し、「学び方」自体を学ぶことを目的とした本です。

比較から学ぶ

複数の言語を比較することで、言語特有のことが見えてくる。

歴史から学ぶ

言語の発展の歴史を追う。

この間先輩から教えてもらった、A Programming Language for Everyoneもいつか見てみたいです。

www.computerhistory.org

作ることで学ぶ

自分で言語を作ることで学ぶ。

学んだこと

プログラミングの歴史・比較

コードの設計によって、言語によって異なる「楽さ」の意味がある。

C++は「高速さ」、Pythonは「他人が書いたコードを読むのが楽になる」ことを売りにしているため、C++と比較して、Pythonが遅いといった議論はあまり有益にならない。

文法

構造化プログラミング

  • if
  • while, for

関数

エラー処理

  • goto
  • try- catch-finally

名前、スコープ

  • グローバルスコープ
  • 動的スコープ
  • 静的スコープ

型は、人間がデータに付けた「追加のデータ」。種別などを書く。

コンテナと文字列

C言語の配列、LISPのリスト、Pythonのタプル、Rubyのアレイなど

  • 配列と連結リスト(それぞれ長所と短所がある)
  • 辞書、ハッシュ、連想配列
  • 文字列について(C言語Java, Rubyなどの事例)

平行処理

共有→非共有→共有、協調→非協調→協調と振り子のように2つの解の間を揺れている。

オブジェクトとクラス

  • クラス
  • モジュール、パッケージ

クラスは必要か?

Javaのようなオブジェクト指向プログラミングでは、クラスは必須。

C++PythonRubyなどの言語では、クラスを使わなくても良い。

継承

  • 一般化、共通部分の抽出、差分実装
  • リスコフの置換原則
  • 多重継承の問題点

その他、周辺環境