
なぜコンピュータの仕組みを学ぶかについて考えます。プログラミングができるようになるには、コードを書ければ良いわけではありません。コンピュータの内部の仕組みを知ることが、一歩進んだ応用力を身に付ける上で最も大切なことなのです。
このコースの概要についてお話しさせて頂きます。ハードの仕組みからスタートして、最後にはOSなどソフトの機能を学ぶ流れとなっています。コンピュータの最もベースとなる、数学や論理学の学問から学び始めるのが本コースの特徴です。一見、周りくどく思えるかもしれませんが、前提知識を1つ1つ積み上げながら仕組みを学んでいきます。まずはこのレクチャーで全体概要を掴みましょう。
このレクチャーでは、セクション2で学ぶことの全体概要をお話しします。
コンピュータの基礎となる理論である数学、論理学、工学の3つを学びます。コンピュータには様々な学問や技術が使われていますが、中でもベースとなる理論は3つだけです。アラビア数字がブール代数と出会い、それをシャノンが電気によって情報を表したことでコンピュータは誕生しました。決して1人の人間が考え、発明したものではありません。総合芸術であるコンピュータの大切な仕組みを、歴史を追いながら学んでいきましょう。
コンピュータとは本来、計算を行うための機械です。それでは、アラビア数字が生まれる以前、人はどのように計算していたのでしょうか。石ころや粘土、棒切れなど古来から人は様々な方法を使って計算をしてきました。しかし、効率的に数を数える仕組みがなければ、コンピュータは生まれません。ここではアラビア数字以前の不便な時代の「数字」について見ていきましょう。
アラビア数字が登場したことによって、人は大量の計算を素早く行えるようになりました。そこにはどのような仕組みがあり、それまで使われていた数字とは何が違うのでしょうか。「位取り数記法」と「ゼロの概念」の2つに注目して、アラビア数字の革新性について学んでいきましょう。
論理学を発展させ、そこに数学を融合させたのがジョージブールでした。ブール代数は、人間の思考や論理を数式に置き換えることを考えます。ブールはコンピュータのために研究をしたわけではありませんでしたが、彼の理論はコンピュータの発展に大きく貢献します。複雑なブール代数を例え話を交えながら、わかりやすく学んでいきましょう。
電子式計算が誕生する以前の歴史を学びます。「機械に計算をさせる」というアイディアは古くからあったのですが、その実現は困難でした。機械式の計算機は壊れやすく、また10進法を使った計算は複雑になりすぎるため、他の方法を模索していました。そこには①電気回路でどう設計したら良いか分からない、②2進法でどう計算したら良いか分からない、という2つの壁がありました。シャノンが登場するまでの計算機の歴史を学びましょう。
シャノンはブールの論理演算を電気回路によって実現します。これは人間の思考や論理を電気のON OFFで表せることと同じでした。このレクチャーでは実際に電気回路を作りながら、AND、OR、NOTの論理演算の回路を作ります。これらの論理回路を作ることができれば、四則演算も可能になります。論理学と工学をミックスさせたシャノンのアイディアは画期的なモノでした。
半加算器による足し算を学びます。コンピュータ内部の処理は、加算器による計算が中心となっています。半加算器がわかれば、全加算器も引き算も掛け算も割り算も、全てわかったも同然です。論理回路をいかに組み合わせるかによって、加算器を実現するかを学びましょう。
加算回路を使って、引き算、掛け算、割り算を実現させる方法を学びましょう。コンピュータ内部の仕組みをできるだけシンプルにするために、これら3つは全て足し算の回路によって作られています。その中でも、引き算は「補数」という少し特殊な方法で計算がされています。加算回路を応用させながら、他の演算方法について理解を深めましょう。
コンピュータはただの計算機なのに、文字や画像、音声などを扱えるのはなぜでしょうか。それはクロードシャノンが「全ての情報は0と1で表せること」に気付いたからです。彼は数学と論理学の知識を、工学によって形にする偉大な発見をした人物でした。シャノンの情報理論を学びながら、ただの計算機がいかにコンピュータになったのかを学びましょう。
0と1の電気のON OFFが情報の最小単位であることを学びました。とはいえ、ビットを単位に情報を扱うことはありません。バイトという単位を基本単位で扱っており、1バイト=8ビットと定められています。ではなぜ1バイトは8ビットなのでしょうか。1バイト=8ビットに定まるまでの歴史的経緯を追いながら、バイトについて理解を深めていきます。
コンピュータで扱うことが多い16進数について理解を深めます。なぜ16進数は2進数と相性が良いと言われるのでしょうか。実際に表で2つを比較しながら、進数や進法への理解を深めていきましょう。
コンピュータでなぜ2進数が使われるのかを一緒に考えます。私たちは10進数で計算をしているのだから、0〜9の数字を使った方がわかりやすいと思いませんか?CPは0と1で計算をするのには、電気回路で計算を行う特性上のメリットがあります。全てをON OFFに還元する方がCPにとってはわかりやすいのです。2進数について理解を深めていきましょう。
「デジタル」という言葉を聞くと、どこか無機質で冷たいイメージはないでしょうか。しかし、デジタルの仕組みは私たちの体(DNA)にも使われている素晴らしい仕組みです。このレクチャーでは、なぜコンピュータはデジタルで情報を扱うのかについて考えます。デジタルで情報を扱うことは、データをシンプルに処理する上で大きなメリットがあります。併せて、近年のデジタル化やDX化についても考えます。
2進数を使ったデータの表現方法として、文字、画像、音声について学びます。デジタルで情報を表すと、どこかで情報を切らなければなりません。そのため、現実の情報を全てリアルに再現することができません。しかし、近年の技術は人間の感覚が追いつけないほど進化しています。3つのデジタル化の方法を学びながら、コンピュータがどのように情報を表すか学びましょう。
コンピュータの五大装置を学ぶことで、CPU、メモリ、I/Oの位置付けを学びます。CPUはコンピュータの演算部に位置しており、計算を行う大切な部分です。またメモリはそのまま記憶装置に位置し、メモリを対象にデータを格納しています。それぞれが位置する場所にも特徴がありますので、改めてその位置付けを学んでいきましょう。
コンピュータを構成する最も大切な部品である、CPU、メモリ、I/Oについて学びます。これら3つはコンピュータのどこにあって、どのような働きをしているのでしょうか。このレクチャーでは全体概要を掴んで、後のレクチャーで個別に理解を深めていきましょう。
コンピュータを構成する最も小さな部品であるICについて学びます。CPUやメモリもICから出来ており、エンジニアはICに格納されたデータを扱っています。このレクチャーでは、黒いムカデのような形を物理的にイメージできるようになることが目標です。ピンの1本1本が電気のON OFF、0と1に対応していることを覚えましょう。
CPUの4つの機能について理解を深めます。具体的には演算装置、制御装置、レジスタ、クロックを学びます。この中でエンジニアが特に意識しなければならないのは、レジスタです。なぜなら「プログラムを動かす」ということは、「レジスタに入っているデータや命令を動かす」のと同じだからです。「CPUコンピュータの頭脳となる装置である。。」という漠然としたイメージを脱して、4つの機能の働きを具体的にイメージできるようになりましょう。実際のデータの処理方法についてはセクション5でお話しさせて頂きます。
クロックの具体的な役割を学びます。CPUの中で全ての部品が協力して動くにはなくてはならない存在です。クロックが何から出来ていて、どのような仕組みで動いているかを学びましょう。最近話題になっているデュアルコアやクアッドコアについても触れています。
一口にメモリといっても、様々な種類があります。データを記憶するのにも色々なやり方があるからです。まずは大きな区分としてROMとRAMについて学びます。読み込み専用か?読み書きできるか?という違いがあるのですが、実際に使われている具体例などを見ながら理解を深めていきましょう。
ICの中でも特にメモリに使われるメモリICについて学びます。エンジニアはメモリICに入っているデータや命令を扱うので、この仕組みを理解することはとても大切です。メモリICは黒いピンが出たムカデのような形も同じですが、そこには4つの機能があります。電源、制御信号、アドレス信号、データ信号の具体的な役割を学びましょう。
メモリICへの具体的なデータの書き込み方法を学びます。ピンの役割と電気のON OFFを1つ1つ対応させていきます。複雑なピンの仕組みも、1つ1つ役割を抑えていけば簡単に理解できます。データの書き込みが物理レベルではどのように行われるか、しっかりとイメージできるようになりましょう。
CPUとメモリでデータを連携させるに当たって、前回のセクションを復習します。ICピンの4つの機能をわかっていないと、バスの仕組みは理解できません。電源、アドレス信号、データ信号、制御信号のそれぞれの役割を復習しましょう。
CPUとメモリはどのようにデータをやり取りするのでしょうか。実際に回路図を見ながら、2つの連携方法を学びます。2つはバスという電線によって結ばれており、データバスやアドレスバスによってデータのやり取りをしています。2つの仕組みについてより具体的なイメージができるようにしていきましょう。
レジスタの処理の流れを学びます。「レジスタとメモリの間でどのようにデータをやり取りしているか具体的にイメージできるようになること」が目標です。演算装置はレジスタに置いてあるデータしか処理できない特性上、メモリとの間ではいつもデータや命令をやり取りしています。みなさんが動かすプログラムは全て、レジスタにロードされ、演算装置によって実行されています。レジスタと処理の流れをしっかりとイメージできるようになりましょう。
1口にレジスタと言っても、その役割によって様々な種類があります。それはメモリに様々な種類があるのと同じです。汎用レジスタ、命令レジスタ、プログラムカウンタなど代表的なレジスタの役割を学びます。「どこで、何のデータを処理する?」かがイメージできるようになれば、内部でプログラムを処理する仕組みがより具体的に理解が深ままるはずです。
コンパイラはハードとソフトの橋渡しを行う最も重要なインターフェースです。私たちの書いたコードは、コンパイラというソフトがなければ動かすことはできません。にもかかわらず、多くの解説書では「プログラムを機械語に変換する」程度の説明で終わっています。そこで、このセクションではコンパイラの具体的な処理の流れを学びます。コンパイラは何段階にも分かれた複雑な作業です。1つ1つ内容を抑えながら、全体の仕組みを理解しましょう。
コンパイラが生まれるまでの『機械語、アセンブラの歴史』を学びます。コンパイラが生まれるまで、とても不便な状況が続きました。0と1の機械語を直接入力して、CPを動かさなければならないからです。機械語に名前をつけたアセンブラも生まれましたが、機械寄りでプログラムを書かなければいけない状況は続きました。コンパイラが生まれるまでの歴史を学びながら、いかにコンパイラが素晴らしい仕組みなのかを体感して頂こうと思います。
高水準言語はコンパイラがなければ何も動きません。高水準言語とコンパイラは2つで1セットなのです。このレクチャーでは高水準言語の概要を学びながら、コンパイラへの理解を深めます。①CPUに依存せずコードを書ける、②一度書いたらどこでも動かせる、という特徴がありますが、これらはコンパイラという強力なソフトがあるおかげです。機械寄りの不便なコーディングから、いかに人間よりの便利なプログラミング言語が生まれたかを学びましょう。
アセンブラのプログラムについて理解を深めます。また、アセンブラにまつわる似た意味の言葉への理解も深めます。3つはどのような意味で、どのようなタイミングで使われる言葉なのでしょうか。それぞれの意味をしっかりとイメージできるようになりましょう。
コンパイラとインタプリタの違いを学びます。2つは「高水準言語を翻訳する」という目的は同じですが、それを実現する方法は異なります。一括翻訳か逐次翻訳という違いを、具体例や実際の事例を見ながら理解を深めていきましょう。
「プログラムを0と1に翻訳する。。」というコンパイラの流れをより具体的に学びます。コンパイラは実際、いくつもの段階に分かれた複雑な作業です。字句解析や構文解析など具体的な役割を深めていきましょう。
『OSはなぜこんなにもモヤモヤしているのか?』について考えてみます。
CPUやメモリと違って、OSは『何か1つこの機能!』と具体的に指し示すことが難しいです。それはOSの発展の歴史と大きく関係があります。
OSはその誕生からCPの効率を追い求めるために生まれました。効率化という目的から、OSはあらゆる役割を担ってきたのです。そのため、効率化のための機能がごちゃ混ぜになっています。そんな時は歴史を学ぶのが1番です。OSが発展してきた歴史を負いながら、その機能を理屈で覚えてしまいましょう。
OSのコンピュータ全体での位置付けを学びます。OSがコンピュータ全体でどの場所にあるかを知ると、その機能の具体的な役割が見えてきます。OSはハードとソフトの間に入って、2つを仲介する働きをしています。「どの場所にあるか?」という位置にも特徴があり、ハードとソフトの橋渡しをする様子をイメージできるようになりましょう。
OSの中でもハードや周辺装置を制御するBIOSについて学びます。BIOSがなかったらどうなるでしょうか。エンジニアは自分で周辺装置の回路図を全て調べて、プログラムを手作りしなければなりません。ハードを制御する裏方であるBIOSについて理解を深めましょう。
コンピュータが起動するまでの流れを学ぶことで、BIOSとOSへの理解を深めます。2つはその起動する順番にも特徴があります。そもそもソフトやアプリは誰が起動してくれるのでしょうか。BIOSはとても小さなプログラムですが、OSは巨大なため自分1人では起動することができません。BIOSやOS、ブートストラップローダの保存場所に注意をしながら、コンピュータが起動するまでの流れを学びましょう。
OSの歴史を学びながら、いかに機能が増えてきたかを学びます。OSは元々、ハードや入出力を管理するために生まれました。面倒なハードの制御部分を担当することでエンジニアが本来の仕事に集中できるようにすることが目的だったのです。しかし機能が増えるに連れて、「コンピュータを効率的に動かす」という役割を担うようになりました。。歴史を追いながら、「なぜOSは巨大化したのか?なぜOSにはそのような機能があるのか?」理解を深めていきましょう。
OSの代表的な機能をお話します。OSはコンピュータを支える土台となるシステムですが、その具体的な役割を知る方は少ないのではないでしょうか。入出力管理、メモリ管理、ファイル管理、マルチタスク、プロセス管理の5つを学びます。まずは概要を抑えてから、後のレクチャーで個々の役割を学んでいきましょう。
OSはハードを制御するとお話しさせて頂きました。そう考えた時に、OSが呼び出す機能は全てシステムコールと呼ぶことができます。メモリ管理もプロセス管理もマルチタスクも、全てハードを制御することでできることだからです。『OSのお陰でハードの機能を利用できる』という仕組みを意識できるようになりましょう。
OSの最も基本となる入出力制御についてお話しさせて頂きます。OSは元々、面倒なハードや周辺装置の手間を省くために生まれました。現代では高速なCPUに処理に対して、動作の遅い周辺装置の制御が1番の課題となりました。バッファやキャッシュなど周辺装置を効率化するための、入出力制御を学びましょう。
メモリ管理の歴史は、効率化を追求する歴史です。限られたメモリをいかに効率よく使うかが永遠のテーマでした。このレクチャーでは、仮想記憶が登場するまでのメモリ管理方法について学びます。メモリ管理の効率化を追求するため、どのような手法が誕生し、そこにはどのような問題点があったのでしょうか。パーティション、動的分割、オーバーレイなど、効率的なメモリ管理を追求してきた歴史を学びましょう。
CPUは1度に1つの処理をすることしかできません。しかし、なぜ複数のプログラムを同時に実行できるのでしょうか。それはOSが高速でプログラムを切り替えてくれているからです。プログラムの切り替えはどのような手順で行われているのでしょうか。複雑なマルチタスクの仕組みを学んでいきましょう。
コンピュータの中身を知らないままプログラムを書いてませんか?
この講座は、コンピュータの仕組みをゼロから理解するためのコースです。
コンピュータ誕生までの歴史、数学と論理学の概念、論理演算、半加算器、全加算器の仕組みCPUの処理の仕組み、メモリとレジスタへの保存方法、OSの歴史と具体的な役割、などを学ぶことができます。
【なぜこのコースを作ったか?】
・「なんとなく」コードを書いているだけで、プログラミングを楽しめなかった
・訳もわからずプログラムを動かしていた
・自分が書いたコードがどう動くのか分からなかった
↑にある私自身の経験から、誰もが自信を持ってコンピュータを操作できる講義を目指しました。
プログラミングの歴史に途中から参加する私たちは、コンピュータの内部構造を知らないままでいます。これまでの過程を全てすっ飛ばして、いきなり難しいことに挑戦しているのと同じです。一方、往年の40、50歳のエンジニアはみな、プログラミングの基礎を学んでいます。そこで若手のエンジニアを対象に、日々の現場では学べない、プログラミングの土台となる知識を学べるコースを作りました。
『なぜ生まれたのか? なぜ必要なのか?』という理由や背景を1つ1つ押さえながら、コンピュータが動く仕組みを学んでいきます。
【このコースの目標】
・アイコンをダブルクリックすれば動く。。?
・CPUはコンピュータの頭脳に当たる装置である。。?
・OSはコンピュータの土台となるソフトである。。?
などのような、モヤモヤとしたイメージを具体的にすることです。
「メモリーにロードされたマシーン語のプログラムがCPUによって解釈、実行され、システム全体の制御やデータの演算が行われる」という、内部の動きを自信を持って説明できるようになることが目標です。
自信を持ってコンピュータを操作して、応用力を身につける土台を身につけて頂きたいと願っています。