先日は、
にてHTMLについて書きました、PCを導入するとOSと標準実装されているソフトのみが使用できるようになっていますが、基本的に汎用OSがインストールされているPC環境だと、どれを使用したとしても
■ WEBブラウザ
■ メモ帳
■ ターミナルやコマンドブロンプト
のような物が存在します。つまり、
■ HTMLの表示環境
■ 2バイト文字を扱う事が出来るテキストエディタ
■ コマンドラインの操作が出来るソフト
は揃っているので、コーディングが出来る環境はある程度出来上がっています。ただし、入力作業の煩雑さが厳しすぎるので、タイピングの練習ついでにコーディングをするのであれば、この産業環境だと嘘のように文字を打ち込む事になりますから自然とブラインドタッチが出来るようになります。
WINDOWS 10環境では、
■ WEBブラウザで動く物
■ .NET Framework
が最初から用意されているので、WEBブラウザを実行環境として利用できるローカルで動作するアプリケーションの制作もできますし、.NETの場合、.NETを仮想環境として使用してバイトコードを実行できる物として
■ C#
■ VB.NET
などが使用できます。.NET Frameworkですが、2.0から始まり、3.5以降で、
■ .NET Frameworks
■ .NET Core 3.1
に分かれたのですが、この系譜も
■ .NET Frameworks 4.6.1 (4/26にEOL)
■ .NET Core 4 (4/26にEOL)
■ .NET Core 4 (5/8にEOL)
になったので、今年は、これが立て続けに終了したので、現在は、
■ .NET Frameworks 4.8
■ .NET Core 6 (LTS)
を使う事になります。.NET Frameworks 4.8は暫く使えますが、.NETについては、
■ 奇数バージョン : 1年
■ 偶数バージョン(LTS) : 3年
のサポートとなっています。とりあえず、既存のインフラクチャーが構築されていて意向が少し大変な技術が使われている場合だと、即座に別の物に移行するというのは難しいと思うのですが、趣味や学習目的で学ぶ場合だと、現在のバージョンやEOLになっていない物を学ぶ方がいいかもしれません。
その為、既存のアプリを新しいアーキテクチャに移動させるような乗受験だと、既に使用している.NET Framework 4.8を動かしたほうが良さそうな場合条件もありますが、何も作っていなかったり、むしろ、移植や元々ある物を新規アーキテクチャや新しいバージョンに移行するような条件でない場合だと、最新版を選んで学習をしても問題はありません。その為、使わなくなるものではなく、既存の物を学ぶほうが確実なのでそう言った選択をする事になります。
.NET Framewirksや.NETはJAVAのように実行環境がアプリケーションを実行しているPCではなく.NETというJAVA VMのような仮想マシンなので、このVM上で動作するバイトコードを作ってそれを動かします。コンパイル型言語の場合、OSが異なると命令セットが違うので、全く異なる物が出来上がってしまうのですが、
■ WINDOWS : .exe
■ Linux : SH
のようにC++でビルドをすると全く違う形式のファイルが出来上がってしまいます。これは命令セットが異なるためですが、コードを書くまでだと単なるテキストファイルの作成なので何を使っても大丈夫ですが、コンパイル型言語の場合だと、子Ⅾ-尾をビルドしないといけませんから、この際にアーキテクチャ依存が出てしまうと問題があります。その為、そうならない為の選択が必要になりますが、この場合、環境を統一するかコンパイルするマシンを実行する物に合わせる必要が出てきます。
この条件を解消しようと思うと、クロスコンパイラを使うという方法もありますが、アーキテクチャを固定してしまって、その実行をPC上で行うとPCのアーキテクチャ依存がなく案るので、環境依存がなくなるので、【 VM用の命令セット 】 を用意しておいて、それを使ってVMで動くバイトコードを実行する事で動作する事が可能な状態にする方法があります。このアプローチをとっているのが、マインクラフトでもお馴染みなJAVAになりますが、この言語では、JAVA VMを含めた実行環境としてJREが用意されており、この実行時にJAVA VMの設定を引数の指定で行える仕様になっています。
そして、コンパイル型言語なので、JDKと言うコンパイラを使用してコンパイルをする事になりますが、この考え方と同じ仮想マシンを使った物が、.NETになります。C#の場合、csc.exeを使用してコンパイルを行う事が出来ますが、この時のコンパイル済みの物はネイティブコンパイルではなく、.NETで動く物なので、どのアーキテクチャでコンパイルしても.NETと言う仮想マシンで動く命令セットを使って動作するものになりますから、
■ 開発環境
■ 実行環境
の依存度がなくなります。ただし、CISCとRISCで同じコードを使って動作する物を作れる訳ではありませんから、クロスコンパイラを使ったコンパイルとワンコードでアーキテクチャ依存がなくなる条件を作れるというのは意味合いが違ってきます。
こうしたワンコードでアーキテクチャ依存がなく複数のプラットフォームで動く物を作れる開発方法を、クロスプラットフォーム開発と言いますが、コーディングを行う場合だと、
■ Flutter
■ React Native
■ Xamarin
などがあります。ゲームエンジンもクロスプラットフォーム開発ができますが、コーディングの場合だと、この3つが多くのシェアを持っています。特に、最初の2つがシェアが大きいのですが、Xamarinは廃止になるので、今後は、これの代わりのものとして.NET MAUIが使用されることになります。
WINDOWSの場合、csc.exeが最初から使用できるので、メモ帳でコードを書いて、コマンドプロプとやPowershellでコマンドを実行してビルドを行って実行ファイルを作って実行する事もできます。
その為、JAVAやC++のような厳密なカスタマイズが出来る訳ではありませんが、C#を使って 【 OS上で実行できる単独で動くアプリケーション 】 を作る事が出来るようになります。
C #で出来る事
C#は、Powershellでも使用できるので、コンソールで動く物をそのまま作れる仕様になっていますが、Unityなどでも使用されているようにグラフィックを扱う事もできます。また、IDEのVisual Studio 2022ではフォームアプリを作るとフォームに実装したウィジェットを使ってフォーム上で動作するアプリケーションを作る事が出来ます。
その為、構造を考える必要がありますが、
■ コンソールアプリ
■ フォームアプリ
の2つが作れる賞になっているので、デスクトップ上でGUIを使って表示できるデスクトップアプリケーションやバックエンドで動作する自動処理をするような物も作れます。
基本的に、コンパイル型言語に限らず多くの開発環境では、バックエンドの学習をして、挙動の実装方法を理解してからそれをフロントエンドを含めて動作するようにする場合にはどうすればいいのだろうか?と考えて行く事になるのですが、これをバックエンドで動くコンソールアプリで考えて行くと、パターン解析や配列の制御のようなデータサイエンスのような事が発生するので、AI関連でなくグラフィックを扱うだけでも多次元配列を使う事になります。
コンパイルをする場合、
■ CMD : コンパイラのパス ファイル名
■ PS : /コンパイラのパス ファイル名
のような形で指定する事になりますが、開発環境の場合、環境変数を指定する事になりますが、Pythonもインストール段階で環境変数の指定をしますが、これは、コマンドでPython ファイル名で実行できるようにするための処理になります。
この環境変数の登録をしない状態だと、自動で実行できるバッチファイルを作る事になるので、 【 .bat 】 と言う拡張子を持った物を用意して、その中にコンパイラを絶対パス指定で指定して処理をするような記述でコーディングすると、次からそのバッチファイルの名称の後にコードを記述した対象のファイルを指定すると実行できるようになります。Pythonだと実行できるようになりますが、コンパイル型言語の場合だと、コンパイルを行う際にコンパイラを使う事になりますから、この設定をする事でコンパイルをする事が出来るようになります。この辺りの指定が、環境変数の設定などになりますが、Pythonを使った時にコンソール上で、【 Python ファイル名 】 でPythonファイルの実行できるのと同じように、コンパイラ + ファイル名で実行する為の方法としてこう言うのがあります。
こうした作業だと、
■ コマンドプロンプト
■ PowerShell
がありますが、今回は、PowerShellを使ってコマンド操作で作業を行ってみることにします。
■ C#コンパイラを使えるようにする
通常のやり方だと、環境変数の設定をして作業をしたほうが行いやすいのですが、今回はバッチファイルを作ります。環境変数を指定する場合も 【 コンパイラの絶対パス 】 が必要になるので、結果的にファイルのある場所を探す必要があります。
.NETはWINDOWSフォルダー以下に入っているので、
のように開いていくと、
のように、
■ x86-32
■ x86-64
の物があります。今回はx86-64にするので、Framework 64の中にあるコンパイラを使用します。フォルダーを開くと、
のように複数のバージョンがあるので、最新版を選択して使用する事にします。v4.0.30319のフォルダーを開くと、
のようにcsc.exeがあるので、この場所を使う事になります。
■ 作業フォルダ―を作る
コマンドで行おうと思ったのですが、エクスプローラ―を開いているのでGUIの操作で作ってしまったのですが、
のようにcd(change directryの略)コマンドでディテクトリを変更して、バッチファイルを作ります。バッチファイルは、テキストエディタで作る事になるのでメモ帳を使います。
メモ帳を開く場合には、notepadで開くことが出来るのですが、コマンドを使う場合、notepadで開くことが出来るので、今回は、この制作するファイルをからのファイルではなく、名称の付いた状態でファイルを作成するので、
のように
【 アプリケーション名 】 + 【 ファイル名 】
の指定をして実行します。すると、
のようにメモ帳が立ち上がり、
のように存在しないファイルをし定位しているので新規作成になるので、そのまま実行すると、
のようにcsc.batと言うファイルが出来ます。ファイルが存在する場合には、そのファイルを指定して開くことが出来るので、メモ帳でhtmlファイルを開く場合だと、ディレクトリを指定して開くと編集する事が出来ますが、存在しないファイルの場合だと新規にその名称のファイルを作成をする事が出来ます。
この状態で、指定フォルダー内をエクスプローラーで見てみると、
のようにバッチファイルが出来ているので、ここにコンパイラが動作する設定を追加する事になります。
エクスプローラーのcsc.exeのある場所を選択して、アドレスバーをクリックすると
のように全選択になるので、これをコピーして先程のファイルに貼り付けます。すると、
のようにリンクを張る事が出来ますから、ここにcsc.exeを追加して、その後に%1を記述します。これは、1番目の引数を使う方法になりますが、
のように記述を行ってバッチファイルを上書き保存します。
多分、この方法よりも環境変数を指定してコマンドで指定したほうが良さ襲う鳴きもしなくもありませんが、これで、csc.batを実行するとコンパイルが出来るようになります。
実際に ./csc.bat で実行してみると、
のようにエラーが出ることはなく、対象がないという事が表記されますが、コマンド自体が間違っていると、
のようにエラーが出ます。これで、コンパイラの実行が出来るようになったので、コードを書いていきます。
■ C#のコードを書く
この作業もメモ帳を使うので、先程と同様に
のようにnotopadを開いてtest1.csと言う名称のファイルを作ります。すると、
のように新規ファイルを作るか尋ねられるので 【 はい 】 を選択して新規ファイルを生成して作業を行います。最初に作るプログラムと言うと誰もが通る 【 Hello,World! 】 なので、それをコードで書きます。
C#はC++程複雑な仕様ではないので書かなくても大丈夫なものもあるので、コンソールで文字を表示するだけだとPythonみたいになにも読み込まなくてもクラスの生成だけでコードを書けてしまいます。実際に書いたコードが
になりますが、このコードでは、
でtest1と言う名称のクラスを作り、その中に関数を作っています。その記述が、
になりますが、静的な物を用意して、空の状態を指定して、C++でもお馴染みのMain()関数を引数なしの状態で指定します。そして、処理の部分は、
になりますが、Systemを宣言して、処理自体がコンソールなので、Consoleを指定し、何をするかをその後に記述するので、ここでWrite.Lineを指定しています。そして、引数として、文字列を書いているのですが、この状態で関数を記述するだけで、引数なしで表示が行われます。
c++の場合、似たような記述をすると、return 0;が付いてくるのですが、そういうのがありません。あと、C++やC言語の場合、表示を行う為に使用するヘッダーファイルなどを最初に読み込むので最初に 【 使用する部品を格納した道具箱 】 を指定して、その中で実装されている機能を使用する流れになっていますが、C#の 4.0.x場合、表示をするだけだとそう言うのが要りません。
とりあえず、これをコンパイルするので、
./csc.bat test1.cs
を実行する
のようにコンパイルが行われ、実行形式の.exeファイルが生成されます。
そして、これを実行すると、
のようにHello,World!!
が表示されます。
■ 変数を使う
先ほどは文字列をそのまま記述しましたが、他の言語と同様に変数を使う事もできます。ただし、Pythonみたいに型を無視して書ける訳ではありませんから、肩の指定をする必要があります。変数を参照して表示をする場合にだと、
のようになりますが、先程のコードとは異なり、
のように
System.String.変数名 = "文字列"
で指定をする事が出来ます。そして、他の言語と同じように文字の結合が出来るので、 + を用いることで文字列型同士の結合が行えるようになっています。実際に実行してみると、
のようになります。
■ 数値を使う
コンピューターと言うと計算ですが、計算をする場合には文字列ではなく数値を使う事になります。どの言語でもそうですが、コンピューターでは、整数と小数点数を分けることで、桁数を稼いでいるので、整数と浮動小数点数では異なる型を使う事になります。多くの言語でも単精度の物だと、
■ int : 単精度整数
■ float : 単精度浮動小数点数
を扱う事が出来ます。コードを書くと、
のようになりますが、
のように文字列型はこの状態になる物の、数値型の場合だと、
のような感じになります。この辺りは型と変数名だけで指定できるので、Pythonのような名称だけ指定して、変数の状態で型を判断する状態になっていますが、これに型を指定して状態を確定さえて使用する事になります。
そして、
のように表示をする事になります。変数にも計算式を代入して計算を行う事が出来るので、ファイルを保存後に
のようにコンパイルをして、実行すると、
のように結合した文字列と計算結果が出力されます。
■ .exeファイルを実行する
c#のファイルをコンパイルすると.exe形式のファイルを読み込むことが出来るのですが、逐次処理でループを刺せていない物の場合、処理が終わると一瞬で消えてしまいます。
この辺りは、Scratchで連続した処理を実装した時に一瞬で終わってしまってセリフが変わったりコスチュームの切り替えをする際に動いているように見えない状態が起きることがありますが、この原因は 【 処理が速すぎて終わってしまう 】 為です。その為、コンソールアプリで逐次処理を実装すると、瞬間的に終わってしまうので、ウインドウが開いたカロ思うと即座に消えて行くので、何が実行されたのか理解できないまま終わってしまうことがあります。コンソールアプリでループを入れていない状態でこれを解消しようと思うと、処理待ちを入れることになります。これを行う場合に、
System.Console.ReadLine();
の行を入れて処理待ちを入れることになります。実際にコードとしt欠いてみると、
のようになりますが、
のように1行だけ処理待ちを加えて保存をして
のようにコンパイルを行って
のようなコンパイル済みの実行ファイルをダブルクリックすると、
のようなウインドウが出て、
のように実装したコードが実行されます。
ちなみに、フォームアプリの場合、公式サイトでは一見すると謎の呪文のような事が書かれていますが、フォームを作った時には、プログラムが立ち上がるので、その処理でプロセスが1つ発生します。この辺りは、以前、Pythonで触れた部分になりますが、このコンソールアプリも処理の実行時には1つのスレッドが発生するのですが、そのスレッドが、コンソールのように一度だけ実行されるものではなく、ループするので、ウインドウを閉じるまではプロセスとプロセス内のスレッドが停止しない仕様になっています。その為、
■ コンソール : ループを指定しないと消える
■ フォーム : 終了処理をするまでループする
と言う違いがあります。
C#の場合、こんな感じでコンパイルをして実行ファイルを作る事が出来るのですが、C#4.0系だとこう言った作業ができます。現在のC#のバージョンが11なので、最新版はダウンロードして使う事になりますが、古いバージョンだと実装機能だけでアプリケーションを作る事が出来ます。
.NETについては、
■ .NET のダウンロード 【 マイクロソフト 】
https://dotnet.microsoft.com/ja-jp/download
■ .NET Framework のダウンロード
【 マイクロソフト 】
https://dotnet.microsoft.com/ja-jp/
からダウンロードできますが、OSに実装差rている物の場合、.NETは3.5 SP1が2029年までサポートになっているので、インストールされている物だと3.5を使った方がいいかもしれません。
■ 📁フォルダを作る
今回はPowerShellでC#をコンパイルしてみたのですが、コマンドを使うとファイルの作成だけでなく📁フォルダをサウ性する事もできます。これは、Tlelnetでサーバにアクセスしてホームページを更新する場合に使用するコマンドでの操作と同じですから、mkdirで作る事が出来ます。時差際に作ってみると、
のようにディテクトリ内に📁フォルダを追加する事が出来ます。