備忘録

一昨日の晩御飯も思い出せない。

Comet2 エミュレータを作ってみた

2017年01月04日 | お勉強
正月は暇だったので、途中で飽きてほったらかしだったエミュレータを完成させてみた。
以前はJavaのGUIで躓いたから、今度はC#でウィンドウズに挑戦ってか。
とりあえず出来たはいいが、試験用の架空アセンブラだもんで、
長いサンプルプログラムはあまり見かけないから、
動作確認のしようがないなと、思ってたところ、
とあるところで、5000行近いサンプルを見つけたので試してみた。
おっそろしく遅いが、まともに動いた。かなり嬉しい。
計算機プログラムのサンプルなんだが、
ちゃんと答えがあってるから正しく動いてると思っていいのかな?
20.0/3 の答えを出すのに6秒くらいかかったけどね。

ふたたびコンパイラを作ってみる・その3

2016年05月06日 | お勉強
SIMPL-T の文法的には、大域変数宣言と関数・手続きは別のセグメントになっているのだが、
<program> ::= {<declaration>}{<segment>} "START" [<identifier>] (リファレンスではこう書いてある)
"PROC" は先頭に型名がこないからいいとしても、関数は戻り値の型名が先頭にくるから、
型名の時点では変数宣言と区別がつかないんだが。
↑の式とはビミョウに違うような気がするんだが、どうなんだろう?
”FUNC" まで読まないと関数だってわかんないよなぁ。
<declaration>も<segment>も型名で始まる可能性があるんだから何か一工夫がいるんじゃね?

ふたたびコンパイラを作ってみる・その2

2016年04月29日 | お勉強
大域変数宣言のまとめ。

オリジナル SIMPL の例。
INT ARRAY A(3), BAT(95),VECTOR(20)
INT ARRAY A1(10), B(5) = (2,3,-1)
INT ARRAY C(11)=(0,1,3(9))
とか。。。。。
CHAR型とかSTRING型まで含めると限りなくメンドクサイので
配列は初期化出来ないってことにする。
初期化手続き書けばいいじゃん。
と、いう訳で、大域変数宣言の書式は、
INT A,B=5,C=-3
INT ARRAY A1[10],B3[50]
CHAR E,F='a'
CHAR ARRAY Z[10]
STRING S[5],L[10]="hello"
STRING ARRAY Y[5][5]
くらいで勘弁してもらおう。それでもやっとこなんだけどな。
局所変数宣言は'='以降が無いだけ。

ふたたびコンパイラを作ってみる

2016年04月27日 | お勉強
できるかな?

今度はちゃんと作ろう。
目標は COMETII 用の”ネイティブコンパイラ”。むずかしそうだ。そもそも 64K で足りるのか?まぁいいや。
PL/0 でもいいんだけど、あの "begin end" のブロック構造がイヤなんだよな。プロシージャのネストもイヤだし。
そういうところは、細かい仕様の決まっていない COMETII には向いていない気がするのだが。関係ないか?

という訳で、ちっさくて単純そうな言語を探してみたらよさげなのがあった。70年代初頭の SIMPL-T。
"procedure oriented" で "non-block structured" だそうな。いいんじゃね?
リファレンスは見つけたが、資料がほとんどない。古すぎ?
型 は INT, CHAR, STRING。 配列もある 。文は 代入、IF, WHILE (EXIT), CASE, CALL (RETURN) 。
WHILE に名札をつければどんだけネストしてても EXIT 出来るっつうのはどうなんだろ?便利なのか?
プログラムは手続き(関数)を並べてくだけ。なおかつ、コンパイラ作成用と謳ってる。
ただ、演算子のパターンがビミョウに今風とは違っているのが、やっぱりか、という感じだが。そこは変更すりゃいいだけだし。
リファレンスを見ると、宣言が色々なパターンで出来て複雑そうなんでソコも簡略にしちゃえばいいか。
大域変数は宣言時に初期化(定数化)できるが、局所変数は出来ないってのも COMETII に合ってそうな感じ、おそらく。
文字列型も宣言時に長さを決めておく必要がある(STRING S[20] みたいな)のも後々楽そう。

でも、構文解析は面倒そうな感じ。イヤな予感。

Oberon-0コンパイラを作ってみる・その後

2014年07月20日 | お勉強
Oberon 自体の日本語の解説がほとんど無いのでどうしたもんかと、途方にくれていたのだが。
Pascal から類推するにも限度があるし。
しょうがないので機械翻訳に頼って Oberon Language Report なるドキュメントを読んでみた。
おかげでようやく定義済み手続きの意味も分かるようになった。
今は翻訳の精度も随分と上がったもんだ。日本語の本を一通り読んでおけばある程度文意は理解できる。
正確につかめてるかどうかは知らんが、なんとなくでも分かればいいや。
ドキュメントなんだから妙な言い回しはしてないだろうし。

CASL II アセンブラの処理系依存

2014年05月08日 | お勉強
同一ファイルの複数プログラム(START,ENDの重複)。複数ファイル(ライブラリとか)もかな。
上記に絡んでのラベル名の重複(ローカルラベルの許容?)なんかもそうか。
マクロ展開(は想定があるから準拠すべきだろうし)。

大きなサイズのサンプルプログラムがないのでその辺を検証できなかったが、
奇特な人がいるもんで、ライブラリなんぞを作ってくれてるものがあった。
リンカは作れないので単にファイルをマージしただけだが、
5000行くらいのソースでも問題なく通ったので良しとしよう。
逆アセンブルの結果をざっと見ても間違いはなさそうだし。
シミュレータのテストもこれで出来そうだ。

Oberon-0コンパイラを作ってみる。

2014年02月02日 | お勉強
テキストがあるのだからとりあえずやってみよう。
ソースを丸写しするだけでも大変だ。

レコード型で躓いた。お手上げ。

EXCL と INCL が分からん。どこからなにを足し引きすりゃいいんだ?

パーサは動くようになったが、理解出来ない部分がちと多い。
まぁ、色々試してみれば分かることもあるだろう。

PL/0コンパイラを作ってみる・続きの続きの補足

2014年01月25日 | お勉強
CASL で DS 0 の意味がさっぱり分からなかったんだが、ここで活用できるとは思わなかった。
ラベル用に NOP 命令を利用しているのだが、これをどう除去しようかと思案してたところ。
分かり易いし、れっきとした命令なんだからとは思いつつ、1語使うのは無駄だったから。
とはいえ、DS 0 だと超不自然なのはたしか。ぴったりの用途なんだけど、どうなのか。
まぁ、デクリメントに LAD 使うんだから同じようなもんか。ソースを見る訳じゃなし。

2進10進変換のサブルーチンもどうにか出来たので ! 文も正しく動くようになった。
シフトを利用した割り算がどうにも理解出来ないので引き算でお茶を濁しておく。
ステップ数が異常に増えるがとりあえずは動くこと優先で。動いてるうちは楽しいからな。