- 前ページ
- 次ページ
現在はプログラミング教育も始まっているので、学校教育でもコンピューターに振れる機械が増えています。それ以上のボリュームで英語教育が拡充されているので、現在は、小学校三年生から英語がスタートしています。
高校では情報Iが必修科目化されているので、プログラミングを行う事になりますが、枠は少ないものの義務教育でも一般科目と連動してコンピューターとプログラミングを使った学習を行うようになっています。
このように、現在では、プログラミングを行うことが至極当然のように行われているわけけですが、今回もプログラミングについて書こうかなと思います。
プログラミング言語
プログラミングは 【 処理の流れを指定する方法 】 になりますが、人が何かを行う場合には、 【 アルゴリズム 】 を構築して対応しますが、コンピューターではそれが判りません。コンピューターは制御を担う部分ですが、ここで行っているのは、スイッチのオンとオフであり、膨大な数の二値の変化とその記憶と消去を行っているので、ヒトの言葉では通じませんし、UMLやフローチャートが分かるわけでもありません。その為、伝達をするには、仲介するものが必要になるので、それを用いて、コンピューターに行ってもらいたい処理を伝達することになります。この時に使用するのが、プログラミング言語になります。
プログラミング言語も二進数を十六進数にしてメモリーアドレスの最初の場所から記録する事で動作させる仕組みになっていますが、この
■ メモリーアドレス
■ データ
と言う構造だと数値の並びで全く意味が通じないので、この法則性を覚えて記述をシていくことになります。これが、機械語になりますが、これでは敷居が高いので、処理の内容を少し明確にして、容量を消費しないようにしたものがアセンブリ言語になります。Fortrunなどが普及する前までは、アセンブリを使用する流れになっていますが、この時の制御方法を用いたホビー向け製品だとマイコンになるので、マイコン制御をアセンブリで行う仕組みになっています。
学研の大人の科学でもマイコンがリリースされていましたが、
でもアセンブリ言語による制御になっています。この言語は、レジスタに何を行うのかを指定するような作りなので、マイコンのCPUの処理の仕組みを理解しないと処理の内容が全くわからないので、高水準言語を覚えるような流れで学習するよりもローレベルの処理の内容を学習してそれと併用したほうが理解がしやすくなっています。
この言語の後にFortrunなどの高水準言語が登場しますが、
コレ以降は、人がコードの記述を見た際に何をシているのかがある程度判断できるようなものが増えることになります。
当然、この記述を行ったテキストファイルが実行できるわけではありませんから、機械語に翻訳する必要があります。この時に使用するのがコンパイラやリンカになりますが、コードを機械語に翻訳して実行ファイルにする処理のことをビルドと言います。
その後、近年になってデータセンターのような大規模な処理で使用される事例もでてきたHascelなどの関数型言語も登場しますが、数MHzのクロックのCPUでコレを処理するのは無理があるので、殆ど普及しませんでした。
1970年代に入門用のプログラミング言語のBASICが登場しますが、これは、コードを実行するインタプリタがあり、このインタプリタを使用して、
【 上から順番に1行ずつ翻訳する 】
ような仕組みになっています。この構造から、コードが長くなると遅くなると言う特徴があるので、BASICには色々な工夫がされています。例えば、
■ GOTOで飛ぶ
なども一つの方法ですが、データをそのまま読み込むと遅いので、 【 メモリーアドレスに直接アクセスする 】 ということが出来るようになっていました。これが、
■ POKE
■ PEEK
になりますが、VRAMの特定のアドレスにアクセスするだけで文字が表示されるなど面白い仕様になっていますが、コレを使用すると英文字の表示でも樹六進数なのでコードをいただけだと解読不能にできるようになっていました。
また、現在の関数を不便にしたような
■ サブルーチン
もあるので、
■ メインルーチン
■ サブルーチン
で分けることで、メインルーチンの記述の量を少なくして軽くすることが出来るようによなっていました。
BASICの特徴として、1行ずつ上から実行すると言う特性がありますが、メインルーチンにメインループを実装して、処理を全て詰め込んでしまうとコードが肥大化するだけで重たくなります。
その為、現在のforやwhileで使用するcontinueのような意味合いでGOTOでメインループの先頭に戻ったり、コードの末尾から先頭に戻るようにしてループを作る方法がありました。
ただし、構造を考えた時に、
■ IFで実行される処理
については、メインループの中に書く必要はなさそうなので、これは、 【 分岐後に呼び出せばいい 】 ので、サブルーチンにすることが出来ます。このようにすることで、少し複雑な処理が発生する分岐後の処理についてもメインルーチンの文字数の増加を抑えて実装することが出来るようになっています。
この考え方は、現在のプログラミング言語でも使用できますが、Pythonだと
■ 関数の利用
■ モジュールの利用
を行うことで、一つのPythonファイルの文字数を少なくすることが出来ます。
こうした肥大化の回避は、C言語でも行えるのですが、C言語では、
■ main関数以外の関数の利用
■ ヘッダーファイルの作成
で対応できるようになっています。Pythonのモジュールのように外部に関数などを配置しして読めるようにしたものがヘッダーファイルになりますが、プログラミング言語にはコードの肥大化を抑える方法が色々と備わっています。
ちなみに、マイクロソフトの製品だと、教育用にMS-DOSがオープンソースになっており、MS DOSにバンドルされていたGW-BASICもオープンソースになっています。
GW-BASICは、MS BASICをベースにして作られたものになりますが、このMS BASICもオープンソースになっています。
学校教育で使用するのは高水準言語なので、ASEMなどを使用する機会はないと思いますが、
【 義務教育 】
■ ブロックを使った物
(Scratchなど)
【 高校 】
■ Python
■ VBA
■ JavaScript
を扱うことになると思いますが、使用するものがAnacondaの場合だと、
■ Visuela Studio
■ Visuela Studio Code
では少し違うので注意が必要です。多分、condaでライブラリを追加して、作業を進めたり、コーディングはSpyderで行うと思いますが、上記の環境だと、LinuxでPythonを使うのと同じようにpipを使用することになるので、condaで管理をシている環境だとpipを使用しませんから作業の流れが変わっ
てきます。
Pythonについては、現在の最新版のマイクロソフトオフィーズでは 【 Pythonでマクロを書ける 】 ようになっているので、自動処理や処理の実装をする場合にPythonの処理の作り方を使って、 【 外部ライブラリを使うときのようにソフトで使用できる機能を使う為の書式を使う 】 ことで処理の実装が出来るようになっています。
この辺りは、ゲームエンジンでゲーム制作をする場合も全く同じですが、C++やC#が使用できる環境だと、クラスや処理部分の実装時の記述がプログラミング言語の仕様になっており、実装時の膨大な数の記述の方法については外部ライブラリの利用と同じものと考えることが出来ます。
これが、 【 ソフトをスクリプトで管理する 】 場合にも発生しますが、おぢーすソフトのスクリプトも同じ考え方にになります。
情報Iでは、Pythonのライブラリを使用することになりますが、この際に、importを行い、
■ 標準ライブラリ
■ 組み込み関数
にはない記述を行うことになると思います。これが、ゲームエンジンなどで使用する記述と同じ状態になります。
また、Python対応のソフトはOSSだけでなく市販のツールでも多く存在していますから、スクリプトを書いて制御できる仕組みになっています。
VBA
Linux環境だと、
■ Python
■ JavaScript
は最初から使用できるようになっていますが、VBAは使用できないので、これはマイクロソフトオフィースでなければ使用できません。
VBAは、Visual Basic for Applicationsの略称になりますが、元になっているのは20世紀に登場したVisual Basicになります。
VIsual BASICは、デスクトップアプリを作成できる等号開発環境になっていますが、現在の.NETとは異なる仕組みなので初期の製品は仕様が異なります。
インタネットエクスプローラーの時代だと、VBSをスクリプトとして使用可能になっていましたが、これもVisual BASICの記述が基本になっています。
Linux環境だと、
■ Python
■ JavaScript
は最初から使用できるようになっていますが、VBAは使用できないので、これはマイクロソフトオフィースでなければ使用できません。
VBAは、Visual Basic for Applicationsの略称になりますが、元になっているのは20世紀に登場したVisual Basicになります。
VIsual BASICは、デスクトップアプリを作成できる等号開発環境になっていますが、現在の.NETとは異なる仕組みなので初期の製品は仕様が異なります。
インタネットエクスプローラーの時代だと、VBSをスクリプトとして使用可能になっていましたが、これもVisual BASICの記述が基本になっています。
名称はBASICですが、1980年台のBASICの時代にはウィジェットでの管理法保法がないので、8bitパソコンの時代のBASICとは記述と管理方法が異なります。
VisualBASICは、現在のVisualStudioと同じように
■ コンソールアプリ
■ フォームアプリ
の作成ができる仕様になっています。その為、
■ ウィジェットを使った画面の構築
■ コードによる制御
が必要になるので管理方法が異なります。そのため、変数を用意して
【 変数をオブジェクトとして考えた場合 】
だとコンソールアプリの場合、
■ inputによる入力
■ printによる出力
が行えますが、これも
■ 変数の入力をinputで行う
■ 変数の格納
■ 変数の出力をprintで行う
という流れになっています。この流れを、デスクトップアプリの場合は、ウィジェットで行うことになるので、組み込み関数だけでは上記の処理を行うことができません。
その為、
■ ウィジェットの配置
■ レイアウト
■ 変数のやりとり
■ イベントハンドラの設定
などが必要になるわけですが、上記の組み込み関数レベルの処理だと一文字入力を用意すると入力自体をキープスなどのイベントハンドラとして扱うことができるので、イベントハンドラの結果をコンソール上の表示に反映させることができるようになっています。つまり、コンソールアプリだと、cursesを使った場合も含めてコンソール上だけの出来事で完結するのでバックエンドで行っている内容をそのまま組み込み関数のようなもので処理をすることができます。
BASICの場合は、実装されているコマンドになりますが、これを使用するにしても
■ スクリーン
■ 文字列
の区別はできrので、スクリーン上でグラフィックを作って、コンソールのような処理は文字列の方を使用することになります。つまり、アスキーアートとフィルとストロークのような処理は異なる画面で処理をするようになっていますが、8bitパソコンの時代にはウィジェットの概念がないので、PythonでTkinterを使用したり、JavaでJET FXを使用するような処理の方法は存在しません。現在は、JavaScriptだとどの環境でも動作しますが、フォームアプリを作る際にはHTMLでフォームを生成することになりますが、こういったウィジェットをレイアウトして、そのウィジェットの値の変化やイベントハンドラでの値の取得という概念がありません。イベントハンドラだとINKEY$やINKEYで文字や数字を取得する(ので、方という概念で変数を区別するのではなく、【 $ 】 の有無で文字と数字の区別するようになっています。)ような方法はありますが、コンソールアプリで表示をする際の配列の位置関係がウィジェットになっているようないめーじになります。
また、マウスがない時代だとポインチヒングデバイスの座標の取得という概念やクリックイベントも存在しなのでいろいろと違います。
最も異なるのは、
sub プロシージャ名():
処理
end sub
function プロシージャ名():
処理
end function
のような記述です。BASICの場合、
10 'テスト
20
30 A=1
40 B=1
50 print="A+b"
のような感じの記述になりますが、VisualBASICは関数やサブルーチン単位で分けてあるので、昔のプログラミング言語だとFortrunのような記述になっています。
どのあたりが、BASICなのか?というと
【 処理の中で使用する記述がBASIC 】
なので、コードを見ればBASICで見覚えのある物が登場してきますが、基本的に書式そのものが違います。
また、処理を実装する際も 【 結構長い記述になっている 】 ので、難しい仕様になっています。と言ってもこのあたりは、JavaScriptの 【 処理の階層 】 のようなものなので、覚えてしまえばしその処理はツリー構成になっていて、特定のカテゴリーで分類されたものとわかりますが、BASICのように簡素な記述物しか知らない場合、多分驚くと思います。このあたりは、ゲームで使用するグラフィックライブラリもクラスで管理されているので、記述が少し複雑になっていますが、ゲームエンジンでC++でコードを書く場合にDirect Xを使用する場合には結構長い記述になっていると思います。このあたりは、C++のような構造になっているので、先にC++を学習するとシェーダーの記述などもC++に似せてあるので覚えやすいのですが、Visual BASICはBASICという名称ですが、BASICとは異なり、関数を使った場合には別の言語の構造になります。また、処理単位で別けて管理できるという 【 わかりやすい作りにできる 】 というメリットもありますが、8bitパソコンの時代のBASICとは異なります。
VBAはマイクロソフトオフィースでコードで処理を実装する際に使用するものになりますが、
■ マクロ : 操作の登録
■ VBA : コードでの自動処理
という違いがあります。VBAの構造ですが、多分、関数を使用できるプログラミング言語を扱うと混乱はしないともいますが、C言語のように
int main(vold)
{
printf("Hello,World!");
return 0;
}
のような構造を見慣れていると
sub c1()
range(A1) = "Hello VBA!"
End sub
のような仕組みも同じ構造なので、理解しやすいと思います。関数の場合だと、
Function func1()
MsgBox "Hello VBA!"
End Function
のようになりますが、この場合、ウィジェットの指定ができます。ただし、戻り値の記述が少し特殊で
Function プロシージャ名() As 戻り値のデータ型
プロシージャ名 = 戻り値
End Function
のような形になっているので、
Function func1() As String
Func1 = "Hello VBA!"
End Function
のような形になります。これを呼び出す際には、
【 戻り値なし 】
Call Functionプロシージャ名()
でように出せます。戻り値がある場合だと、
【 戻り値あり 】
Dim オブジェクト名 As 戻り値のデータ型
オブジェクト名 = プロシージャ名()
のような工程をを 【 処理の中に実装する 】 必要があります。これは、
■ 変数の宣言
■ 変数に関数の代入をする
という処理になりますから、Pythonのinput関数で行う処理と似ていますが、関数内での使用になるので、この場合はローカル変数を使用することになりますから
■ 変数の宣言
■ 関数を使った初期化
を行うことになります。
C言語やC++の場合だと、 【 型 変数名 】 で宣言を行いますが、VBAでの変数の宣言は
【 変数名 As 型 】
のようになります。その為、Pythonで
def f(a,x,b):
y=a*x+b
return y
z=f(3,10,9)
のようなコードを書いた場合、そのまま引数を参照し得関数が代入され変数zに戻り値が送られますが、VBAの場合だと
■ 実行用のsub
■ 処理用の関数
を用意することになります。また、引数の記述の部分は、
【 変数名 As 型 】
になるので、
■ 引数
■ 戻り値
の部分が少し長い記述になってしまいます。
ExcelとVBA
ExcelでVBAを使用する場合、
【 VBAのプロジェクト(Book1)】
┃
┣━📁:Microsoft Excel Object
┃
┗━📁:標準モジュール
のような構造になっています。エクセルのオブジェクトの中には、
【 VBAのプロジェクト(Book1)】
┃
┣━📁:Microsoft Excel Object
┃ ┃
┃ ┣━Sheet1(Sheet1)
┃ ┃
┃ ┗━This Work Book
┃
┗━📁:標準モジュール
のような構造になっています。標準モジュールには、
【 VBAのプロジェクト(Book1)】
┃
┣━📁:Microsoft Excel Object
┃ ┃
┃ ┣━Sheet1(Sheet1)
┃ ┃
┃ ┗━This Work Book
┃
┗━📁:標準モジュール
┃
┗━Module1
のようにModule1が格納されているので、ここにコードを書いていくことになります。
Module1には、 【 Option Explicit 】 と書かれていますが、ここにsub〜end subを追加して、処理を追加することになります。その為、
Option Explicit
sub
処理
end sub
のような構造を最初に考えて、使用できる処理を試しながら学習することになります。
モジュール内にはsubプロシージャを複数配置できるので、複数の処理を実装することがd系マス。