shiki0331’s blog

Web Developer. TypeScript / React.js を中心に学んでいます。 ブログ内容で間違っている箇所などありましたら、ご指摘していただけると助かります。

「コンピュータはなぜ動くのか」まとめ。GW企画

GWなのでたくさん本を読んでいきたいと思います。

読むだけではあまり知識が定着しなさそうなので、自分で大事そうなところをまとめてアウトプットしていきますー!

 

「コンピュータはなぜ動くのか」

まずは1冊目の「コンピュータはなぜ動くのか」をまとめていきます。

 

shop.nikkeibp.co.jp

 

本の概要を簡単に説明すると、前半はコンピュータの基礎知識について学びます。

中盤から後半にかけては、データ構造・データベース・TCP/IPなどの知識を学んでいきます。

 

コンピュータの三大原則

以下が三大原則です。

  1. コンピュータは、入力・演算・出力を行う装置
  2. プログラムは、命令とデータの集合体
  3. コンピュータの都合は、人間の感覚と異なる場合がある

 

「ハードウェア」は入力・演算・出力の3つを行う装置。

例えば、「1」と「2」という情報をキーボードから入力して、プログラミングでそれらを足し算するという演算を行い、その結果である「3」を画面に表示するのがコンピュータです。

 

Webの閲覧やゲームなどの複雑な機能も、結局は入力・演算・出力の3つが組み合わさって出来ているのです。

 

 

「プログラム」は命令とデータの集合体です。

命令とは、入力・演算・出力をコンピュータに指示するものです。

データとは、命令の対象となる入力情報または命令の結果によって得られる出力情報のことです。

 

コンピュータの都合は、人間の感覚と異なる場合があります。

例えば、コンピュータの世界では文章・画像・音楽など全ての情報を2進数の数字で表します。

このようにコンピュータの都合があるので、人間にとっては難しく感じることもあるのです。

 

2進数については下記の記事をご覧ください。

bit byte 2進数とは? - shiki0331’s blog

 

 

ハンド・アセンブル

コンピュータは、前述した通りに2進数の数字しか理解することができません。

これを「マシン語」といいます。

 

しかし、2進数の数字の羅列であるマシン語を人間が使うには大変ですよね。

 

そこで、少しでも人間が理解しやすいように英語に似たニックネームを付けてプログラムを作成することを「ニーモック」と呼び、ニーモックを使ってコンピュータに命令するプログラミング言語を「アセンブリ言語」と呼びます。

 

コンピュータは「マシン語」だけしか理解ができないので、「アセンブリ言語」を理解できません。なので、コンピュータに最終的なお願いをするときは「マシン語」に変換してから伝えてあげなくてはいけません。

 

このアセンブリ言語で記述したプログラミングをマシン語に変換する作業を「ハンド・アセンブル」といいます。

 

ちなみに現在よく使われている「Ruby」や「PHP」は「高級言語」といいます。

これらの言語も最終的には「マシン語」に変換されてコンピュータに伝えていることを理解しておきましょう。

 

オブジェクト指向プログラミング

オブジェクト指向プログラミングには「クラス」と「オブジェクト」という概念があります。

 

「クラス」は「オブジェクト」の定義であり、「クラス」が実体を持ったものが「オブジェクト(=クラスのインスタンス)」。

 

現実に例えると、お菓子のクッキーを作る際の「クッキーを作るための型」が「クラス」で「くり抜かれたクッキー」が「オブジェクト」です。

 

オブジェクト指向には大きな三本柱があります。

「継承」・「カプセル化」・「多態性」です。

 

「継承」はクラスの機能を新しいクラスを作成する際に継承することで、簡単に前のクラスの機能+新しい機能を作成することができます。

また機能を変更する際にも、継承元のクラスを変更するだけで継承先のクラスも変更することができます。

 

カプセル化」は必要のないクラスの情報をブラックボックス化することで、使いやすい部品となり保守性が上がります。

 

多態性」は同じメッセージで複数の操作が行えるクラスを作れば、クラスを使う人は覚えることが少なくて済みます。

 

どれも大型プロジェクトを作成する際に凄く役立つ機能なので、個人での小さい開発などではオブジェクト指向の良さが実感しにくいかもしれません。

 

データベース

以下のような3つのテーブルがあるとします。

 商品                    売り上げ                     顧客
・商品ID             ・売り上げID             ・顧客ID
・商品名     1対多    ・商品ID     多対1    ・顧客名
・単価                 ・顧客ID                    ・住所
                            ・売上数量                 ・電話

 

商品ID・売り上げID・顧客IDがそれぞれ主キーとなります。

「主キー(primary key)」はレコードを特定するIDです。

 

売り上げデーブルには、顧客IDと商品IDというフィールドがあります。

これらは、他のテーブルの主キーであり、売り上げテーブルにとって「外部キー(foreign kye)」と呼ばれます。

 

同じ値の主キーと外部キーによって複数のテーブルが関連づけられ(relation)データを芋づる式に取り出せます。

 

リレーションシップの形態は「多対多」とはなってはいけません。複数のテーブルを芋ずる式にたどることが困難になるからです。

 

「多対多」になってしまう場合は、上記のリレーショシップのように2つのテーブルの間にもう一つテーブルを作成します。

これを「結合テーブル(リンクテーブル)」と呼びます。

 

DBMSの機能の一つとして、テーブルの個々のフィールドに「インデックス(index」を設定できます。

 

インデックスは、データの検索と並べ替えの速度を向上させる内部的な仕組みです。

 

フィールドにインデックスを設定すると、そのフィールドのためのインデックス・テーブルが自動的に作成されます。

インデックス・テーブルは、フィールドの値と、そのフィールドを持つレコードの位置を記録したものです。

 

例えば、顧客テーブルの顧客名フィールドにインデックスを設定すると、「顧客名」と「ファイル上の位置」という2つのフィールドを持ったインデックス・テーブルが作成されます。

 

インデックス・テーブルは元のテーブルに比べてフィールド数が少ないので、高速に検索や並び替えが行えます。

インデックス・テーブルで検索や並び替えを行ってから、元のテーブルのレコードを取り出します。

 

そうなると、全てのフィールドにインデックスを設定すれば良いのでは?と思いますね。

 

しかし、インデックスを設定するとテーブルにレコードが登録されるたびにインデックス・テーブルの更新処理が必要になります。

 

検索と並び替え速度向上の代償に、登録の速度が低下するのです。

 

そのため頻繁に検索や並び替えが行われる場合にだけインデックスを設定するべきです。

 

 

トランザクションに関して、SQLの命令が用意されています。

  1. DBMSトランザクションの開始を知らせるBEGIN TRANS-ACTION命令
  2. トランザクションの終了を知らせるCOMMIT命令
  3. トランザクションの途中でトラブルが発生した場合に、トランザクション開始前の状態にデータベースの内容を戻すROLL BACK

 

 

TCP/IPネットワーク

インターネットを通して情報が電気信号として伝わるからコンピュータ同士で情報を交換できます。

 

電気信号を受信したコンピュータは、それが自分宛てものであれば受け取り、そうでなければ無視します。

電気信号の宛先は「MAC(Media Access Control)アドレス」と呼ばれる番号で指定されます。

 

個々のネットワーク・カードが持つROM(Read Only Memoly=読み出し専用メモリー)には、あらかじめ一枚ずつ異なるMACアドレスが焼きこまれている一意な番号です。

 

MACアドレスだけでインターネットを実現すると、インターネットに接続している膨大な数のコンピュータには、何もグループ化されていないMACアドレスがあるだけです。

 

これでは情報の送り先を見つけるのに、もの凄く時間がかかってしまいます。

 

そこで、TCP/IPネットワークでは、ハードウェア的なMACアドレスとは別の、ソフトウェア的な番号をコンピュータごとに設定しています。

この番号が「IPアドレス」です。

 

ただし、最終的に情報を受け取るネットワーク・カードを識別するのがMACアドレスであることには変わりありません。

 

IPアドレスによって、例えば1~3つ目の数値で企業を表、4つ目の数値で企業内のコンピュータを表すようなグループ化が簡単に行えます。

IPアドレスMACアドレスと同様に一意な数値です。

 

インターネットの世界ではIPアドレスという数値でコンピュータを識別しているはずなのに、普段私たちは「www.example.com」のような文字列でWebサーバーを指定できていますよね。

 

実は、インターネットには「www.example.com」という文字列をIPアドレスに変換してくれる「DNS(Domain Name System)サーバー」というものが存在しています。

 

 

TCP」はデータの受信者と送信者がお互いに相手の確認を取りながら、確実にデータを受け渡すためのプロトコルです。

他のも大きなデータを「パケット(小包)」と呼ばれる単位に分割して送信し、それを受信側で元のデータに復元するためのプロトコルもあります。

 

 

 

少しだけですがまとめてみました。

途中難しい章もあって飛ばした部分もありましたが、基礎を学ぶ上では良い本だったなと思います。

 

amazonkindle版では1000円ちょっとで買えるので、是非興味ある方は読んでみてください!