男npm,direnv,node-casl2-comet2らによるアセンブラ体験

ちょっとだけCASLⅡとCOMETⅡ絡みのおべんきょがあった

流石に4日だけじゃ0からスタートして浮動小数点のIOと四則演算の実装なんてのは無理だったな

内容

ひみつ♡(もうちょい経ったら後悔するかも)

CASLⅡとCOMETⅡのシミュレーション環境といえば

IPA本家のライブラリ(Javaで動く)

こ↑こ↓ でもオラJava使ったことはねぇし,Java SE 8はライセンスがダメで無料じゃ使えねぇって聞いたぞ… 触ったことのねぇJDKってやつやOpenJDKってやつやAdoptOpenJDKってやつに立ち向かって環境構築して,そっから更にCASLⅡとCOMETⅡに触れるってのは,いくらなんでも素人には無理があっぞ!

いろんなWebサイト

でもオラ途中でぜってぇ嫌になっぞ!VSCodeとterminalでパチパチやりてぇんだ!

古の謎exeファイル

macOS Catalinaが実行を許すわけねぇだろ!?

救いの手

最強のCASL2/COMET2環境 by @maxfie1d ひゃ〜,こりゃどえれぇガチプロ様に出会った!オラとてもラッキーだ! npmなら昨年ちょこっと触ったことがあったからな!いける気がすっぞ!

方針

  • npmがあるといいよね
    • nodeはそんなに関係しないよ
  • direnvで環境を組み分けよう
  • node-casl2-comet2を利用させていただく
  • ついでにVScodeの機能拡張についてもだな…
  • すみません,まだbashを使っています…
    • そもそも開発者ではないので…nodeあたりのツッコミどころ満載ですよね.すんません

準備

homebrewを揃える

同じような情報はいっぱいあるだろう,それを踏まえながら公式サイトを見れば良いのではないか…?

node,nodenv,npmを揃える

$ brew install nodenv
ここで$PATHチェックだ
export PATH=$HOME/.nodenv/shims:usr/local/bin/nodenv:$PATH
$ source ~/.bashrc

人によっては違うかもしれねェが…ウチのnodenvnodenpmもコレで動き続けている…

$ nodenv install -list

今回はそこまで関係ないと思うが,取り敢えず新しいものを入れておこう…

$ nodenv install 15.3.0

すると勝手にnpmがついてくるはずだ…ということで

$ node -v
$ npm -v

を打ってちゃんとバージョンが表示されたら成功だ…

direnvを揃える

今回のサブ主役だ…

$ brew install direnv
ここで$PATHチェックだ

詳しい動作はあとでやるがここでおまじないだ,この文

eval "$(direnv hook bash)"

.bashrc付け加えてからもう一度

$ source ~/.bashrc

詳しい解説はいまさら direnv の解説 by @ngyuki にある,そちらを参照されたし… 更にこれが有名かどうかわからないので公式ドキュメントを貼っておく. bashhookしたのは見てわかるけど,なんでコレで動くのかがわからない…

node-casl2-comet2を揃える

アセンブラファイルを置いときたいディレクトリに行ったら

$ npm install @maxfield/node-comet2

なお,npm initをする必要はないもよう

えっグローバルインストールじゃないやん

たしかにIPAの試験に立ち向かうためならいっそ気合入れてグローバルインストールしても良いかもしれません. その場合は

$ npm -g install @maxfield/node-comet2
$ npm root -g

でちゃんとパスを確認して,通ってなかったら同じ要領でパスに追記してあげてください… そしたらdirenvの出る幕もないと思われます…

(私はただ-gに入れた後の管理をやりたくないからやめといただけです)

VSCodeのインストール

同じような情報はいっぱいあると思うけど,とりあえず公式サイトを読めばわかるんじゃないかな…?

ここで$PATHチェックだ

⌘+Pで出てきた場所に>Shellって打つとShell Command: Install 'code' command in PATHって出るのでやっておこう,/usr/local/bin/codeのシンボルが生成されるのでbash$PATHのレンジに入る

ここで$EDITORチェックだ

更にさっきの要領で

export EDITOR=code

を継ぎ足して

$ source ~/.bashrc

…これでデフォルトの$EDITORVSCodeになったよ!他のエディタ?知りませんね…

direnvの本領発揮

node-comet2のシンボルは./node_modules/.binにあるがそんなパスは用意していないし,かと言ってわざわざ.bashrcに書き込む気も起きない,だからディレクトリごとにそこら辺を弄れるdirenvを召喚した…! (だからこういう場所で何も考えずに連打してもcommand not foundしか出ない,nodeとは事情が違う)

.envrcを作る

$ direnv edit

ここで$EDITORが通ってなくてエラーを吐かれてしまった…あると一発でVSCodeが開く

.envrcを書く

export PATH=$PATH:./node_modules/.bin

保存OK?

direnvを起動させる

その場で

$ direnv allow

はい,これでこのディレクトリの変数が書き換わりましたっ…!

ちなみにそこから出ると

direnv: unloading

また入ると

direnv: loading ~/xxx/yyy/.envrc

実験

ここからがようやくいよいよアセンブラの世界だ…

ファイル生成

$ touch test.cas

アセンブリファイルの拡張子は.casで固定っす.

ファイル編集

超絶簡単なモノで良いっすか?

IO      START
        IN      INPUT,   INPUTL
        OUT     INPUT,   INPUTL
        RET
INPUT   DS      256
INPUTL  DS      1
        END

本当にただ吸って吐くだけなんですけど… (アセンブラそのものに関しては,ちゃんとすごい人の記事をみなさま読んでください,私も読もうとしています)

コンパイル

$ node-casl2 example.cas 

これでよし (オプションとかは製作者様のgithubを参照)

実行

$ node-comet2 example.com

実行ファイルの拡張子は.comで固定っす. するとこんな画面が現れます

PR  #0000 (     0) [IN     #0007, #0107        ] STEP 0
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
> argaethasjtsrjryjs
PR  #0003 (     3) [OUT    #0007, #0107        ] STEP 1
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
argaethasjtsrjryjs
PR  #0006 (     6) [RET                        ] STEP 2
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s

> sは実行オプションで

h    対話モードのヘルプを表示します。
q    プログラムの実行を終了します。
r    対話モードを終了してプログラムを実行します。
s    命令を1つ実行します(ステップ実行)。

のどれかを押してEnterすると進みます

そう,レジスタや関係する主記憶の動きを刻々と追跡できる!これはすげぇ…

経過が要らないなら

$ node-comet2 -r example.com

それでも入力が求められた時は流石に止まりますけど…

感想

ライブラリが整備されているCってとっても高級な言語なんだなぁと… 符号付き整数のIOの実装だけで苦しみました,浮動小数点のIOの実装なんて今の私には全く無理でした…ヒェッ…

おま○け

CASLⅡ・COMETⅡむけのVSCode拡張機能!…も,@maxfie1d様製だった… これがガチプロの世界か… (色々やれることが多すぎてまーったく使いこなせてないけど補完は助かる) f:id:Soluna_Eureka:20210825201137p:plain