まつたろうの歩み

PythonやCの勉強中に「指し示す」いう表現がありました。それを知りたくて今はコンピュータシステムを勉強しています。

コンピュータシステムの理論と実装。第6章アセンブラー 完全版が完成しました!

 前回、第6章のアセンブラー が完成したことはお伝えしました。実は、前回のプログラムでは、C命令を事前定義の辞書に入れてそれを読み込んで使ってました。C命令は「M=D」などの表現でかかれています。それを下の画像のように、2進数16ビットに翻訳して動作させます。前に作った ALC の計算と同じ表現です。

C命令の例

 今回は、このC命令をプログラムで計算させるようにしました。そこで、本当に完全な形で完成したのは今回になります。ひと月の間、これまで勉強した PLY_lex や yacc を復習しました。

PLY_Lexを使ってみた

 どうしても、Hack コンピュータのソースコードとは合わないように思われました。抽象構文木もつくってみました。

抽象構文木

 このパターンを使わないといけないかなと思いましたが、使いにくいようです。結局、これまで使ってきた re で進めるようにしました。C命令をどう match 等を使って2進数まで変換させるかが、課題となります。まずはC命令で match を使ったらどうなるか、確認しました。

C命令で match を使う

 match の使い方を検討します。

match の検討

 上の写真のように、マッチしたらいけないところでもマッチします。それらを改善していき、一意になるようにしていきます。その後改善を進め、C命令の式が分解できました。

C命令の式が分解できた。

 ソースコードが10進数なので、そろえるためにバイナリから10進数に変換します。

C命令の式から10進数に変換できた。

 最後はいよいよ、以前のプログラムに上のC命令の部分を組み込みます。

C命令の変換部分が組み込めた。

 上の画像では、10行でエラーが出て止まっています。その後改良して、ようやく正常に動作するようになりました。下は Pong 出力中の画像です。2分くらいで完了しました。

Pong 出力中

 正常に動作しました。完成です。

Pong 成功

===今日の日記===

 半年かけて、Python で Hack_assembler ができました。「よくここまで、できたなぁ」と自分で感心します。これまで、Python の一通りの勉強はやってきましたが、まとまったプログラムなどかいたことはありませんでした。始めは、できないかも知れないと思っていました。それでも、できるところまでやろうと思い始めました。1行かくのに、調べて数分~数日かかりました。最終的には、可読性をよくするため空行も含みますが 288 行になりました。あきらめなければ、できるものですね。

 これからは、とりあえず第7章に進んでみます。それが短期間で終わればよいのですが、初学者の私には予想がつきません。ここまでくるのに、約1年かかりました。長期間に渡るようでしたら、私の寿命との戦いになってしまいます。コンピュータシステムの勉強の方が大切だと考え、それまでしていた CASL2 や C言語の勉強など途中で放り出しています。それらの勉強の後、このコンピュータシステムの理論と実装に戻ったほうが良いかも知れません。どちらにしても、この「歩み」は当分続けます。これからもよろしくお願いします。