高校のカリキュラムでは 【 情報I 】 が必修科目になっていますが、この中では、ネットリテラシーやプログラミングなどを行います。情報IIでは、UMLやAI関連についても学習しますが、情報Iについては、今年の4月から3年生になる人がスタート段階から学習していることになるので、今年の4月から大学2年生の人だと高校の時に選択科目として選択できる状態になっていました。
その為、それよりも上の年齢の人だと高校で情報Iを学習していませんし、教育制度改革前なので、小学校で英語のスピーチなどが存在している状態はあったとは思いますが、高学年で一般科目のような五段階評価ではありませんし、小学校三年生から五教科の状態ではないはずなので、少し条件が違っています。また中学校でフローチャートを学習したり、 【 箱ひげ図 】 などを学んでいないと思うので、教育制度改革前だと色々と学習していない内容が多く存在します。
基本的に、情報Iの内容は 【 何もない状態からのスタート 】 なので、独学でコードを書く始める状態と比較するとかなり難易度は低いのですが、基本的なコードの書き方が 【 手続き型 】 ですから、Pythonのコードを見て理解する場合には、知識の拡張が必要になります。
現在のプログラミング言語はオブジェクト指向ですから、手続き型で使用している
■ 変数
■ 関数
を一つの塊にして管理できる 【 クラス 】 を使用することになりますが、最初にイニシャライズを行って、使用できる変数を格納できる仕様書を作ったあとに、その変数を使って動く関数を実装します。これがクラスで指定できる構造になりますが、この時のイニシャライズを行う変数と関数では少し特殊な記述を行うことになります。
この時のクラス内で指定した変数と関数は、
■ メンバ変数
■ メンバ関数
のような名称で記述されていることがありますが、これは使用するプログラミング言語で異なるもののクラスの構造自体は変わらないので、呼び名が異なるだけです。その為、
■ クラス変数
■ メソッド
担っている場合もありますが、基本的に
■ 実態で使用する変数
■ 実態で実行する関数
を示したものになります。当然、クラスには引数があるので、関数と同様に引数を参照して動作する仕組みになっているわけですが、インスタンスを生成することで
【 インスタンス名をつけて値を管理できる 】
ようになります。この時にインスタンス名とメソッド名で処理を実行できるので、同じ処理を異なる値を用いて行う場合にもインスタンス名で管理できるようになります。
また、クラスは関数同様に外部ファイルで読み込むことが出来るので、ファイルを分けて処理を管理することが出来るようになっています。
オブジェクト指向では 【 クラス 】 の関連性で処理を行えるようになているのですが、インストラクターとデストラクターによる処理や継承などのクラス同士の関連性で処理を構築することになります。
この基本的な考え方を 【 情報II 】 で学習することになりますが、UMLを用いて考えると、アプリケーションを 【 視点の違い 】 から理解できるのでコードに入る前の仕様の整理ができるようになっているわけですが、この時に実装するクラスについても 【 クラス図 】 が用意されているので、クラスに実装するメンバ変数やメンバ関数を実装して形を作ることが出来ます。
現在はJRE(JAVAのランタイム)のインストールが必要ですが、クラス図を書いたあとにメンバ関数などの記述を行ってコードに出来るツールも用意されているので、クラス図を書くだけでコードを作れるものもあります。こうしたツールは2000年代には既に存在していたのですが、現在ではVisualStudioCodeの拡張機能でも使用できるようになっています。
クラス図は結構複雑な仕様になっているのですが、使用できるようになるとオブジェクト指向のコードを考えやすくなります。
ただし、難易度が高いので情報Iではフローチャートを使った物が登場するようになっています。
一般科目との連携
情報Iは主にコンピューターを使う場合の知識を身につけるものになっていますが、コンピューター自体が装置の中のコントローラー部分に該当するので、この処理の方法をコードで扱うことになります。
コンピューターはコントローラー部分なので、入出力を行うI/Oがなければ操作が出来ません。当然、これはマイコン制御を行う際でも同じですが、人が操作をする際には
■ 操作
■ 表示
が必要になるので、このデバイスを追加します。ワンボードマイコンでは、これを簡素な状態で実装することになるので、
■ 操作 : タクトスイッチ
■ 表示 : LED
で実装されていますが、基本的に二値の値で動作するものを使用して入出力と結果の変化をコードで制御する仕組みになっています。
これよりも複雑なことが出来るものに
■ Arduino
■ micro:bit
■ M5STACK
■ Raspberry Pi Pico
などがありますが、現在はドットマトリックスLEDだけでなくLCDを実装してある製品もあります。基本的にマイコンの場合だとGPIO経由でデータ通信を行いますが、シリアル通信のできるL2Cを実装したものもあります。
マイコンの実装機能だけでも色々出来ますが、この製品はコントローラーなので、センサーやアクチュエーターのを使用することになりますから、GPIO経由でパーツを接続することになります。この時のアクチュエーター部分で電気工作を行うことになります。
コントローラー部分はアナログ回路と同じ処理を省電力且つ、省スペースで実装する手段になりますが、基本的な処理の考え方はアナログ回路と同じになります。
その為、アナログ回路で行うような考え方がそのままコードでも登場するわけですが、この時に使用するのが 【 二値論理 】 になります。
電気の場合、 【 通電の有無 】 が存在するので
■ 0 : 遮断
■ 1 : 通電
で考えることが出来るので、数値の判定をする際に吸う直線上で唯一単一の値で誤差がでないものが0なので、最初に0の判定を行い 【 遮断の状態 】 を検知します。
この逆の状態が通電ですから、この時の判定に階調を持たせることで電圧の差を検知することが出来るようになります。
高校の物理では、電圧のことを 【 電位差 】 と言いますが、これは、 電位の位置エネルギーの差 になります。
電位差が生じた際には電流が流れますが、高校の数学ではこの 【 電位差 】 と言う概念から電流の流れを考えることになります。また、閉回路で簡素なものだと中学校の物理で学習するオームの法則だけでも対応できますが、実際の流れは 【 キルヒホッフの法則 】 に用いて導き出すので、中学校では電流の流れがわからないような回路の構造も高校のカリキュラムで理解できるようになります。
高校の物理では、【 半導体 】 を扱うので
■ ダイオード
■ トランジスタ
についても学習しますが、この中のトランジスタが電流で回路の切り替えが可能な仕様になっているので、 【 回路内でスイッチの役割をするパーツ 】 になっています。
集積回路では通常のトランジスタの使い方を行うと抵抗まみれになるので放熱と消費電力が肥大化するので、これを回避するためにMOS構造にして使用していますが、MOS構造のFETなのでMOS-FETと言う名称になっています。
また、大きな電圧に対応したトランジスタもありますが、こうした製品はトランジスタ自体が熱を持つので大きなヒートシンクが付属しています。
パワー半導体のカテゴリーにもこうした製品は含まれていますが、PCのマザーボード上にあるチップセットのような冷却が行われているものもあります。流石にGEN5対応のNVMe SSDのような物は存在していませんが、こうした製品を使用することで電流の制御(なので、実質的には電位差の変化)で動作する仕組みになっています。
この電流の変化はコンパレーターで判定を実装できるので、状態を作ってコンパレーターで判定を行って回路内のスイッチを動かして回路の切り替えを行うことが出来るようになっています。
物理では、スイッチの変化を扱う部品や電気の流れなどを扱いますが、トランジスタは組み合わせるとNAND回路を作る事が出来るので、論理演算による判定を実装することが出来るようになっています。
論理演算は 【 集合と論理 】 で登場しますが、この判定は集合演算のような全体集合の中の構成要素や部分集合で判定を入れて 【 条件抽出 】 を行うのと同じ考え方になりますが、論理演算は、二値論理を使うので、【 複数の条件で判定を入れた際の結果 】 を扱います。
論理演算
論理については、
■ 入力 : 2
■ 出力 : 1
の構造になっていますが、基本的な構造は小学校の理科で登場した
■ 直流
■ 交流
の仕組みと同じです。このカリキュラムでは、
■ 電 池 : 2つ
■ 豆電球 : 1つ
という状態ですから、先程の条件と全く同じものになります。この際に、直流と交流を用いたものを使用することになりますが、
■ 電池の有無
■ 電球の点灯の有無
に着目すると 【 真理値表 】 を作ることが出来ます。この時に
■ 直流 : 論理積
■ 交流 : 論理和
と同じ状態になるので、これらは、論理ゲートの物理モデルと同じ構造になっていることが分かります。また、電池で通電する状態にして、電池を使用していた場所をスイッチに入れ替えると、回路の構造が直列回路と並列回路になりますが、これらも構造的には同じなので、
■ 直列回路 : 論理積
■ 並列回路 : 論理和
のような論理ゲートとして機能します。このスイッチの部分をトランジスタに置き換えると回路内で動作するようになるので、論理ゲートを回路内に実装することが出来るようになります。論理回路はロジックICの形で販売されていますが、こうしたパーツもMOS-FETが用いられています。
論理ゲートは、電気の分野だと 【 ド・モルガンの法則 】 によって
■ 論理積 : AND
■ 論理和 : OR
■ 論理否定 : NOT
の3つの判定を組み合わせればすべての判定を作れる訳ですが、人の思考を二値の状態まで細分化した際に同様の判定が行えることを証明した 【 ブール代数 】 を機械に適応したものがこれになります。
この 【 2入力・1出力 】 という構造は、アプリケーションだとレイヤーの処理だったり、ノードの処理などでも同じ考え方になっていますが、論理演算では複数の結果の組み合わせを使用して判定の結果によって通電の有無をコントロールする仕様になっています。
その為、論理ゲートを実装すると回路内に条件分岐を実装することが出来ますが、電気工作では航した処理をする回路としてロジックICを使用しますが、このパーツにもMOS-FETが使用されています。トランジスタの論理ゲートについては、
の中で触れていますが、物理で扱うパーツだけでも論理ゲートの基本となる3つのパーツを作ることが出来ます。
論理ゲートは、二値論理で動作しているので、オンとオフで動作するもので使用することが出来ます。その為、マインクラフトのサバイバルモードでも使用できるレッドストーン回路でも同じ方法で制御を行うことが出来るようになっています。論理ゲートについては、
の中で使用していますが、この判定をプログラミングでも使用することが出来るようになっています。論理演算は判定の仕様を覚えると心理値表の値の変化だけで判定を理解できます。
論理ゲートですが、基本的は前述の3つを組み合わせて使用することになりますが、回路を動作させる時にも判定で使用することになります。これについては、
の中でも触れていますが、論理ゲートの組み合わせでORではなく、【 二者択一 】 の選択をする回路を作ることも出来ます。
データについて
判定の最小単位はスイッチになりますが、この0と1の判定をするデータの最小単位を 【 bit(ビット) 】 と言いますが、コンピューターのデータはこれを8つ集めて8bitにしたものを使用しています。
このデータを記録すると0か1の情報を記録できますが、コンピューターでは、これを8つを1まとめにした状態で運用しています。この8bitがひとまとまりになったものの単位が 【 Byte(バイト) 】 と言いますが、ストレージの容量などはこの単位が使用されています。
これは、【 0000 0000 】 〜 【 1111 1111 】 の範囲を扱ったものになりますが、十六進数の1桁は4bitなので、十六進数に置き換えると2桁のデータをひとまとまりにしたものになります。十六進数は0〜15までの数値を使ったものになりますが、文字は1つしか格納できないので、10以上のものを扱う為にA〜Fの文字が使用されています。その為、十六進数では、 【 0 〜 F 】 を用います。
データでは、これを2桁分使用するので 【 00〜FF 】 の範囲を使用することになります。
これを十進数に変換すると 【 0 〜 255 】 の値を格納することが出来ます。これが十進数を使用した際に利用できる容量の範囲になります。
十六進数は15までの数値を格納できますから、範囲指定を行うと 【 0 〜 9 】 の値の格納が出来るので、二進数の形で 【 0000 】 〜 【 1001 】 を使用すると前述の数値を再現することが出来ます。その為、4Byteの構造物を複数並べることで十進数の桁を増やすことが出来ます。この状態にすると、二進数の計算が行えるようになるわけですが、1bitのデータ同士の加算を行うと数値が変化しますから、加算の結果を記録することで十進数の数値の変化を扱うことが出来るようになります。
1bitのデータだと、
■ 1の桁
■ 繰り上がった桁
を扱うことになりますが、桁が繰り上がらない状態は、
■ 0 1
■ 1 0
の組み合わせですから、これはXORゲートで判定を行うことが出来ます。これに対して桁の繰り上がりは
■ 1 1
のみですから、この条件はANDゲートの挙動になります。その為、この2つの論理ゲートを組み合わせることで、二進数の加算の処理を行うことが出来るようになっています。
この回路を 【 半加算器(HA) 】 と言いますが、ここに繰り上がりの情報を追加して判定を行う回路を使うことで上の桁の判定を行うことが出来ます。この繰り上がりに対応した加算器のことを 【 全加算器(FA) 】 と言います。
高校の情報Iでは、 【 補数 】 が登場しますが、この値は 【 二進数の減算処理 】 でも使用します。
機械の場合だと二進数では使えませんから、入出力のI/O部分で十進数にする必要がありますから、それぞれに
■ 入力 : 十進数 → 二進数変換
■ 表示 : 二進数 → 十進数変換
を行うことになります。
乗除算
二進数の乗除算については、
■ 乗算 : 加算のループ処理
■ 除算 : 減算のループ処理
で行います。乗算は回数指定型ループで、除算は、減算ができなくなるまで行って、その減算の回数をカウントすることで商を求める仕様になっています。
これが、加算器ベースの計算機になりますが、二進数は、桁の移動で乗除算ができるので、双方向シフトレジスター回路を使うことでも演算が出来ます。
このシフトの概念はプログラミング言語でも存在していますが、桁の増減をコントロールする際に使用する機能になります。
情報Iでは、データの容量と桁溢れについて学習しますが、プログラミング言語では、 【 型ごとにデータの容量が指定されている 】 ので、表示できる桁数が決まっています。
最新のPythonの場合だとInt型が物凄く巨大な桁を扱えるようになっているので、整数だと文字列型のような桁数を扱えてしまうわけですが、浮動小数点型の場合だと、桁数が決まっています。その為、数値を表示する仮部の桁を超えた場合、その値に対して 【 10のn乗 】 をかけ合わせた表記になります。そ
の為、桁数を超えると 【 数値 × e^10のn乗 】 のような表記になります。
桁の考え方ですが、床関数のような桁を切り落とした状態になる桁落ちもありますが、このような桁の変化を二進数に対して行うことが出来ます。これが 【 シフト 】 の処理になります。
シフトの処理は
■ 右シフト : 桁の減少
■ 左シフト : 桁の増加
が発生しますが、この処理を二値で行う場合には双方向シフトレジスター回路を使うことになります。
メモリー
データの格納はメモリーで行いますが、メモリーにはメモリーアドレスが存在するので、メモリーアドレスとデータを紐付けて記録することになります。
マイコンでも
■ メモリー
■ I/O
とのデータのやり取りを刷る仕組みになっていますから、最初にCPU経由でレジスタを通してからアドレスが開放されたあとにデータがそのアドレスに格納される仕組みになっています。
このようにCPU(中央演算装置)経由でデータの読み書きや通信を行うようになっていますが、データを格納する際に使用するメモリーは電位を貯めるので、簡素な構造にするとトランジスタとコンデンサを組み合わせたものになります。
現在は、メモリーもストレージにも使用されているのですが、マイコンではマスクROMやSRAMのように読み書きできるものが存在しています。これを分別すると
■ メモリー : DRAM
■ ストレージ : NANDメモリー
になりますが、NAND以外だと容量が小さく目的が異なる方式のものも存在しています。
メモリーは揮発性メモリーなので、一時保存を行う記録領域になりますから、速度は速いのですが通電しなくなるとデータが消えます。
メモリーは通電しているとデータの維持ができるのですが、この機能を使ったものが、ファミコンのバッテリーバックアップ機能のあるROMなどになります。これが登場する前までは周辺機器が必要でしたが、揮発性のメモリー内で変数の格納を行う(この時代のゲームはアセンブラで開発されています。その為、機械語と1対1でやり取りが出来るような記述でコードが作成されています。)ような仕組みのハードでもデータの保持が出来るようになっています。それ以前は、解析しにくいパスワードの形で文字列を出力してそれを物理的に記録して再開する時に打ち込む方法でしたが、
【 写し間違うと全てが消える 】
という恐ろしい仕組みになっていました。SSDのように不揮発性のストレージはデータの保持が出来るので、メモリー内に格納している変数やコードのようなテキストを記録することが出来るようになっています。
ちなみに、HDDは時期記録で金属のプラッタに記録する仕様になっています。
情報Iとプログラミング言語
情報Iの教科書は色々ありますが、教科書によってプログラミング言語が異なるようです。教科書によって
■ Python
■ Python + JavaScript
■ Python + Scratch 3.0
■ VBA
のようなものになっているようです。なので、すべての教科書が同じ状態ではないので、使用している教科書で使用するプログラミング言語や教科書の特性が異なるようです。
JavaScriptは、コンソールで動作させるとPythonのinput関数相当のものがないので、ブラウザ上で動作するコードを書くことになりますが、Pythonも使用するものが異なるようです。
Scratchはそのままですが、VBAはオフィースソフトのマクロなので、オフィースソフトがなければ動作しませんし、MACやLinuxだと動きません。
コードと構造
義務教育だとScratch 3.0にふれることになると思いますが、このときも基本的な処理の実装方法は同じなので、
【 必要なものは用意しておく 】
ことになります。Scratchも関数を作れるので、
■ 変数
■ 関数
を先に用意しておいて、その参照をするブロックを使って制御することが出来ます。
関数のイメージは完全に 【 合成関数 】 で使用する記述なので、
■ f(x)=x
■ f(1)
のような条歌いになっています。これが
■ 処理の実装 : f(x)=x
■ 処理の実行 : f(1)
というイメージで使用する形になっているので、情報Iのコードを見た場合も同様の処理になっていると思います。
Pythonの関数は 【 処理の塊 】 なので、これを使ってコードを簡素化する事が出来るのですが、この仕様になっているので
【 メインループに関数を配置する 】
だけで処理を実装できる仕様になっています。
その為、基本となる
■ 順次
■ 反復
■ 分岐
の使い方を覚えたあとは 【 処理 】 の単位で1つの塊にして管理を行う方法を学習することになります。ちなみに、
■ Python : def
■ JavaScript : function
で指定することになりますが、処理の塊を1つのブロックの中に記述を刷ることで制御をすることになります。
ちなみにプログラミング言語の変数は、中学校1年生の数学で登場する 【 変数項 】 と全く同じ考え方になりますし、ループ処理は乗算や累乗などに見られる繰り返しになります。判定を入れる際にはifを使用しますが、この際に使用する判定も
■ 等式・不等式
■ 論理演算
などになりますから、基本的には数学の知識を用いたものになります。
ちなみに、PythonとScratchは実行環境で動作するのですが、JavaScriptはWEBブラウザ上で動作するような仕様になっています。
ScratchとJavaScriptは、グラフィックを使用できるので、この環境では
■ フロントエンド
■ バックエンド
の2つを使ったアプリケーションを作ることになります。
Pythonのmatplotlibはグラフの部分がウィジェットでの表示になっているのでこの処理もフロントエンド+バックエンドで動作しているのですが、コンソールの処理だとバックエンドで動作するコードの記述になります。
当然、自動処理だと入力による反応がわかりませんから、それに対処するために組み込み関数でinput関数が用意されているのですが、tkinterなどのウィジェット環境を使う際には、変数の値による変化などをウィジェット側と連動させて使用するコードを書くことになります。
この作りはJavaScriptでも同じなので、基本的にウィジェット側で指定したIDを使用してgetElementByID()でIDと紐付けをして表示や処理を行う仕様になっています。
イベントハンドラの場合だと、getEventListener()を使用しますが、PythonだとTkinterや外部ライブラリでウィジェットを使用する場合も同様の考え方でコードを仕上げていくことになります。
Pythonをそのまま使うとコンソールアプリしか作れませんが、フロントエンド部分を動かす処理はバックエンドの処理になるので基本的な考え方はコンソールでの処理になります。
この時の
■ input関数
■ print関数
のような入出力の部分をウィジェットと連動させるようなコードに仕上げることでデスクトップアプリを作ることが出来るようになっています。その為、基礎学習はコンソールになっていますが、Pythonをそのままインストールした場合でも
■ ウィジェット環境
■ サウンド
■ ファイル操作
は可能なので、アプリケーションを作るための基本的な機能は揃っています。
ただし、標準ライブラリだと速度がでないものについては外部ライブラリを使用することになるので、コーディングを行う選択肢として外部ライブラリのインストールを行い、その後、ライブラリを 【 import 】 を使用して読み込んで使用することになります。
多分、情報Iでは使わないと思いますが、Pythonにはvenvと言う機能があり、仮想環境を使用することでPython環境を分けて管理することが出来ます。
その為、ライブラリまみれにならないようにコードで使用するライブラリのみをコーディングを行う仮想環境にインストールして使用することが出来ます。