プログラミング言語を使用する際には、
■ 組み込み関数
■ 標準ライブラリ
に収録されている関数を使用することになりますが、こうしたものは、学校の一般科目のカリキュラムで登場する者と同じで 【 部品 】 として考えてそれを組み立てていくと処理を考えやすくなります。
プログラミング言語を使用してコンピューターで動作するものを作る場合には、
■ 計算
■ 表示
■ 入力
が必要になりますが、この状態だと 【 問題がある場合にエラーの判定ができない 】 ので、基本となるものとして、
■ 標準入力
■ 標準出力
■ 標準エラー出力
というものが用意されています。現在のコンピューターはマイコン制御のデバイスではありませんから、OSが実装されていて様々な処理はOSが行っています。
その為、マイコンのようにデバイスを使用する際に
■ ライブラリの追加
■ コードによる制御
というものを行う必要はありません。現在の入出力のデバイスは、PnP(プラグアンドプレイ)に対応しているので、ドライバーやユーティリティーなどのインストールが必要なもの以外だとそのまま認識して使用できるようになっています。
認識後にはそのままデバイスを使用できるようになっていますが、
■ ディスプレイ
■ キーボード
■ ポインティングデバイス
などについては、接続すれば認識されるようになっています。また、USBについては、
■ UBSマスストレージクラス
■ USBオーディオクラス
■ USBビデオクラス
などが用意されているので、
■ USB接続のHDDやSSD
■ オーディオインターフェースなど
■ WEBカメラ
については、ドライバーなどを必要とせずそのまま認識させることが出来るようになっています。
その為、PC上でプログラミングを行う場合には、
■ ディスプレイへの表示
■ キーボードでの入力
がサポートされた状態で作業が出来るようになります。このデバイスは、
■ INPUT : キーボード
■ OUTPUT : ディスプレイ
になりますが、この入出力を行うデバイスは INPUT/OUTPUT でまとめることができます。コンピューターでは、この略称としてI/Oと呼びますが、その処理を行うデバイスのことを 【 I/Oデバイス 】 と言います。
I/Oデバイス
C言語では、main関数を実行する際に
【 #include <stdio.h> 】
の記述を行いますが、これはヘッダーファイルの読み込みになります。この内容を見てもらうと 【 std 】【 io 】 なので、スタンダードIOの読み込みという意味になります。
C++もmain関数の中に処理を記述する仕組みになっていますが、C言語同様に最初にI/Oを使用できるようにする必要があるので、
【 #include <iostream> 】
を使用してI/Oの利用が出来るようにします。C言語を拡張したものがC++になりますが、
■ 表示 : std::cout
■ 入力 : std::cin
を使用することでPythonのprint関数やinput関数相当のことができ料になっていますが、行単位で、
■ ストリームの終了 : std::endl
を追加することになります。
C言語では、
■ 表示 : printf
■ 入力 : scanf
を使用しますが、C言語だとシェルのような記述で変数を扱うような仕組みになっていますが、C++だと
■ >>
■ <<
で大将を指定することで、異なる型の変数も連結できるようになっています。その為、初期段階で扱う
文字列と数式と計算結果を組み合わせた表示
のようなものは、
std::cout>>変数>>変数>>変数>>std::endl;
でできてしまうので、文字のコントロールはかなり行いやすくなっています。
C#も記述しやすい仕様になっていますが、コンソールで動くものを作る場合だと、C言語よりも簡素な記述が行えるようになっています。
こうした入出力は、 【 人が操作するのの必要な物 】 になりますが、入出力だけだと
■ 手入力による変数の追加
■ 変数の表示
しかできませんから、
【 定数を入力して定数を表示する 】
という処理しかできません。これだと、黒板や紙媒体と同じなのでメモ帳のような作りにしかなりません。
流石に、テキストエディタを使ってテキストエディタのようなことをこなっても意味がないので、処理を実装するための方法を用いることになります。この時に使用するのが 【 演算処理 】 になります。
PCとパーツ
コンピューターはCPUで処理を行っていますが、ハードウェアの構成として
■ CPU
■ マザーボード
■ メモリー
■ グラフィックボード
■ ストレージデバイス(SSDやHDD)
■ 電源BOX
と言う構成になっており、これがPCの本体の構成になります。ここで演算を行うようになっていますが、この構成に【 基本ソフト(OS) 】をインストールすることで、デバイスの入出力が行えるようになります。その為、上記の環境に対してOSを追加することになりますから、PC単体だと
■ CPU
■ マザーボード
■ メモリー
■ グラフィックボード
■ ストレージデバイス(SSDやHDD)
■ 電源BOX
■ OS
という構成になります。前述のようにI/Oデバイスがないと人が操作することができませんから、ここに
■ 表示
■ 操作
を行うために
■ ディスプレイ
■ キーボード
■ ポインティングデバイス
を追加することになります。と言っても、HDMI端子がついたテレビがあれば現在のPCにはHDMI端子があるので、HDMI経由でテレビのHDMI入力のチャンネルをPCの表示用として使用することができます。
テレビの入力が入ると映像が乱れるというのは
【 1970年代後半〜1980年代辺りのテレビの仕様 】
の話なので、現在のようにアナログサンセット後でアナログ入力そのものが存在しない環境では、この状態は発生しません。
その時代の映像入力は、アンテナ線からの入力を排他利用する仕組みなので、アンテナから直接映像が来る状態ではなく、
【 切替器という電気抵抗になるようなものを仲介させる 】
ような仕組みになっていますから、抵抗の追加分だけアンテナレベルが低下するので画質が落ちるようになっています。当然、こうした仕組みは、
【 2011年以降の地デジへのシフトでなくなっている 】
ので、現在の伝送方法はその時代のものとは全く異なります。
また、【 1990年代の家電はRCAやS端子接続 】 なので、アンテナ線の排他利用というのは前の世紀の段階でなくなっているので、放送の外室に影響を与えるような仕組みは存在していません。また、アナログハイビジョン時代も放送の入力はYCbCr(ARIB表記)の映像信号を送信するのに3本のRCA端子を使用するコンポーネント端子が使用されていますし、20世紀にはD端子の規格も登場しているので、1990年代にはテレビに接続機材を接続する際にアンテナ線の排他利用というものは存在していません。
その為、 【 テレビにデバイスを繋ぐと画質が落ちる 】 ということは20世紀の段階で存在せず、ゲーム機やVTRの接続で画質が落ちるというのは 【 1980年あたりの話 】 なので、半世紀以上前のハードウェアの話になります。
ちなみに、HDMIやUSB Type-Cを使用したThunderBolt準拠の接続をした場合、ケーブル一本で
■ 音声
■ 映像
の出力ができますから、現在の仕様だと
■ コンシューマのdGPU
■ コンシューマのeGPU
■ コンシューマのIGP
の場合、HDMI端子は用意されているので、HDMIケーブルでHDMI端子のあるテレビとPCを接続するだけで
■ 映像の表示
■ 音声出力
ができるようになっています。その為、スピーカーなどを追加しなくても、テレビを使うだけでそうしたことができます。当然、これは、スピーカ付きのディスプレイでも同様のことができますが、マザーボードの機能にはオンボードサウンドが実装されているので、対応したピンジャックにヘッドフォンを刺すだけで音声出力が行えるようになっています。
2000年以降のPCのオーディオ出力はサラウンド対応なので、現在のPCのオンボードサウンドも7.1chを出力できるようになっていますが、映像と音声については、テレビのように映像と音声を出力できるものだと、HDMI接続をするだけで映像と音声の出力が出来るようになっています。
この辺りは、PS3やXbox 360世代のゲーム機で標準機能になっていますが、現在の映像出力についてはそういった仕様になっています。こうした映像出力は、RISCプロセッサを使用したRaspBerry PIシリーズでも同様のことができるようになっていますから、ディスプレイ側に音声出力がある場合にはその表示機材から音を出すことが出来るようになっています。
その為、そういった据え置き式で音声出力がない製品だとディスプレイとヘッドフォンなどを追加することになりますが、音声出力対応の表示機材があり、HDMIケーブルでの接続が可能な場合だと、表示機材だけで音声と映像の出力が出来るようになっています。
マルチメディアファイルを扱う場合だと
■ 表示機材
■ 音響機器
が必要になるので、キーボードとポインティングデバイス以外に揃えるものが増えますが、表示と音声については 【 テレビと言う選択肢もある 】 ので、既にそういった製品がある場合には、テレビのインチ数を使用して表示を行えるようになっています。
その為、こうしたデバイスを用意しておけば、人が使用する上で必要な機能を揃えることができます。
PCの場合、
■ 演算部分
■ 操作に関係する部分
■ 視聴覚で確認する部分
を揃える必要があるので、通常は個別の製品を揃えることになります。
ノートPCやタブレットについては、オールインワンなので、全て揃った状態になっていますが、現在のPCだと、 【 USB Type-C端子による映像出力 】 も可能なので、モバイルモニターなどを使用して表示範囲を広げることができます。また、 【 使っているが表示が小さくて見えにくくなった 】 と言う場合でも、PCの性能がある程度高いという条件がつくものの、HDMI出力がある場合だと、インチ数の大きなHDMI入力対応の表示機材に接続することが出来るようになっています。
この時に
■ ミラー
■ サブディスプレイ
の選択があるので、表示部分をそのまま大きな表示機材(プロジェクターも含みます。)で表示することも可能ですし、PCの画面とは別にもう一つ解像度分のデスクトップの広さを用意して使用することもできます。
また、現在のグラフィックボードは、
【 複数のディスプレイの表示範囲を1つの画面として使用できる 】
ので、ディスプレイアームなどで固定したモニターの表示範囲を一つの画面として扱うこともできます。
これが、 【 周辺機器 】 として用意しておくべき製品になります。
このようにPCの場合、
■ 演算部分
■ 入出力の部分
が存在しますが、コンピューターでプログラミングを行った際にPC本体だけで出来ることは
■ 演算処理
■ BEEP音を鳴らす
のようなことになりますから、実質的にサーバのような挙動歯科実装できません。当然、この状態でコードを書けないので、PC側と接続詞て入出力の処理が行える環境を用意する必要があります。
PCと動作
PCの構造も半導体やコンデンサや抵抗などの集まりなので、基本となるパーツの知識は高校の物理で登場するものになります。電気の流れも含めて、高校の物理では電気工作に必要な基礎知識を学習することができますが、現在はいい時代になっているので、ブレッドボードで回路を汲んで作業が出来るようになっています。これが、1980年代だと基盤にはんだ付けをする必要が合ったので大変な状態になっていましたが、アナログ回路を実際に作って試すと言う作業も行いやすくなっています。
と言っても、電気工作を個人で行う場合には、
■ オシロスコープ
■ テスター
■ はんだ付けに必要な機材
などが必要になりますし、場合によってはヒートガンなども必要になりますから、初期投資費用が結構かかってしまいます。
ブレットボードの場合も上記のものが合ったほうが良いのですが、ブレッドんボードにパーツやジャンパピンを刺して確認できる用になっているので、パーツの特性を知り、回路を考える能力があれば、気軽に回路を組めるようになっています。そして、現在は、こうした回路をワンボードマイコンやシングルボードコンピューターで制御できるのでGPIO端子からくる情報を舞い込んで取得したり、GPIO端子経由で電気工作で作成した回路の制御を出来るようになっています。
こうした回路の制御をする際にはマイコン(マイクロコントローラー)を使用することになりますが、マイコンで制御をする際にもコードを書いて処理を実行することになります。
こうしたマイコン制御ですが、 【 デバイス制御 】 になるので、PCだとマザーボードが行っているような処理になりますが、こうしたデバイスの接続と処理ヲする状態が存在した上にパーツが接続されています。
PCはOSがインストールされていない場合(もしくは、OSの入ったストレージデバイスにアクセスできない場合)には、エラーメッセージが出るので、この状態だとUEFI-BIOS(もしくは、32bitの場合だと、テキストベースのBIOS)にしかアクセスできないのでOSのインストールが必要になりますが、OSのインストール後には、デバイスにアクセスして処理をすることが可能になります。
OSのインストールされている環境だと、ブートローダーでマスターブートレコードを探すことになりますが、これが検知されるとOSが立ち上がります。
その後、構成によって用意されているパーツが使用できるようになるので、入出力のデバイスを使った処理が出来るようになります。
この時に、CPUの仕様が
■ IGPなし : dGPUが必要
■ IGPあり : マザーボードの端子から出力可能
となりますが、IGPの機能のないCPUの場合、
■ NVIDIA
■ AMD
■ Intel
からリリースされている、Pci Express x16バス接続のグラフィックボードを実装する必要があります。
グラフィックボードが正常に動作し、モニターに接続されていれば表示できる状態になっていますから、PC起動時にモニターの電源が入っていれば問題なく表示されますが、この状態にすることでPCでの作業が出来るようになります。
そして、入出力が可能な状態にすることでPCでの作業が可能になるわけですが、OSを使用する場合には、アプリケーション層で動作するアプリケーション(ソフトウェア)の使用することになりますが、コードを書く場合もアプリケーション層で動作する物を使用することになります。
PCと演算処理
PCが処理をする場合には、CPUを使用しますが、マイコンでも
■ I/O
■ メモリー
とのデータのやり取りをCPUが行っています。CPUには
■ メモリーにアクセスする部分
■ 演算処理をする部分
が存在しているのですが、CPUには 【 レジスタ 】 という小さな記憶装置があり、ここにデータを一旦格納してから、メモリーにアクセスする仕様になっています。
コンピューターの動作は通電の有無ですから、二値なので 【 0と1 】 の動作が基本になりますが、この挙動はスイッチと同じなのでトランジスタやタクトスイッチと同じ判定になります。
これを膨大な数用意して、ラッチ回路やフリップフロップ回路を使って保存することで、データの維持ができるようになっています。これがメモリーになりますが、簡素な構造にするとトランジスタにコンデンサを接続詞たような構造になります。
このスイッチと電位を貯める仕組みを使うことで、データの読み書き時計を行っているわけですが、コンピューターの処理は命令セットで決まっているので特定のアドレスにアクセスすると特定の命令を実行できるようになっています。その為、
■ 命令セットを格納したアドレス
■ データを格納するアドレス
は全く別のものになりますが、ここで
■ 処理
■ 使用するデータ
を扱うことになります。当然、これは 【 格納されているもの 】 ですから、データでしか無いので、このデータと処理を呼び出して演算を行い部分のアドレスに送ることで処理の実行が行われます。これが1つのサイクルになっているわけですが、CPUでは、このサイクルを逐次処理で順番に行っています。
この際に、
■ メモリーへのアクセス
■ 処理
■ 処理の更新
と言うサイクルを繋いだものが動いていますが、コンピューターではこの仕組みを二進数で行っています。
当然、スイッチを判定分だけ用意したオルゴールのような構造にすると、膨大な数の0と1の羅列になってしまいますから、コンピューターではそうならないように、
■ データの番地
■ データの内容
で管理するようになっています。前者がメモリーアドレスになりますが、後者のデータは十六進数を使って表記されています。
8bitのデータの場合だと、十六進数の2桁になるので、00〜FFまでを使用しますが、日本で1980年代に普及していた8bitパソコンの場合だと、このデータの状態なので、BASICを常駐させずにMONコマンドでマシン語モニターにアクセスするとメモリーアドレスにあるデータを直接編集できるようになっていました。現在だとバイナリエディタで作業おするような状態と考えることができますが、この状態だと不便なので、レジスタにアクセスしてデータをやり取りする仕組みなどを十六進数ではなく文字数にして使用できるようにしたものがアセンブリ言語になります。このプログラミング言語には関数のような構造はないので、JUMPという特定の場所に飛ぶと言う概念がありますが、BASICのGOTO文が似たような使い方になっています。
現在は、便利な時代になっているので、オンラインでMSX BASICを使用できるようになっているので、
にアクセスるとMSX BASICのコードを書くことができます。
BASICは一行ごとにインタプリタで翻訳をしながら実行する仕様になっているので、ひたすら遅い仕様になっているので、
■ GOSUB〜RETURN〜を使う
■ POKEやPEEKを使う
ことでメインループを軽くしたり、処理そのものを早くする方法がありますが、前者はサブルーチンを使って処理を外に出すことでメインループの文字数を減らしてループ自体を軽くする意味合いがあり、後者は、インタプリタで処理をするよりも高速にするための方法になります。BASICのコマンドにメモリーアドレスへのアクセスを行う仕様が存在するので、当時のBASICマニュアルにもメモリーアドレスについての表記が行われています。
ローレベルの処理になると、レジスタと処理の流れになるので、アセンブリや機械語を使った処理の実装になってきますが、アーキテクチャ依存がありますが、現在もASMを使うとアセンブリのコードを書いて実行できるので、ローレベルのコーディングを行う方法は存在しています。
計算やハードウェアの制御についてはCPUの依存度が高いので、CPUが遅いと全体的に遅くなりますが、特定の処理だけCPUが行っており、GPUの依存度が高いゲームのような処理だと、シェーダーによる表示品質や解像度を下げるとCPUのグレードを落としても動作する場合があります。
基本的にゲームにおけるCPU依存度の低さは特殊な事例だと思ったほうが良いので、基本的にはCPUの性能をある程度担保しておかないと全体的なパフォーマンスが下がります。また、ゲームの場合もGPU性能を上げても、古いCPUだとCPUやバス幅がボトルネックになるので、速度が出ないので、全体的なバランスを取る必要があります。
グラフィックボードは20世紀にも存在していましたが、初期のものはラスターグラフィックの表示用のものになっていました。その後、20世紀末にGPUが登場しますが、1990年代には3DCGのツールが存在していたので、極当たり前のように3DCGを行うための製品がリリースされていました。処理の方法を高速化する方法の中にパイプライン処理というのがありますが、初期のグラフィックボードはこれで制御されていましたが、その後、プログラマブルシェーダーが登場することで、シェーダーをコードで制御できるようになります。
Direcr-X8(MikuMikuDanceで使用されているものよりも古いバージョン)だとシェーダーの制御にアセンブリ言語を使う必要が合ったので、アセンブリの知識はこの時代でも使用されていましたが、その後は高水準言語でも制御できるようになっています。と言っても、現在のシェーダーはローレベル制御もできる(のと、昔のシェーダーの制御方法と現在のものは異なります。)ので、色々な選択肢がありますが、表示についても20世紀と現在では全く異なります。また、21世紀になってハッシュ値のような使い捨てをするデータだったり、簡素な演算をシェーダーを使って処理をするGPUコンピューティングやGPGPUと言う処理が登場しますが、この時代からGPUで演算をすると言う方法が登場します。現在では映像や3DCGを扱う時に使用するCUDAなどもこうした処理の一つになりますが、GPUを使った処理も時代とともに変わってきます。そして、このシェーダーを使っていた処理も現在ではNPUなどに置き換わっているので、AI専用のコアを実装した製品も登場しています。
CPUについては、2005年以降にSMT対応のプロセッサが登場してから、スレッドを使った処理を個人でも利用できるようになりますが、その後はメニーコアに推移していくので、20世紀には技術的に存在していた仮想化を個人レベルでも使用できるようになります。VMWAREは20世紀から存在していますから、そういった仮想環境を使った処理も出来るようになっていますが、個人向けのPCのコアは1コアの状態ですから、Socket 478の最後のリリースの製品となるPrescottコアのPentium 4 3.xEGHzのシリーズからSMTを使用した2スレッドが利用できるようになります。
当然、こうした作業は 【 フォアグラウンドとバックグラウンドを使う 】 ような作業でなければ意味がないので、
■ レンダリング+作業
のような演算処理をバックグラウンドで行いながら、フォアグラウンドで別の作業をするような使い方をしなければなんの意味もありませんから、現在では極当たり前に行うこうした作業ができるようになったのもこれ以降になります。
CPUも今後の製品はNPU実装のものが増えるので、AI関連の処理はこれからのCPUは高速になっていくようですが、現状に置いての性能を見るとやはり、CPUの内臓機能よりもグラフィックボードの実装機能のほうが高速に機能するようです。過去のアーキテクチャと比較すると対CPUでは高速になっていますが、同時期のアーキテクチャのGPUと比較するとGPUを使ったほうが高速になるようです。
今後の流れとしては、
【 クラウドベースではなく、オフラインでも推論できる 】
というようなソリューションになるようなので、そういったAPIも提供され始めていますしアプリケーションを開発する場合のチャットボットのようなものについてもオフラインで処理できるものが作れるようになっています。
また、今後の流れから考えると、こうしたアプリケーションが高速になるので、OS上で動くエージェントサービスのようなものがより一層賢くなり速度的にもある程度見込めるような状態になるのではないかなと思います。
実際に、どの程度の重さのものまで出来るのかは実装されたものが登場しないと判りませんし、実際に作ってみないと解らない部分はありますが、パーツの仕様や流れからするとそのような方向で推移しています。
演算というとゲームのように膨大な演算が生じるソフトウェアも存在しますが、この分野では軽量化をするアプローチが増えています。NVIDIAとAMDの双方でアップスケーリング技術を提供していますが、当初はアップスケーリングだけだったDLSSもフレーム保間技術を実装しているので、フレームレートが高くなる仕様になっています。AMDは提供している複数の機能を同時に使用できるSUPER RXと言う機能が使用できるようになっていますが、この機能を使うことでアップスケーリングと同時にフレームレートを向上させることが出来るようになっています。
AMDのアーキテクチャは次世代ゲーム機の候補となっていますが、この内容はZEN5などを使うようなことが言われているので、この流れで考えると、
■ RTXに依存しないレイトレーシング
■ アップスケーリング+フレーム保管
と言う機能も実装されるのではないかな?と思います。アーキテクチャが新しくなると実装機能も増えるので、当然のようにこうした機能もつかえるようになるのではないかな?と思います。
その為、実装されるアーキテクチャが新しくなれば、使用できる機能も増えるので、フレームレートの高い処理も可能になります。
AMD関連だと組み込み用のRyzen Embedded 8000シリーズが発表となっていますが、デスクトップだけではなく別の用途の製品元上しています。
データと記録
データの記録を刷る場合には、主記憶装置二データをストックして処理を刷ることになります。ちなみに、
速い ■ 命令処理
▼ ■ レジスタ
▼ ■ L1キャッシュ
▼ ■ L2キャッシュ
▼ ■ L3キャッシュ
▼ ■ メモリー
▼ ■ SSD
遅い ■ HDD
のようになっています。命令の実行とL1の遅延は殆どないのですが、
■ L1 < 分岐予測修正 < L2
■ L2 < 排他制御< L3
のように処理の種類によってはキャッシュメモリーの書き込みよりも時間がかかるものもあります。
この記憶装置ですが、
【 主記憶装置 】
DDR4/DDR5などを使用した物理メモリー領域
(DRAM)
【 補助記憶装置 】
SSDなどのストレージ
(NANDフラッシュメモリー)
HDD
(磁気記録)
光学メディア
(ピットの状態の読み込み)
になります。キャッシュメモリーやマイコンに実装されている区画ではSRAMなどが使用されていますが、こうした製品は速度が速い代わりに大容量化が難しいものになっています。と言っても、近年ではL3だけでなく、L2も拡張した製品が登城していますが、基本的に、記憶する場所は
■ 主記憶装置
になっていますが、この区画は揮発性があるのでデータの保存ができないので、ファイルの形で保存する場合には、補助記憶装置を使う事になります。
CPUに実装されているキャッシュメモリーは前述のように高速に機能するため、一時的にデータを記録しておいて高速に呼び出せるようにするための区画になります。
プログラミング言語を使用してコードを書く場合、OSの機能やシェルコマンドを使わない限りはファイル操作などができませから、そういったコードを書かない場合だと、処理の内容はメモリー内に記憶されたデータと処理を使って動作しています。
ファイルの保存をしていない状態は、Pythonを対話モードで使っているような状態ですから、記述を間違うだけでそれまでに記述した内容は消えてしまいますから、打ち込み直す必要があります。
その為、対話型でコードを打ち込むとかなり慎重作業をするようになりますが、流石に、この状態だと無理があるので、通常はテキストエディタでフェイルを作成して補助記憶装置内にデータを保存してから実行すると言う流れになります。サーバOSのようなCUI環境だとVIを使うことになりますし、GUI閑居づ後任意のエディタを使ったり、GUI部分の作業を行う際には、WYSWYGで作業が出来るツールを使うことになります。
コードを書いて処理を刷る場合には、必ず
■ 処理
■ データ
が存在するわけですが、この際に、特定のメモリーアドレスにデータ画家苦情されて実行される仕組みになっています。ScratchやMAKECODEの場合だと確認のしようがありませんが、Pythonの場合だと、idで確認できるので、どのアドレスに記録されているのかを知ることができます。C言語やC++の場合だと学習時の最初の鬼門になりそうな 【 ポインタ 】 でアドレスとデータの内容が登場しますが、
■ アドレス
■ データ
を管理する際にポインタを使うことが出来るので、揮発性のある 【 主記憶装置内の情報 】 を取得することが出来るようになっています。
基本的にコンピューターを遣う場合、
■ 作 業 : 主記記憶装置
■ データの保存 : 補助記憶装置
を使用しているので簡素なコードを使う場合だと、
■ コードの実行 : 主記憶装置
■ コードの保存 : 補助記憶装置
で行うことになります。
データの転送速度ですが、
【 同じインターネットデータセンターのホストにpingする 】
時の往復時の時間が0.5ms位になりますが、この時間は、
【 SSDから1MBの連続データを読み込む 】
時の時間の半分になります。つまり、こうした小さなデータをSSDから読み込む際にはPINGの往復に近い速度がでているわけですが、この速度も
【 メモリから1MBの連続データを読み込む 】
時の速度の倍の時間がかかります。このようにネットワークを使用するとハードウェア内の速度よりも遅くなる傾向があります。同じPingの往復でも、同じネットワークと外部ネットワークでは異なるので、
【 違う都道府県のホストにpingする(往復) 】
を行った場合、同じインターネットデータのセンターのホストにpingする往復時の時間の300倍の時間を要することになります。ちなに、この時間は、
【 ハードディスクから1MBの連続データを読み込む 】
時の時間の7.5倍に相当します。HDDは速度が遅いと言われていますが、ネットワーク上の処理と比較すると条件によっては高速になる場合もあります。ちなみに、4KBのランダムリードだと1GbpsのLANでbの取るネックがでないようにしたほうが高速になる場合もありますが、用途によって速度は結構異なります。とは言っても、こうしたCPUから遠いデバイスは、CPUに包含されているものよりも低速になるのでキャッシュメモリーや処理よりも低速になる傾向があります。
ただし例外もあり、コンテキストスイッチのようにメモリーへのアクセスよりも遅くなる処理も存在します。
【 コンテキストスイッチ 】
コンピュータの処理装置(CPU)が現在実行している処理の流れ
(プロセス、スレッド)を一時停止し、別のものに切り替えて
実行を再開すること。
コーディング
コードを書く場合には、
■ 処理
■ データ
が存在していますが、処理はデータがないと行えないので、事前に使用するものを用意する必要があります。この辺りは、日常生活と同じですが、
■ 使用する道具の入った道具箱
■ 材料
がなければ作業ができません。当然、作業を刷る人の知識や能力ありきの話になりますが、形にする場合には少なくとも前述の2つは必要になります。
プログラミング言語でもこの仕様になっているので、使うものを異様する必要がありますが、前述のものだと
■ ライブラリなど
■ 変数など
がそれに該当します。プログラミング言語も数式と同じように
■ 値
■ 処理
ながければ結果を求めることができないので、
■ 値 : 変数や定数
■ 処理 : 関数
を使用することになります。この関数ですが、前述のC言語やC++のようにヘッダーやストリームを呼び出さないと駄目な場合もあるので、コードを書く前に使用するものを呼び出す必要があります。この時に
■ ライブラリ
■ モジュール
■ メソッド
などを使用しますが、基本的にこうした構造物は
■ 外部のクラス
■ 外部の関数
がまとまったものになります。ちなみに、Pythonの名称を付ける時の仕様として、
■ 関 数 : 小文字を使う
■ クラス : 大文字で始まる形にする
ようになっています。Pythonの場合だと標準ライブラリを使う際にimportを行ってコードを書くことになりますが、JAVAのように関数だけでなくクラスを作る仕様のものもあるので、プログラミング言語によって用意するものが違ってきます。コードの記述ですが、
【 C言語/C++ 】
main関数という最初に実行するものを用意して
その中に処理を実装する
【 JAVA 】
アクセス修飾子などを用意してアクセスの制約
まで指定した上で、クラスを用意して、その中
に実装した関数に処理を実装する
と言う違いがあります。Pythonの場合だと、
【 Python 】
標準ライブラリなど、外部の物を使用しない場
合だと、組み込み関数をそのまま記述すること
が出来る
と言う仕様になっています。この辺りはスクリプト言語がそういった仕様になっていますが、JavaScriptも特にライブラリの読み込みの記述もなく処理を実装できる仕様になっています。
コードを書く場合、プログラミング言語によって使用が異なりますが、
■ ライブラリの読み込みの有無
■ クラスの実装の有無
■ 関数の実装の有無
などに着目すると 【 最小単位の記述の構成 】 を理解できるようになっています。
これが、【 構造 】 になりますが、組み込み関数のように最初から使用できるものを使う場合、使用できるものの多くは 【 関数 】 の形をしているので、
■ 処理の記述
■ 処理で使用する値
を用いることになります。これは、 【 F(x)=変数xの関数 】 の構造と同じなので、
■ 処理の内容
■ 処理で使用する変数の値
が必要になります。この時のf(1)のように代入する値をそのまま関数に記述しても良いのですが、プログラミング言語の関数では、 【 関数(引数) 】 の形で処理を実行するので、
■ 関数の内容
■ 引数
を用意することになります。Pythonのptint関数の場合だと、
print(引数)
のようになっていますが、これをユーザーが作る場合だと、defで宣言します。関数を使用する際には、
【 関数の実装 】
def 関数名(引数):
処理
return 戻り値
【 関数の実行 】
関数名(引数)
のようにしますが、
■ 引 数 : 関数内で使用する値
■ 戻り値 : 関数の内の値を出力するための値
になります。その為、
■ 入力 : 引数
■ 出力 : 戻り値
と言う形で値の流れを作ることになりますが、関数の場合、input関数のように
変数名 = input(引数)
のような形で値を代入して使用することになるので、
変数名 = 関数名(引数)
と言う形で値を代入して、計算や表示に使用することになります。この時の引数ですが、前述のようなinput関数を使用することもできますし、最初に初期化を刷ることも可能なので、
■ 変数の宣言
■ 引数を引数に代入
ということもできます。Pythonは関数やクラスを最初から用意しなくても動作しますが、処理を塊で管理したい場合には関数を使用します。また、関数と変数をまとめて管理する場合にはクラスを使用しますが、クラスを使用すると
■ 実体の生成と破棄
■ 別のクラスから値の参照を刷る
■ クラス同士の関連付けで制御する
ということが出来るようになります。クラスの場合、初期化やループをクラスの機能だけで実装可能で、イニシャライズも複数実装できるので、スイッチのような機能も用意されています。
その為、クラスを使うと少しコードの書き方が変わってきますが、クラスの場合、オブジェクトを基準としてその関係性で動作を考えていくことになりますが、このプログラミングの手法のことを 【 オブジェクト指向 】 と言います。
このコードの書き方を刷る場合、フローチャートだとわかりにくくなるので、UMLの使い方を覚えたほうがコードの仕組みを考えやすくなります。UMLについては部分的に情報IIで登場しますが、クラスの関係性などは登場しないので、クラス図のようにコードを書く時に必要になる部分は別途学習する必要があります。クラス図の場合
┏━━━━━━━━━━┓
┃ クラス名 ┃
┣━━━━━━━━━━┫
┃ クラス変数 ┃
┃ ┃
┃ ・ ┃
┃ ・ ┃
┃ ┃
┣━━━━━━━━━━┫
┃ インスタンス変数 ┃
┃ ┃
┃ ・ ┃
┃ ・ ┃
┃ ┃
┣━━━━━━━━━━┫
┃ メソッド ┃
┃ ┃
┃ ・ ┃
┃ ・ ┃
┃ ┃
┗━━━━━━━━━━┛
のような構造のものを用意します。これが処理を実装したクラスになりますが、関数の場合だと、
┏━━━━━━━━━┓
┃ 関数名 ┃
┣━━━━━━━━━┫
┃ 処 理 ┃
┃ ┃
┃ ・ ┃
┃ ・ ┃
┃ ┃
┗━━━━━━━━━┛
になりますが、クラスの場合だと、
■ クラス変数
■ インスタンス変数
■ メソッド
のように変数と処理を格納した形になりますが、この構造を作ってクラス同士の関係性を考えていくことになります。