2年以内でエンジニア社内トップ10入りを目指すブログ

報酬制
・プログラミングや技術についての勉強をする
・新しい技術や知らない技術に触れる
・何かゲーム開発をする
・業界に関するニュース等を調べ、考察する

上記のいずれかを達成した日のみ、以下のことをしてもよい。
・ゲーム
・アニメ鑑賞
・飲酒

ごめん、この一つ前の記事まで、本のタイトル間違えてた…。
お恥ずかしい。

まぁそれはいいとして、今日はハードウェアの制御についての部分を読んだ。
普段Windowsのシステムコール(API)で読んでる入力制御とかの中身がどうなってるのか知れて良かった。

キーボードなどの周辺機器とのコネクタには電気的特性を相互に変換するICが接続されてるんだね。
んで、そのICはI/Oコントローラと呼ばれ、その中にはさらにポートと呼ばれるメモリーがあり、そこで入出力の管理をしてるそうな。
例えばキーボードだと、CPUのレジスタ→ポート→電気特性の変換→キーボードという流れ(逆もまた然り)でやりとりされる。
なんかポート番号って聞いたことあるなぁって思ってたけど、こうゆう周辺機器との接続番号なんだね。この番号のアドレスを指定して命令を出すと、その周辺機器を操作できるんだね。

C言語でも_asm{}で囲めば、その部分はアセンブリ言語で書けることを知ってびっくりした。
C#でも書けるのかしら。(多分書くことないと思うけど)

IRQ(Interrupt Request):割り込み処理。
割り込み処理自体はよく使われるものだから、この語句を覚えておこうと思って。

DMA(Direct Memory Access):CPUを仲介せずに周辺装置が直接コンピュータのメインメモリーとデータ転送を行うこと。
CPUを仲介するとその分遅くなるため、その無駄を省こうという考えらしい。ディスク装置などで使われてる。

これらのI/Oポート番号、 IRQ、DMAは周辺装置を識別するための3点セットで、プロパティとかから確認できる。(I/Oポート番号は必須だけど、残りの二つはあったり無かったりらしい)

VRAM(Video RAM):ディスプレイに表示される内容を常に記憶しているメモリー。
ディスプレイに表示したい内容はこのRAMに書き込んでるんやね。
うちのチームでちょいちょい出てくる単語で、よく分かってなかったから勉強になった。

そういえば、BIOSはマザーボードや拡張ボードの上のROMに入っているってのが勉強になった。
ということはグラフィックボード(GPU)のROMにも入ってるってことだよね。

オブジェクト指向ってなんと無く知ってる気でいたけど、実際に自分がコードとしてそれを活かせてるのか不安になった(というか活かせてないと言われた)ので今一度勉強。

オブジェクト指向とは、ソフトウェアの保守や再利用をしやすくすることを目的とした技術。
個々の部品により強く着目し、部品の独立性を高め、それらを組み上げてシステム全体の機能を実現するという考え方に基づいている。
し、知ってるし…!(知らない)
改めて考えると、自分のコードって独立性がイマイチなんだよなぁと思った。

「オブジェクト指向は現実世界をそのまま表現できるのか?」について、自分なりの解釈で言うと、概念的には結構似ているが、全てをそのままとは行かない。大体のものは似せた構成で作れるし、それで綺麗にまとまりそうな気もするが、現実世界のグループ分けがそもそも曖昧なものとかについては、うまく行かない気がする。

構造化言語(C言語とか)と言うオブジェクト指向前の考え方を知った。
機械語とかに近い時ってgoto文で全部書かれてて、行ったり来たりが多く非常に読みづらかったらしい。
そこで、順次進行、条件分岐、繰り返しの基本三構造をベースとして読みやすくしようってなったのが構造化言語。
また、構造化言語ではローカル変数や引数の値渡し機能も提供され、より読みやすいコードを書けるようになった。

C言語のもう一つの特徴として、プログラミングに必要な機能の全てを言語仕様で提供せず、関数ライブラリで組み上げるようにしたことも挙げられるらしい。
これによってコンパイラを改良しなくても言語仕様レベルの機能追加ができるようになったそうな。

構造化言語でかなり書きやすく、読みやすくなった。が、それでもまだグローバル変数は消えず、関数の再利用性も高くない状態だった。
そこで登場したのが、オブジェクト指向という考え方らしい。

最初のアセンブリ言語のコンパイラは機械語で作られたらしい。その後、コンパイラの更新をする際はアセンブリ言語で作られるようになった。
つまり、コンパイラはその時点の最新のプログラミング言語を使って作られて来たらしい。
一回自作コンパイラとか作ると、この辺り真の意味で学べそうな気がした。(多分、すごく難しいと思うけど…)

アセンブリ言語からプログラムの本当の姿を知る部分を読んだ。
アセンブリ言語は一応学生時代に触ったことがあり、書き方とかは若干知ってた。
ただ、なぜそのような作りになってるかとかは知らなかったから、その辺すごく勉強になった。

まず、アセンブリ言語とネイティブコードって1対1変換できることにびっくりした。(アセンブルと逆アセンブル)
そんで、C言語とかをネイティブコードから逆コンパイルするのが困難なことも知らなかった。(主にコンパイル時に最適化処理が走るためだと思う)

コンパイル時の最適化処理でヘェ〜と思ったのが、たまにUnityとかでも「'c'に代入した値が使われてません」とかの警告が出るときがあるんだけど、コンパイルしたらその部分の処理はネイティブコードには一切記述されないという点。
頭いいなぁ。

レジスタとはCPU内部の記憶領域のことで、メモリーよりアクセスが大幅に速く、処理を高速化できるらしい。ただ、プログラムから操作可能なレジスタは10数個とかしか無いので、大概はメモリーを使うことになる。

アセンブリ言語だと条件分岐や繰り返し処理はgoto文みたいな書き方になる。逆に言えば、C言語とかのgoto文は昔の名残らしく、読みづらくなるため今はほぼ使われていない。

スレッドとはOSがCPUに割り当てる最小の実行単位で、ソースコードの1つの関数が1つのスレッドに相当するらしい。
マルチスレッドは、1つのプログラムの中にある複数の関数を同時に実行することらしい。

〜思い出〜
学生時代にプロアクションリプレイっていうのを使ってゲームを遊んだことがある。
あれってゲーム改ざんのツールなんだけど、ネットとかで「ここをこう変えればこのアイテムが手に入るよ」みたいな16進数のわけわからん数字の羅列を探してきて、それをプロアクションリプレイに打ち込んでゲームを起動すると本当にそのアイテムが手に入るのよね。
今考えるとあれって、元のゲームを逆アセンブルしてから解析し、「ここをこう書き変えればこのアイテム手に入るんじゃね?」って書き換えたコードをアセンブルし、できたネイティブコードを公開してたんだろうか。
いや、そうなるとかなり手間がかかってるな…。そこまで改ざんに熱意のある人がいたんだろうか…。それとももっと簡単な方法が…?
今度調べてみよう。

このページのトップヘ