はじめに
プログラミングやITスキルを身につけるにあたって、コンピュータサイエンスが真っ先に勉強すべき項目として登場しますが、私はこれは後回しでよいと思っています。
この学問自体は非常に奥が深く、興味深いものですが、まだ自分でプログラムを組んでポートフォリオを作成しない段階においてはコンピュータサイエンスで紹介される内容が身近なトピックに感じにくいでしょう。その結果、自分にITの素質がないと判断してしまい、大きな機会損失になってしまいます。
現在のプログラミングはコンピュータサイエンスに詳しくなくても構文さえある程度理解できればそこそこのものは実装できるようになっています。
まずは、なるべく早く手を動かしてプログラムを作成する体験をしてみてください。
プログラミングを続けていくと自分の予想に反する結果が返ってくることがあるはずです。その現象の答えがコンピュータサイエンスの中にあります。
なので、いずれちゃんと基礎からコンピュータサイエンスを学びたいと思えるタイミングがきっとあります。そのときになってから学習を始めるので十分です。
ここでは、すでにプログラミングをある程度やっている方が、コンピュータサイエンスの基礎に入門するためのコースにしていきたいです。
数値表現
一番初期のコンピュータは今の電卓のように計算することが主な役割でした。数の大きなもの同士の計算は人の手で行うには時間がかかり、また間違える可能性があります。コンピュータはこれを一瞬で、正確な答えを出せるようになりました。
私たち人は数を表現するのに0~9までの10個の記号を使っています
0 1 2 3 4 5 6 7 8 9
そして、この記号を組み合わせることで10以上の数を表現していますね。
11 19 20 99 100 199 ....
このように10種類の記号を用いてその組み合わせで数を表現する方法を10進法といいます。
10進法はそこそこ大きな数(100とか)であってもそんなに記述のスペースを取らないし、記号の数もそれなりに限られているので人が扱うにはちょうどいい塩梅だったので流行ったのかもしれませんね。
ですが、コンピュータの世界では10進法は流行りませんでした。
コンピュータがやっていることは複雑そうですが、物理的には電気で動いています。要は電源が「オン」か「オフ」かで物事を捉えます。
電源がオンかオフのみで10や100といった数字を表しきることはできません。そこで、電源を増やしていきます。
例えば、電球を3つ用意して、それぞれに電源をオンやオフにしてそのバリエーションを作成してみます。
0~7までの8通りを表現することができるようになりました!
電球が3つなら8通りですが、4つなら16通り。10なら1024通り表現できるようになります。
コンピュータはこのようにして数を把握してきます。
電球がオフの状態は0 電球がオンの状態を1とみることで、上の電球は次のように書き直すことができます
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
このように0と1だけで数を表していく方法を2進法といいます。
コンピュータの世界では2進法が流行っているのです。
コンピュータでは電球ではなく、トランジスタと呼ばれる小さなスイッチを無数に持っており、それらをオン・オフを切り替えるなどして様々な値を表現しています。
コンピュータが2進法がよいからといって、そのまま2進法で表現されつづけると人は読みづらくて大変です。2進法を10進法に置き換えることについて考えていきましょう
「123」という三つの記号をみたとき、みなさんはこれが百二十三であるとパッと理解しどのくらいの大きさの数であるかをすぐに把握できることでしょう。
その際にみなさんが頭の中で行っているのは
100の位が1つ、10の位が2つ、1の位が3つ。
計算にすると (100 × 1) + (10 × 2) + (1 × 3) = 123ということになります。
また、数字の格桁は10の累乗をなので、(102 × 1) + (101 × 2) + (100 × 3) = 123
と書くこともできます。
格桁が10の累乗なのは扱っているのが10進法だからです。
2進法の場合はこれが2の累乗になるだけです。
したがって、110010を10進法に変換するときには
2⁵ 2⁴ 2³ 2² 2¹ 2⁰
32 16 8 4 2 1
1 1 0 0 1 0
32 + 16 + 2 = 50となります。
テキスト表現
0と1しか記号を用いない2進法でも桁数を増やすことで表現できる値を増やすことができました。
ですが、コンピュータが取り扱う値は数値に限りません。アルファベットやひらがな、漢字などといったテキスト表現もあります。電源のオンとオフの2通り、0と1しかないコンピュータの世界において、このようなテキスト表現はどのように行っているのでしょうか?
その答えはマッピングです。
マッピングとは、0000001は「A」、000010は「B」000011は「C」….のように2進法の値とテキストを割り当てていき、みんなでこの割り当てを一緒に使おうというルールの下に変換することで、テキストを表現していくことです。
アルファベットの大文字と小文字を表現するにあたっては26 + 26の52通りあれば十分です。したがって、2⁶ = 64まであれば割り当てが完了します。これに数値や記号を増やすと6乗では足りなくなるので、2の8乗(256)まで増やしてマッピングしたものをASCIIコードといいます。
ASCIIコードで表現できるバリエーションは256通りもありますが、残念ながらこれに日本語は含まれません。またアラビア語やアクセント付きアルファベットなど特殊記号もありませんので、これでは不十分です。
そこで、Unicodeと呼ばれる規格を作成し、もっと桁数を増やしたマッピングを行うことにしました。これにより、様々な言語、特殊記号、絵文字などに対応できるようになっています。
画像、動画、音声表現
数値やテキストの他にもまだまだコンピュータが表現するものがあります。
画像、動画、音声です。これらも2進法で表現されています。
まずはその中でも最もシンプルな画像から考えていきましょう。
これは私のアイコン画像です。これ拡大していくと次のようになります。
遠巻きではわかりませんが、拡大していくと小さな四角がたくさんありその四角自体は単体の色が入っており、それがたくさん集まって絵を構成しています。つまり、画像は色で構成されているのです。
この色を正しく配置していくことで人がみて猫だとわかる画像が表現されています。
2進法で色が表現できれば画像を表現できそうな気がしてきましたね。
色の表現においても、コンピュータはマッピングを行います。ですが、種類が豊富なため、テキストのときとは少し異なります。
それは光の色の三原色(赤、緑、青)を利用したものです。この三つの色の配合度合いであらゆる色を表現しようというものです。
配合の度合いを赤、緑、青それぞれ0~255(2⁸通り)まで用意して、表示させる色はその配合量だけ色を混ぜ合わせた色とします。(RGB)
例えば、赤:11, 緑:93, 青:128とした場合、赤ちょっと、緑半分くらい、青多めの色になります。
結果は
のような色になります。
赤:11, 緑:93, 青:128を2進法に変換すると、(00001011、01011101、10000000)となります。
コンピュータは一色につき、24の0・1を見ているのですね。
四角に色を割り当ててそれをたくさん敷き詰めることで一枚の画像にしています。
拡大したときの一つ一つの四角いものをピクセルといいます。画像はこのピクセルの集まりで構成されています。一枚の画像につき、よりピクセルが多ければ多いほど、高い解像度があり(たくさん拡大してもカクカクしない)よりたくさんの0・1を使って表現することになります。
画像はこれで表現できるようになりました。
次は動画についてです。動画の表現方法は画像の応用です。
動画はパラパラ漫画の要領で画像を複数用意して、それを瞬時に切り替えることで絵が動いているかのように見せています。1秒間に複数回画像を切り替えるので、画像よりさらにたくさんの0・1の桁を消費します。
音声についてもテキストや色と同じようにマッピングしてルールを決めています。音符や音の長さと
2進法の値を割り当ててそれらを組み合わせることで音を表現できるようになっています。
データ
テキストや色にマッピングをする際にたくさんの2進法の桁を組み合わせて表現してきました。
その中で、ASCIIやRGBは2の8乗をベースに一つの値を構成しました。
2進法において、2の8乗はある程度バリエーションが組める小さな単位としてよく用いられます。
コンピュータは0・1の組み合わせをデータとして取扱い、そのデータ量を表現する単位として、0・1一つのことを1bit(ビット)
取り回しがしやすい2の8乗のまとまりを1byte( バイト)としています。
コンピュータのハードディスクやメモリで使われるメガバイトやギガバイトはこの桁がさらに多くなったものとして、親しみがあるかと思います。
色一つにつき3byteを何千と敷き詰めて使う画像をさらに1秒間に何度も切り替えることを数秒や数時間にわたって行う動画を保存するとあっという間にデータ容量を圧迫してしまうのも納得ですよね。
コメント