プログラミング教育もスタートしており、情報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は通常のプロセスとエラーを分けるために用意されています。

 

 ちなみに、inputとstdinだとデータ数が多い処理を行った場合には2倍程度の速度差が出るので同じ処理をする場合だとstdinのほうが高速になります。

 

 
 PCでプログラミング言語を使う場合にはアプリケーションの開発になりますから、基本的には接続されて認識されている入出力の行えるデバイスを使った処理を実装することになります。
 
 この入出力はInputとOutputですからI/Oと呼びますが、このデバイスのことをI/Oデバイスと呼びます。C言語では、この入出力を標準ライブラリの 【 stdio.h 】 ヘッダファイルを呼び出して行うことになります。これはSTANDARD IOの意味ですが、標準有力や標準出力をする際に使用するものになります。

 

 

  コンピューターと処理

 

 コンピュターの処理ですが、前述のように表示はグラフィックボードがになっているのですが、全般的な処理は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ノードで対応したバージョンが異なるので古くなるほど表現力が少なくなりますし、使用できるバージョンも古くなります。

 

 21世紀になってからは、シェーダーユニットを使って演算処理を行うGPUコンピューティングも登場し、GPUレンダリングも可能になりましたが、こうした演算機能は別のコアで処理をするような仕様に変わっています。CUDAコアの登場後はそういった処理が行われるようになっていますが、現在は、AIの分野でも硬貨を発揮するコアなどを使って処理が行えるようになっています。

 

 グラフィックボードの機能として、動画再生時のCPUの負荷を下げる機能があるので、現在はグラフィックボードでサポートしているコーディックに関してはデコード時のfps数が出やすくなっています。また、映像の状態をコントロールする機能もありますが、サポートされているコーディックは世代が古くなるほど少なくなるので、H.265やAV1などをサポートする製品は特定のアーキテクチャ以降の物になります。動画関連ではエンコードのサポートもしているものもありますが、こうした機能も世代が古くなるほどサポートされている機能が少なくなります。

 

 
 アーキテクチャが新しくなるほど速度は向上していますが、個人が導入する場合だと、
 
  ■ Geforce x60シリーズ以上
  ■ RADEON RX x600シリーズ以上
 
になります。ちなみに、RTX 4060の評判が悪いのはx16ではなくx8動作というのがありますが、バスの世代が古いユーザーの買い換えようとだとこのx8というのはかなり響いてくるのでそうした部分も含めて速度を求めるユーザーは見送っているようです。
 
 近年は使用するレーン数が少ないGPUがでているので注意が必要ですが、RTX 4060Tiも含めて少電力なのは魅力的なんですが、レーン数がx8なので、PCI Expressバスの世代がが1世代下がるだけで、ゲーム性能などが結構下がるので、古いアーキテクチャでのGPUの入れ替えで考えると、古いGPUよりは性能が高いもののバスの新しい環境では計測されたベンチマークテストの結果よりもfps数は落ち込むので注意が必要です。RADEONもバス幅が狭い製品があるので、古いアーキテクチャだと結構厳しいのですが、GEN2を使っているユーザーだとこれから先はこうしたx8の製品はベンチマークテストの結果よりも相当低いスコアになります。
 
 ちなみに、来年以降はマザーボードでサポートするメモリーはDDR5のみ(DDR4は現行のもののみに対応という形になります。)になり、PCI ExpressバスはGEN5がスタンダードになるので、マザーボードで使用するパーツの仕様が少し変わります。DDR5は現在はDDR4と併売されていますから次世代というよりも 【 高すぎて売れてなかっただけ 】 ですから、製品自体は流通しています。バス幅が上がることでNVMe SSDも高速化しそうですが、NVMe SSDもバスの世代が上がる度にどんどんヒートシンクが凄いことになっているのですが、GEN7までは規格が策定されてるので、動画制作でのボトルネックは今後はどんどん解消されていくのではないかなと思います。
 
 次世代の包装規格の草案を見るとストリーミングでの4Kがかなり軽量に行えそうなコーディックの内容もでていますが、8KもUHD-DVDの100Mbps位に収めて収録できそうな状態なので、8Kについても今後は光学メディアに記録して保存するというの特殊なことではなくなるのかも知れません。ただし、デコードではなく制作で考えると音のチャンネル数や映像の品質を高くする必要がありますから、ストレージの速度は必須となるので、SSD単体の速度が向上するメリットは大きいように感じます。当然、GPU性能が上がれば3DCGや映像分野絵も恩恵を受けることが出来ますから、高品質なものを作るとしても現在よりも短時間でレンダリングが出来るようになります。

 

 

  オンボード機能

 
 コンピューターの構成を考える場合、マイコンに対して何が付属しているのか?を考えると、外部パーツを導き出すことが出来るのですが、処理をするには、人が操作したり、見て解る状態にしなければなりませんからI/Oデバイスが必要になります。
 
 その為、構成としては、
 
  ■ CPU
  ■ メモリー(揮発性のストレージ)
  ■ I/Oデバイス
 
が必要になります。PCの場合、パーツの接続やデバイスの制御をするチップなどがマザーボードに実装されているので、
 
  ■ CPU
  ■ マザーボード
 
の構成にして、マザーボードに対してパーツを追加する仕様になっています。この時に
 
  ■ 主記憶装置(メモリー)
  ■ 補助記憶装置(SSDやHDD)
  ■ グラフィックボード
  ■ サウンドカード
  ■ LANボード
 
などをついあKすることになります。この時に電力供給をする必要があるのですが、ケースにしまわないとむき出しの状態になりますから、
 
  ■ PCケース
  ■ 電源BOX
 
を用意することになります。これでPCの本体部分が揃うわけですが、この状態だと表示も入力も出来ませんから、
 
  ■ モニター
  ■ キーボード
  ■ ポインティングデバイス
 
を揃えることにアンリます。また、サウンドボードは音を出力するだけなので、アンプと同じ仕様になっていますから、出力するものが必要になります。その為、
 
  ■ ヘッドフォン
  ■ スピーカー
 
などを用意する必要があります。この状態にすることで、
 
  ■ 文字の入力
  ■ カーソルの移動
  ■ 表示
  ■ 音声出力
 
ができるようになります。ちなみに、マザーボードにはブザーがあるので、ブザーをコントロールSることで音を荒らすことも出来ます。この辺りはマイコン制御で音を鳴らすのと同じですが、通常のPCでもブザーの制御が出来ます。基本的に、
 
  ■ PCパーツ : PC本体を構成するもの
  ■ 周辺機器 : PC本体以外の製品
 
になりますからPCを組む場合には本体が動く状態にするためのパーツを選択することになります。この組み合わせがBTOの場合自由に変更できるようになっているわけですが、デスクトップ製品でもいくつかのパーツが汎用ババスでの接続ではなく、マザーボードから利用できる仕様のものもあります。こうしたものは 【 その機能がオンボードで使用できるようになっている 】 ので、パーツの追加の必要がないのですが、現在はオンボードグラフィックなどはCPUに包含されているので、CPUの内臓機能やマザーボードに実装されたチップで制御されているものがあります。オンボードの機能だと
 
  ■ オンボードグラフィック(IGP)
  ■ オンボードサウンド
  ■ オンボードLAN(NIC)
 
などがありますが、IGPが実装されたCPU構成だとマザーボードのディスプレイ用のポートからディスプレイに映像を出力できますが、IGPのないCPUの場合、別途PCI Express x16バス接続のグラフィックボードを追加する必要があります。
 
 グラフィックボードに見られるようにオンボードの機能は性能が低いので、重たい処理をする場合には専用のパーツを追加することになりますが、サウンドやグラフィックの品質を求めない場合だとオンボードでそこそこ速度の出るものを選んでおくという方法もあります。STBのような使い方だとデコード性能などを求めるような用途になりますから、必要な機能があり、それが意図した性能が出雨量な講師絵になるものを探すことになります。制作用途だとオンボードだと出来ないことが多いので、基本的に必要なパーツを別途追加することになりますが、
 
  ■ ディスクリートGPU(PCI Express x16接続)
  ■ オーディオインターフェース
を用意して、必要な色を使用できるディスプレイや求める音質と周波数帯域をカバーしたヘッドフォンやスピーカーを用意することになります。
 
 LANの場合、仮想化などを使う場合だと、2つ以上のRJ-45端子があったほうがいいのですが、オンボードだと1Gbpsなので、それよりも高速な物を使用してネットワークを組む場合だとLANボードを新規に追加することになります。
 
 用途によってはオンボード機能だけで動作させる事も出来ますが、高付加な処理になると専用のパーツが必要になるので、目的によってパーツの構成が変わってきます。