プログラミング教育もスタートしており、情報Iも一般科目化しているので極当たり前にコーディングを行うことがご強化と同じように行う時代になりました。
そもそもコーディング自体がハードウェアの制御を行うコントローラー部分の処理を担うものですから、多bit化したパラレルな配線の塊をシリアル通信で簡素に処理をする方法であったり、回路の構築ではサイズが巨大になり消費電力が増える状態になる状態を回避するための手段としてマイクロコンピューターを使って処理をする(ASICやFPGAを使う方法もあります。)時にコードを書いて処理をすることになります。ちなみに、マイクロコンピューターはマイコンの略称で呼ばれていますが、こうした物を使うことで複雑な処理を少電力且つ、省スペースで実装することが出来るようになっています。
これが、ハードウェア寄りの処理をする際に行うプログラミングになりますが、MakeCodeでブロックを使って処理を実装する場合も、ハードウェアにコードを送って制御をする仕組みになっていますから、ローレベル(ハードウェアとソフトウェアまでの階層でみた時にハードウェア寄りの階層にあるもの)の制御をするものになっています。
パーソナルコンピューターとは異なり、ロボットやデバイスの制御をする場合には、コントローラーにつながったセンサーや出力を行うパーツの制御をコードで行う必要がありますから、それを行うためのライブラリの開発をする必要がありますが、パーソナルコンピューターの場合だと、OSが実装されているので、ドライバーの開発を行えば、デバイスの認識後の制御はOS側で制御できるようになっています。
パーソナル・コンピューターはPCの略称で親しまれていますが、PCを使用したコーディングは、PCでのソフトウェアの挙動を扱うものですから、
■ 入力デバイス
・ キーボード
・ ポインティングデバイス
■ 出力デバイス
・ モニター
・ スピーカー
が認識され、それが動作する条件で作業を始めることになります。その上で、このデバイスを使った挙動をコードで制御することになりますが、これを制御をするライブラリが存在するので、コードを書くだけでそれが動く仕組みになっています。これがPCでの作業になりますが、これをマイコンで行う場合だと、各々のパーツの制御を行うライブラリを使用してコードを書くことになりますから、 【 コード自体が肥大化する 】 ことになります。
その為、マイコンの場合だと、パーツごとに
■ 制御用のライブラリ
■ 実際の動作をさせるコード
が必要になります。プログラミングを行う場合、PCでの作業になりますから、PC上でのアプリケーションの開発のイメージが強いかも知れませんが、実際にはOS上で動いているものの開発ですから、データ管理やマルチメディア関連の処理のように演算の総数が多く負荷の高い処理をする物を扱うためのものになります。
PCでの処理は、ソフトウェアのレイヤーでの動作になりますから、ローレベルのコーディングをしない場合だと 【 物理層 】 を扱うような事はありませんが、USBの向こう側の制御のようなハードウェア寄りの開発となると、ソフトウェアの動作しているアプリケーション層とは異なる知識になりますから、プログラミング言語の学習とアプリケーションそうで動作するソフトウェアの開発とは異なる知識が必要になります。
現在は、
■ OS上で動作するソフトウェア
■ マイコンに寄る挙動
の双方を体験しながら学習できるようになっているので、PCと周辺機器の違いなども知ることが出来るようになっていますが、PCで動作するもののコーディングはOS上で動作するアプリケーション
の開発と同じで、マイコンを使ったものは、単体で動作するハードウェアの開発で必要なものになります。これを任意のプロトコルでPCとデータ通信をすると周辺機器として使用することができます。現在のプログラミング教育では、この2つを体験できるようになっています。
マイコンや教育用のロボットでは、 【 コードを送る 】 という処理が生じるのですが、マイコン制御が行われているものについては、OSが存在せず、
■ ブートローダー
■ ファームウェア
しか存在しません。その為、ここにコードを送ることでそのコードを実行することになりますが、マイコンでもリアルタイムOSを使用できるので、カーネルのある状態で動作させることも出来ます。
PCは、カーネルという処理を行う基本部分が存在していて、ここで、アプリケーションとハードウェエアの架け橋の役割をになっているわけですが、この部分に簡単にアクセスできると問題があるので、シェルを介して制御をする仕組みになっています。この時にBASHやZSHなどのシェルコマンドを使って制御をすることになりますが、これが、カーネルとシェルの仕組みになります。
PCの場合、
■ ハードウェア
■ ソフトウェア
が存在しますが、OS上で動作したソフトウェアの挙動は入出力が行われるので
■ ハードウェアからの入力
■ ハードウェアからの出力
が発生します。プログラミング言語で Hello,World! を表示するコードを書いて実行した場合、モニターにコンソールが表示されてコンソール内に文字列が表示されますが、これは、モニター出力というハードウェアの出力結果になります。
現在のPCでは、表示をする際にはグラフィックボードが表示をになっているので、それを仲介して表示をこおなっています。20世紀は表示用のデバイスだったのでビデオカードとも呼ばれていましたが、現在はグラフィックライブラリを使用してグラフィックの表示を行うパーツになっていますからグラフィックカードと言う名称になっています。このボードからの映像出力の結果がモニターに反映されているわけですが、その中のコンソールの立ち上げとその中での表示が行われているので、この結果に至っているわけです。
GUIプログラミングを行った際のイベントハンドラやコンソールアプリの開発時に使用できるinputなどを使用した場合、 【 デバイス側からの入力 】 になりますが、現在の汎用バスはUSBですから、USB経由での入力を受け付けて、その結果を入力した値を取得していることになります。この値を取得して処理に反映させているわけですが、アプリケーションの動作は、デバイスの入出力が行われているので、状態の確認が行えるようになっているわけです。
PCでのプログラミングでは、この入出力の変化を扱うことになりますが、入力デバイスはスイッチと同じでオンとオフがありますし、表示は状態変化が生じるので、この制御を行う際には状態変化に対応する必要がありますから、 【 変数 】 を用意して制御することになります。
プログラミング言語では、
■ 標準入力
■ 標準出力
■ 標準エラー出力
が用意されているのですが、Pythonでも標準ライブラリのsysライブラリにこの3つのメソッドが用意されています。stdin/stdour/stderrがそれに該当しますが、stdoutはモニター出力を扱うものになっていますから、printと同様に表示が行えるものになており、stdinはreadlineやreadで文字列を扱えるようになっています。この記述の仕様はC#のコンソールでの入力やSmallBASICの記述でもそういった仕様になっていますが、文字列の取得で使用できます。stderrは通常のプロセスとエラーを分けるために用意されています。
コンピューターと処理
コンピュターの処理ですが、前述のように表示はグラフィックボードがになっているのですが、全般的な処理はCPU(中央処理装置)が行っています。また、データや処理を行うコードはメモリーに格納されているので、PCUとメモリー間での処理が多く発生します。その為、
■ CPU
■ メモリー
の間でのやり取りが基本になります。ただし、これは内部処理の話ですから、人が操作したり状態の確認をする場合にはI/Oデバイスが必要になりますから、I/Oデバイスとのデータのやり取りが必要になります。その為、
■ CPU
■ I/O
間でも表示や入力の処理を行う為にデータの通信が行われています。この双方をプログラミング言語を使って制御することになりますが、コードを実行する際には、
■ 処理
■ データ
がメモリーに格納されます。それらは記録時に決まったメモリーアドレスに保存されるのですが、これを読み込んで実行することになります。これが演算処理だと内部処理ですから、変数の格納されたアドレスから変数の型で指定した容量分だけ区画が用意されて、その中に存在するリテラル(変数の値)が記録されるわけですが、この時の処理が算術演算子を用いた計算ということになります。
これが、入出力のない内部処理での挙動になります。
これに対し、pirntやstdoutを使用した表示を行う場合にはモニターへの表示が発生するので、I/Oデバイスとのやり取りが発生します。
表示同様にinputを使用した場合のキーボードの入力やGUIプログラミングで使用できるイベントハンドラを使用した入力についてもI/Oデバイスとのやり取りが生じているのでデータの入力が生じていることになります。
このようにコンピューターでは
■ CPU
■ メモリー
■ I/Oデバイス
のデータの相互通信が行われる仕組みになっていますが、PCとマイコンの双方でこの処理で動く仕組みになっています。
記憶装置
コンピューターはデータや処理を記憶して実行する仕組みになっていますが、この時異使用するのがメモリーになります。PCの場合だと物理メモリー療育になりますから、速度の出るDRAMが使用されています。このDRAMは、データが消える特性があるので、揮発性のあるストレージになりますが、変数については、
■ プログラムの終了
■ OSの終了
■ PCの電源を切る
とデータが消えます。これが、1970〜1980年代のゲームと同じ仕様になっていますが、ゲーム機にはデータの記録装置が存在しないので、メモリー内でデータをストックするだけで、電源を切るとデータが消失する仕組みになっていました。PCの場合、ゲームの用のデータが消えていると作業にならないので、データを保存する仕組みが存在していますから、PCゲームはデータの記録が出来るようになっていましたが、こうしたデータが消えない不揮発性のストレージを使用することで記憶したデータを再利用したり、中断した作業を再開できるようになっています。
現在のストレージだとSSDが主流ですが、数十TBのような巨大なデータを扱う場合だと、現在でもHDDのほうがコストパフォーマンスが高かったりします。速度を求める場合にはSSDの一択になりますが、速度を求めず容量が必要な条件だとHDDを使うという選択肢もあります。
SSDでは、DRAMではなく、NANDフラッシュメモリーが使用されていますが、これはフラッシュメモリーなので、メモリーカード等と同じ方式のものになります。
こうした記憶装置ですが、揮発性と不揮発性の2種類がありますが、これらは
■ 主記憶装置 : メモリー
■ 補助記憶装置 : SSDやHDD
に分類することが出来ます。こうした記憶装置にはDVD-RやBD-REなどもありますが、こうした高額メディアも物理メモリー領域ではないので補助記憶装置になります。
PCの場合、OSが立ち上がって動作する仕組みになっていますが、これは、マイコンと同じでブートローダーでブートを行っているのでOSが立ち上がる仕組みになっています。
ブートローダーやOSは補助記憶装置に記録されていますが、OSをブートすることで起動後に立ち上がり、OSが使用できるようになっています。
これが、WINDOWSやMACのように購入後にそのまま立ち上がるOSの仕組みになりますが、Linuxの場合だと、補助記憶装置からのブート以外にUSBや光学メディアからブートさせる方法もあります。その為、メモリーカードからブートすることも出来ますが、このようなメディアを作ることが出来るようになっています。
メモリーカードからのブートは、Raspberry PIがそういった仕様になっていますが、BIOSで知っていしたデバイスから順番にブート可能か確認してMBRが存在した場合にブートをすると言う仕組みになっています。
グラフィックボード
グラフィックボードは20世紀だと表示機材でしたが、3DCGが扱えるようになってからはグラフィックを扱うボードになります。その為、シェーダーを使った処理なども可能になりますが、20世紀だと画像を作る場合だとある程度品質を出す方法は存在していましたが、ゲームの場合だとシェーダーを使用できない状態でしたから、かなり厳しい状態になっていました。その為、過去と現在を比較するとグラフィックの品質が全く異なるわけですが、この辺りは、演算能力の差だけではなく、 【 使用できるシェーダーのバージョンの違い 】 も関係しています。
21世紀になってノーマルマップに寄る表現やPBRによる質感お指定ができるようになりま菅、その後、POMなどを使った立体表現も可能になります。また、LODやテッセレーションなどを使った距離の変化によるディテールの変化を扱うこともできるようになっていますが、こうした処理も演算性能ありきの話ですから、速度がおそすぎる過去のハードウェアでは使用できない処理になります。
シェーダーについては、GLSLやHGSLなどのシェーダーランゲージがありますが、グラフィックボードにはサポートしているライブラリが存在しているので、対応したものであれば使用できます。現在だと
■ WINDOWS : DirectX 12 Ultimate
■ MAC : Metal
■ Linux : Vulcan
になっていますが、こうしたライブラリを使う場合にはグラフィックボード側が対応している必要があります。その為、古い製品だと非対応になっています。また、Open-CLやOpen-GLについてもバージョンが存在しているので、バージョンが古いと使用できない機能なども存在します。この辺りも、グラフィクbノードで対応したバージョンが異なるので古くなるほど表現力が少なくなりますし、使用できるバージョンも古くなります。