Notifications
Article
[特別企画:Unityスタッフ連載]2週目・名雪 通 [2/5]
Updated 9 months ago
318
0
こんにちわ!Unityで働いているいちエンジニア、名雪です!
昨日はコンピュータが大きくCPU・メモリ・GPUの3つからできていることをお話しました。
今日はその中でもCPUについてもう少し詳しくお話ししていきましょう。

CPUが実行できるプログラム

昨日「Unityで書いたC#のプログラムもCPUで実行される」と言いましたが、実はCPUはC#のプログラムを直接実行することはできません。CPUが直接実行できるプログラムは↓のようなものになります。
???何が何だかわからない…。実はこれ、テキストではないため文字化けしているのです。
CPUが直接実行できるものは「機械語」と呼ばれ、人間が直接読み書きできるようなテキストではなく、バイナリになっています。また、機械語はCPUのメーカーや種類によって命令が異なります。
※前世紀には、機械語を直接読み書きできるスーパープログラマーも存在したと言われています。

アセンブラ

さすがにこれではプログラミングを行うのは難しいため、アセンブリ言語というものが作られました。アセンブリ言語の命令は機械語の命令と一対一に対応しており、多少人間にわかりやすい名前がつけられています。
アセンブリ言語が書かれたテキストファイルを「アセンブラ」というプログラムが読み込み、機械語に変換します。さきほどの機械語はもともと↓のアセンブリ言語を変換したものです。
※Intelのx64アーキテクチャのCPUの場合。
※前世紀では、アセンブラが動かない環境でプログラミングをするために、人間がアセンブリ言語から機械語に変換する「ハンドアセンブル」ということがよく行われました。

レジスター

昨日CPUはデータをメモリーに書き込んだり読み込んだりすると言いましたが、メモリーを読み書きするには昨日お話しした「バス」を経由する必要があるため、少し時間がかかってします。そのためCPUは「レジスター」という一時的にデータを格納するための変数を内蔵しています。
基本的にCPUが処理をする時は、メモリーからレジスターにデータを読み込み、レジスター上で計算を行い、メモリーに書き込むと言った流れになります。
さきほどのアセンブリ言語の中に出てくる、rax、r8やesiなどがレジスターにあたります。
※Intelのx64アーキテクチャのCPUの場合。

コンパイラ

さらに効率よくプログラミングを行うために生まれたのが「コンパイラ」です。ひとつの命令でもっと複雑な処理を行えたり、さまざまな処理を効率よく記述できるように設計された高級言語から機械語を生成することができます。
C#もこの高級言語のひとつとなります。なお、さきほどのアセンブリ言語は実は↓のC#コードをコンパイルしたものです。
UnityがC#のコンパイラを呼び出してC#のコードを機械語に変換したわけです。
※厳密にいうとC# Job System向けに書かれたC#のコードをC#のコンパイラが.NETの中間言語(IL)に変換したあと、UnityのBurstコンパイラーが中間言語から機械語に変換しています。
※Burstコンパイラーがどのような機械語を生成するかは、UnityのBurst Inspectorで確認することができます。

それではまた明日

CPUが普段みなさんが書いているC#をどのように実行しているかわかったでしょうか?次はメモリーの話を投稿する予定です。ぜひUnityお学びグループに参加してください!
※ほんとはFPUとかSIMD命令とかの話もしたかったのですが、そろそろ今日は店じまいということで。
Tags:
Toru Nayuki
5
Comments