ラベル 抽象化 の投稿を表示しています。 すべての投稿を表示
ラベル 抽象化 の投稿を表示しています。 すべての投稿を表示

日曜日, 6月 17, 2007

抽象化 おまけ

抽象化でコードはより人間の使う言葉に近づくことを説明した。
が、残念ながらその言語はどうしても"英語"になってしまうだろう。

プログラミング言語が高級になるにつれて
英語ができないものは不利になっていくことを最近特に感じる。

英語がわからないとコードを読めなくなる。

ただでさえ、情報量は英語の方が圧倒的に多いのに。

これは日本人の技術者にとって非常にやばい方向へ向かってるのかもしれない。
「エンジニアの必須スキルとして、まず英語」というのが冗談ではなくなりそうだ。

情報処理技術者試験の科目にも入れたほうがいいかもね。

土曜日, 6月 16, 2007

抽象化 その2

Verilogではparameterを使って、固定値をパラメータ化することできる。

パラメータ化による利点の一つは、再利用性を高めることができることだがもうひとつの大きな利点は数値を抽象化できることだ。

次のような仕様があったとする。

2ビットの入力signalについて、
2'b00を赤、2'b01を黄色、2'b10を青と定義する。
また、2ビットの出力ctrlについて、
2'b11を停止、2'b10を注意、2'b01を進行と定義する。
signalが赤の時、 ctrlは停止を出力、
signalが黄色の時、ctrlは注意を出力、
signalが青の時、 ctrlは進行を出力をすること。

この仕様に対して、次のようなコードを書いたとしよう。
case (signal)
2'b00: ctrl = 2'b11;
2'b01: ctrl = 2'b10;
2'b10: ctrl = 2'b01;
default: ctrl = 2'b11;
endcase

一応これでも仕様を十分満足できる。
が、一度仕様を読んでこのコードを見てもそれが正しいかどうか理解するのに少し苦労するだろう。

次の場合はどうだろうか。

parameter Red = 2'b00;

parameter Yellow = 2'b01;
parameter Blue = 2'b10;

parameter Stop = 2'b11;
parameter Caution = 2'b10;
parameter Go = 2'b01;

・・・

case
(signal)
Red: ctrl = Stop;
Yellow: ctrl = Caution;
Blue: ctrl = Go;
defautl: ctrl = Stop;
endcase

パラメータの定義の部分は少し注意が必要だがコードの本体の部分を理解するのはこちらの方がずいぶん楽だろう。
具体的な数値がすでになくなっているので抽象度が上がり人間の言葉に近くなっているからだ。

このように、同じ機能を実現するコードでも
抽象化することによって、ミスを減少したり、メンテナンス性向上させることができる。

ハードウェアではより低レベルでの効率化のため、各ビットに意味をもたせる場合が多くそのため、現在でもまだあまり抽象化されていないコードをよく見かけることがある。
例えば、先のsignalの定義で言えばbit1を見るだけでそれが青かどうか判断できるため、次のコードの方が良いと思う人も多いかもしれない。

if
(signal[1]) ctrl = 2'b01;
else begin
if (signal[0]) ctrl = 2'b10;
else ctrl = 2'b11;
end

しかし、EDAツールやチップの性能が向上してきている現在では、よりメンテナンス性の良い方法を選択した方が今後はよりしあわせになれるのではないだろうか?

抽象化 その1

コンピュータは全てのことを0と1だけで表現している。
いわゆる2進数というヤツ。

でも、いくらスーパーなエンジニアでも0と1だけで全てを把握するのは無理なので
16進数をつかったりして表現する。

0と1が8個並んでいるよりも、0~Fまでの値が2個並んでいる方がよほど楽だ。

最も、普通の人なら0~9までの数字が3個並んでいる方が理解しやすいが
人間の適応能力というのは大したもので、我々の業界では
32や64、256などの数字(16進数でそれぞれ0x20,0x40,0x100)を
「キリが良い」と感じてしまう重大な職業病が蔓延している。

16進数の方が2進数よりも扱いやすいのは、
まず第1に頭の中で処理をする数字の量が減ること
そしてもうひとつは値をある程度『記号』として意味をもたせることができるからだろう。

これも1つの抽象化だ。

抽象化は設計や検証のさまざまな場面で恩恵を与えてくれる。
なぜなら、抽象化されたものの方が人間が理解しやすいからである。

例えば次の2進数の数値をあなたは1週間後に憶えていられるだろうか?

1100101011111110.b

何の意味もない値を憶えておくことはかなり困難だ。
では、次の16進数の値ならどうだろう?

0xCAFE

これなら1週間後どころか1年、もしかすると一生憶えているかもしれない。
上の2つの数値は同じ値である。つまり、

1100101011111110.b = 0xCAFE

かなり極端な例だが、抽象化することで同じ値でもかなり扱いやすくなる。

ミスを減らしたり、理解を深めたり
この抽象化という概念はさまざまな場所であなたの味方になってくれる。