Loading

S.F. Info.

S.F.@SFPGMR

2022/4/29 14:04:04

春季県大会、専松ー習志野は1-8で習志野がコールド勝ちか。。銚子商が勝ち上がればベスト8で対決となるのか。。

2022/4/29 14:11:29

ベスト8は

習志野
木総
中央学院
東京学館
市立船橋

まで確定で、

・銚子商ー暁星国際は延長

そして、

・拓大紅陵ー市立柏は雨天順延
・西武台千葉ー東海大浦安は雨天順延

なんで明日以降確定になるんですな・・

2022/4/29 14:13:05

やはり秋・春の大会は番狂わせが起こるな。夏の予選はあまりそういうことはないが・・ああ、八千代東があったなあ・・あれはすごかったな。

S.F.@SFPGMR

2022/3/24 17:43:30

やはり式は式として書けるようにしないとこれではちょっとやっとれん!ってやっぱりなったんだよな。

2022/3/24 17:45:08

普通にwasmのインストラクションが書けて、式も織り交ぜるようにできればそれで十分なんだよなあ・・。って前思ってちょっとそういうの作ろうとしたんだよな。確か。

2022/3/27 16:22:28

そういうわけで過去にパーサ作りまでで放り出した言語の、binaryenに橋渡しする部分のコードを書き始めている。とりあえず文法を思い出すところから始めてる。実はbinaryenの助けを借りれば、wasmのコード生成や最適化はbinaryenに任せることができるので割と簡単に書けたりする。 https://t.co/ZgdEmO77Bq

2022/3/27 16:26:55

パーサもpeg.jsというのを使って書いてるから、ここも文法さえきちんと決めることができればそんなに大変でもないんだよね。しかしこの文法を決めるのが私にとってはすごく大変なことで、まあ悩みに悩むところではある。自由度が高すぎて決めきれない感じなんだよな。

2022/3/27 16:37:47

wasmのmemoryに対するロード・ストア・演算をC言語風の式で書けるようにすればいいんじゃないかなあ?って思ったのはつい先日だけど、2-3年前もそう思ってたみたいでそういうwasmのインストラクションを生成する薄いラッパみたいな言語を作ろうとしてたようだ。

2022/3/27 16:38:29

でそのコードを見てこれでええやん!ってなってまた続きを作り始めた次第である😭

2022/3/27 16:42:53

今作ろうとしているゲームシステムは、昔のHWの構成を部分的に真似たものになってるんですな。メモリ・マップド・I/Oのエミュレーションみたいな感じですな。言い換えると、共有メモリを使ってWebGL2・WebAudio・JS・WASM間で情報の受け渡しを行うって感じですわ。

2022/3/27 16:54:36

VRAMやスプライトバッファみたいなものをTypedArrayで作って、そこにJSやWASMから書き込むと、GPUシェーダがそれを読んで画面に書くんですな。なのでゲーム中の処理はメモリから読んで演算してメモリに書くっていう感じのものが多くなる。こういうのってJSではちょっと書きにくいんですわ。

2022/3/27 16:57:20

書けないことはないけど、ちょっと面倒くさい。wasmだとメモリの読み書きは自在にできるけど、オフセットが数値のみの指定でこれまたつらい。これを定数変数で指定できるようにしたのがmwasmなのだが、しかしwasmのテキストモードで書くのはちとつらい。

2022/3/27 16:59:49

かといってrustやAssemblyScriptでwasm部分を書くと、wasmのメモリマネジメントの部分が若干抽象的になってしまうんですわ。言語にいろいろ任せられる一方、メモリの内容がどうなってるのかわかりにくくなるってことなんですわな。

2022/3/27 17:02:22

私が作ろうとしてるゲームのようなものは、ある程度自分でメモリマネジメントができるんで、ヒープとかガベージ・コレクタはいらなかったりするんですわ。あらかじめメモリをどう利用するかとか利用する容量とか決められるんでね。その枠内で処理を進められるからね。

2022/3/27 17:05:33

メモリはあらかじめ最初に10MBとか決めておいて確保して、そのなかのオフセット0~65535まではVRAMレミュレートに使って、65536~128Kまではスプライトメモリ、そのあとはオーディオ用としてXXK確保とかそういう感じで決めれるということなんですわな。

2022/3/27 17:14:04

wasmのメモリはスタックやローカル変数用のメモリとは切り離されてるから、そういうのに汚染されることもないんだよね。確保した分は全部自分用に使うことができるんだよね。

2022/3/27 17:22:12

で今考えて実装している言語というのは

・変数の値=メモリオフセット
・変数の参照=変数の値の位置にあるメモリの値
・変数への代入=変数の値の位置にあるメモリに値を書き込む

とまあこういう感じになってるのですわ。

2022/3/27 17:35:46

wasmのメモリ定義って領域確保しかできないんだけど、今作ってる言語はそれに加え、変数定義できるようになってるんですな。で変数の型に従って自動的に変数に格納するオフセットが計算されると。この言語では変数はこの中でしか定義できないようになっている。 https://t.co/jlSmqOAlAD

2022/3/27 17:37:49

もちろんwasmでいうところのグローバル変数やローカル変数も定義できる。が、メモリに対する演算をするっていうのを志向するんで通常の変数はこういう仕様にしている。この言語には変数スコープすらない。

2022/3/27 17:42:17

メモリ定義の例(実際まだ動いてないのになんだが😅)

こんな感じで変数を事前定義して、これを関数内で使ってごにょごにょやるわけですな。このへんかなりCOBOLのWORKING-STORAGE SECTIONみたいな感じもするな😅 https://t.co/gJcVX8TFdO

2022/3/27 17:46:59

関数とかはこんな感じですわな。構造体ももちろん定義できる。配列なんかももちろん使えますわ。しかし配列は可変長ではなく固定長のみである。ローカル変数や引数はwasmと同様$が先頭に付く。構文見てもらうとわかると思うけど、式以外はほぼwasmをなぞっている。for/whileなんかももちろんないよ😅 https://t.co/8lNyElTHrk

2022/3/27 17:51:59

これを前に作ったmwasmで書くとこうなるんですわな。これは純然たるwatではないので注意だけど、結構長くなるんだよね。 https://t.co/0AVScLhzPz

2022/3/27 17:53:29

load とstoreが頻発するんで書いてるとめんどくさくなってくるんだよね。

2022/3/27 17:56:02

定数(定数ラベル)もまあこんな感じで定義できるようになってるというわけですな。 https://t.co/mC4ZjXufRF

2022/3/27 17:58:41

C風に式やステートメントが書けるwasmテキストフォーマットって感じのものを志向してるのですわ。

2022/3/30 6:11:41

ほったらかしにしてるうちに、wasmでmulti-valueも使えるようになってる。これは関数の戻り値としてtupleを使えるようにすのが主目的だとなんだと思う。これつまるところ、スタック操作の拡張なんだなとProposalを読んで思った。pickとかね。

multi-value/Overview.md at master · WebAssembly/multi-value · GitHub
Proposal to add multi-values to WebAssembly. Contribute to WebAssembly/multi-value development by creating an account on GitHub.

2022/3/30 6:13:27

このProposalがどこまで取り込まれたのかよくわからんけど、キャリー付きの演算命令とか、マクロ、そしてさっき言及したpickなどのスタックから値を取り出す拡張命令なんかも入ってるんだよね。単に複数の値を返すだけの提案ではないんだよな。

2022/3/30 7:05:56

1.1のドラフトを読む限り、pickやマクロは取り込まれてはいない。Result Typeがvec(valtype)になってるので、やはりMulti ValueのProposalはすべてが取り込まれたのではないんだな。どっかでこの議論を読んだきがするんだがなあ・・

No Image
WebAssembly Core Specification

2022/3/30 7:09:54

binaryen.jsのMulti Value Operationを見るとなんとpush/popが疑似命令で実装されていた。そしてtuple.make/extractなんていう疑似命令も。

GitHub - AssemblyScript/binaryen.js: A buildbot for browser & Node.js builds of Binaryen, a compiler infrastructure and toolchain library for WebAssembly.
A buildbot for browser & Node.js builds of Binaryen, a compiler infrastructure and toolchain library for WebAssembly. - GitHub - AssemblyScript/binaryen.js: A buildbot for browser & Node.js...

2020/5/5 10:13:00

v8ブログに載ってたwabtに入ってるwasm-decompileを使って作成中のモジュールをdecompileしてみた。抽象的な言語コードにデコンパイルされるのだが、確かに読みやすくてデバッグに有効かも。左がデコンパイルしたやつで、右がwat版の同じ関数。
#webassembly

v8.dev/blog/wasm-deco… https://t.co/UtDo6kMRBx

2022/3/30 8:31:50

自分スレッドをまた追っかけると。しかしこれはまた長いスレッドですわ😭

2020/5/14 17:20:41

がしかしこのMultivalueってどこまで規格に取り込まれるのだろうか。finishedになってるから全部なのかなあ。。

github.com/WebAssembly/mu…

2022/3/30 8:38:15

まあMulti ValueのProposalで一番気になったコードがこれなんですわな。pick使ってスタックだけで階乗関数を実装しているやつ。 https://t.co/hoavPpCTuE

2022/3/30 8:38:55

ただここの部分

(pick 1) (pick 1) (i64.mul)

(pick 0) (pick 1) (i64.mul)
じゃないかと思うんだけどなあ・・

2022/3/30 19:29:01

このサンプルにあるphisっていうのはΦ関数のことっぽいが定かではない😅
このΦ関数はSSAにおいて挿入されるΦ関数のことであると思われるがこれもまた定かではない😰
ーー
An iterative factorial function whose loop doesn't use locals, but uses arguments like phis.

2022/3/30 19:38:33

自作ゲーム用のコンパイラ(というよりはwasmテキストモードもしくはbinaryen用のトランスパイラ的なものだが)を作っててこのMultiValueあたりを調べてるうちに「コンパイラ知識のなさ」というのを痛感し、ちょっと凹んだのを思い出したな・・

2022/3/31 6:08:01

peg.jsはpeggyjsに引き継がれたのか・・。

GitHub - peggyjs/peggy: Peggy: Parser generator for JavaScript
Peggy: Parser generator for JavaScript. Contribute to peggyjs/peggy development by creating an account on GitHub.

2022/3/31 6:18:30

peggy(peg.js)のドキュメントを見直すに、パーサーの処理結果をASTでなくbinaryen.jsのModule(Module Treeとでも言うべきか)を生成することができそうな気もしてきたな・・。

2022/3/31 7:11:17

しかしこのpeggyもまた停滞が始まっている模様・・

2022/4/1 19:26:21

peggyとbinaryen、そして自分でかいた(はずの)パーサーコードを睨んで、どうやれば一番すっきりというか、無駄のないコードになるのかをここ2日ほど延々と考えてるところ。今のところこれだ!っていう状態には至っていない。どころか自分の書いたパーサのコードでさえ「はて?」ってなってる😭

2022/4/1 19:27:34

しかしまあこれで唸ってるだけで1日の余暇の時間が過ぎるのが早いこと早いこと・・

2022/4/1 19:29:40

寝てる、もしくは気を失っているのはないかと思うほど時間が経つのが早いのだ😥

2022/4/1 19:30:38

まあしかし今日は昨日の地震でちょっと眠りが浅くなってしまって1日眠かったんでもう寝ることにしよう・・

2022/4/2 8:10:07

やっぱりあれですな。

1.プリプロセス
2.自前AST生成
3.ASTからbinaryen irに変換
4.binaryen.emitBinary()でバイナリ生成

っていう順番で行くのが無難ですわな。

2022/4/2 17:08:16

binaryenのIR=wasmではないんだよな。かなり前に、途中で「あ、これwasmまんまじゃないんだ。中間表現なんだ。」って気づいたんだよね。なのでfuncでもifでもブロックを挟まないといけないとか、微妙な違いがbinaryen IRとwasmではあるんだよな。

2022/4/2 17:09:21

しかしその違いの細かいところはすっかり忘れてるので、またこのドキュメントを読み返す必要があるのだった😭

No Image
binaryen | Compiler infrastructure and toolchain library for WebAssembly
Compiler infrastructure and toolchain library for WebAssembly

2022/4/5 5:29:22

パーサのテストコード書いてバグ出し→修正のプロセスをここ数日繰り返している。この作業が私にとってかなり苦痛である。が、あきらめずぼちぼち進めようと思う。「いずれ終わる」という楽観的思考で進めますわ。

2022/4/5 7:38:00

binaryen.jsでdataセクション(セグメント)を設定するのはどうするんだ?ってなった。

setMemoryのsegmentsで指定するんだな・・。 https://t.co/2IACus3bpN

2022/4/7 6:55:43

ひたすらパーサのテストコードを書き、テストし、パーサのソースを修正するということを繰り返してる。ちょっと中だるみですな・・。なかなかコードジェネレートのところに進むことができんですわ・・。

2022/4/7 6:58:29

過去に作ったパーサなんでなんか特殊な仕様を付けようとしてた部分もあり、そこが今に至りトラップとなっているという😭これ何のために??っていうのを思い出すが大変なのよね・・😥

2022/4/7 7:00:39

例えばこの「エレメント識別子」やらも、ナニコレ??ってなっている。自分で考えて書いたはずなのだが😥 https://t.co/iKPsG1hFqU

2022/4/7 7:01:19

多分table関係なのかなと思うけどね。

2022/4/7 7:04:48

peg.js -> peggy.jsになって、エラーメッセージがこんな感じで出せるようになったみたい。 https://t.co/ry8t0wGhUU

2022/4/7 7:20:48

おお、確かに。。 https://t.co/G8ylSqgr4R

2022/4/7 19:08:47

エラーがわかりやすくなったな。シフト&ローテートオペレータの代入式がおかしいですな・・。評価の順序に問題があるんだろうなあ・・ https://t.co/zaFLSa1V2z

2022/4/7 19:52:03

ん?ローテート・シフトに代入演算子っているのかな🤔

2022/4/9 9:04:33

今書いたテストは全部通るようになった。網羅できてるかというと🤔 https://t.co/g7s4sQE3is

2022/4/9 9:05:56

ASTをbinaryenに引き渡す部分のコードを書き始めますか・・まだまだ道のりは長い・・

2022/4/9 9:09:38

コンパイルできるようになったらプリプロセスの部分を書こうかなと思ってるんだよね。。プリプロセスの部分は以前書いたmwasmのやつを改造して使おうかなと思ってるんだけどね。つまりメタ・プログラミングはJSを使ってできるようにしようかなと。

2022/4/9 9:12:21

mwasmってコードジェネレートする部分書いた感ないなあ・・って思ってたら実際書いてなかった😥
watのプリプロセッサだもんね。当り前ですわ。生成したwatはwabtに渡してwasmバイナリにしてたんですな。

2022/4/9 9:13:49

いやでもコードをbinaryenに引き渡すやつ書いたよなあ・・って思ってたらこれだった。

No Image
オレオレ言語を作る

2022/4/9 9:15:00

この言語よりもさらにwasmに寄せようとしてるのが今の言語なんですな・・。まあこのsgl2っていうのもできてないんだけど😅

2022/4/9 9:16:17

ベクトルの式をwebglみたいに簡単に書きたいって思ってたんだよな。あと行列もか。

2022/4/10 20:28:56

コードジェネレート部分を考えつつ家の掃除、車洗車、用事で出かけたりしてたらもう夜ですな・・休日もあっという間に過ぎますな😅
このコードジェネレート部分も悩ましいところであることは間違いない。なにせまともに実装したことない領域だもんでね。binaryenに助けてもらうにしてもね。

2022/4/10 20:30:51

昔コードジェネレート部分書いてる途中でほったらかしにしてる言語のコードジェネレート部分を見直していろいろ思い出そうとしてるんですが、もうすでに眠くなってるんで、本格的には明日からになりますなあ・・。

sgl2/generateCode.mjs at master · sfpgmr/sgl2 · GitHub
TDOPパーサをベースとした言語を作っていく. Contribute to sfpgmr/sgl2 development by creating an account on GitHub.

2022/4/10 20:32:55

このsgl2という言語はTDOPパーサ使ってパーサ部分は書いたんですな。まあこのTDOPっていうパーサアルゴリズムはすごくわかりやすいんですわ。

2022/4/10 20:35:51

悩ましいのはやはりデバッグがまともにできるように、ソースマップをきちんと出さんといかんところが一つのハードルとなってるんですわ。あ、その前にちゃんと意味のわかるエラー表示もしないといかんのだった😰
今のパーサが出すエラーはちょっと意味不明なんでね。

2022/4/10 20:39:53

意味不明というか、もともとの原因ではなく、間接的な要因でエラーが出力される部分が多いんで、何でこのエラーが出るのか?をパーサの動きを想像したり、構文を見たり、はたまたトレースログ見たりしないといけなかったりするところが多いんですわ。エラー表示に工夫が必要ってことなんですが。

2022/4/10 20:41:55

ちょっとこの辺も、使ってるpeggy.jsやらbinaryen.jsの理解が浅くて本来こうすればいいものを・・っていう部分も多分にあると思うので、もっと調べないといかんなあと。そこに多大な時間がかかるんですな。

2022/4/10 20:43:54

AssemblyScriptのコードを読むのもいいかもしれんのですが、これも結構巨大なコードなんで読むのに骨が折れるんですわ。でもお手本になるのは間違いないんだよね。私のコード読解力の問題ですわな。

2022/4/12 18:45:23

コードジェネレートの部分はbinaryen様のお力を借りたとしても、面倒くさいことこの上ないですな・・。それだけ私がヘタレだということなのだが。できる限り手をかけないでこの局面を乗り切りたいが、ヘタレなので手をかけないで済ますテクがないから手をかけないといけないのだ。なんだこりゃ😥

2022/4/12 18:46:20

なぜこれを放置したのか今になって理解したな😢

2022/4/12 18:48:48

しかし今回は、牛の歩みだろうが亀の歩みであろうが、遅くても一歩ずつ進めるんだという気持ちも強いのであった。ほんまか😅

2022/4/12 18:50:20

再帰というテクニックにより、思いのほか書くコードの量は少ないということもまた事実なのだが。この再帰というものを考え始めるとなぜか頭がこんがらがってしまうんだな、これが😭

2022/4/12 18:51:23

うんうん頭が無駄な唸りをあげ、疲れて惰眠を貪ってしまう感じである・・

2022/4/12 18:52:18

無駄なループとでもいおうか・・

2022/4/14 6:03:06

うーむ。改めてこれをを読もうとしたり・・

No Image
低レイヤを知りたい人のためのCコンパイラ作成入門

2022/4/14 6:07:37

ソース・インクルードことをずーっと考えてるんだよね。peggy.jsを使う場合、ソース・インクルードをどう扱えばいいのかなあって思ってね。それでヒントにならないかな?って思ってC言語の分割コンパイルの単元を読んでたわけ。

2022/4/14 6:13:53

C言語の場合、ヘッダファイルでコンパイルに必要な情報を提供して、.Cファイルごとにコンパイルしてオブジェクトにして、後でリンカでオブジェクトをまとめて1つの実行ファイルにするって感じですわな。

2022/4/14 6:17:19

今作ってる言語の場合は

1.コードジェネレート前にすべてのソースファイルを取り込み、1つの巨大なソースファイルにする。
2.そのソースコードをpeggyで作ったパーサでASTにする
3.ASTをbinaryen.js IRツリーに変換してバイナリ出力する

こんな感じで考えてるんですわな。

2022/4/14 6:19:55

それで3.のbinaryen.jsのIRに変換するときに、ソースマップの情報を与えることができるんだよね。これ入れるとソースマップが作られて、オリジナルの言語だけどブラウザのデバッガでステップ実行とかできるようになるはずなんだな。知らんけど😅

2022/4/14 6:45:41

最初にソースインクルードしてまとめるときに、どこからどこまでがもともとのファイルなのかと、行情報を持っておかないといかんのですわ。これをなんとかしてbinaryenにソースマップ情報として渡さんといかんのですよ。これがちと面倒くさいなあと。

2022/4/14 6:48:13

だがしかしその間にパーサによるパースっていうフェーズがある。peggy.jsで作ったパーサはその情報を受け取ってASTにうまいことくっつけることなんていうことはできんので、そこを自分で書かないといけないんですわ。しかしこのツィート書いてるうちに頭の中が整理できてきたな😄

2022/4/14 6:59:52

さらにマクロ使えるようにするってなると、デバッグ情報を引き渡すのにまた工夫が必要になってくるんですな。マクロは今回の言語では不要にしよう。やるならインライン展開かなあって思う。しかしデバッグビルドでできるようにするにはとても面倒だと思うので、デバッグビルド時は無効にするのかなと。

2022/4/14 7:00:11

なんてこと考えてたら、ああ、コンパイラにデバッグ・リリースビルドってあるけど、なるほどそういうわけかあ・・って妙に納得したりとかしてね

2022/4/14 7:04:28

プリプロセスもある程度固めとかないと、後で手戻りが発生しそうだなあってちょっと思ってる。
手戻りや再考の時点で放置リスクが最大になるんでね🤔

2022/4/14 7:07:54

やはりちょっとAssemblyScriptのソースコードまた読もうかな。過去なんどもチラ見してるけど、やっぱりあれくらい本格的になるとコード追うの大変なんだよね・・
contributeできるぐらいに精通してないと大まかに理解できないっていうなんか矛盾めいた感じが。

2022/4/14 7:10:05

cプリプロセッサのアルゴリズム解説。。おおお。
github.com/rui314/8cc/wik…

2022/4/14 7:34:46

ちゅうわけでAssemblyScriptのソースコードを読み始めた。。
まずはトークン分割から。。やはりトークン分割してパーサに渡す流れですわな。私は今PEGパーサジェネレータ使ってるんで、トークン分割とパーシングを同時にやってる感じになるんだよね。

assemblyscript/tokenizer.ts at main · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/4/14 7:42:58

トークナイザはソースコードから文字を1文字ずつ読んで、識別子単位で分割するって感じですわな。その時にRangeというオブジェクトでソースコード中の識別子の位置を記録して持っておくというわけですな。AssemblyScriptではね。

2022/4/14 7:49:22

私が欲してるのは自分の趣味嗜好を反映したものすごく汎用性の低いものなんだよね。そうじゃない場合はrustやAsemblyScriptで十分ですからな。そこを自分自身わきまえとかんとまた夢仕様を考え始めてそんなの無理って放置してしまうんで気を引き締めないとな・・

2022/4/14 7:51:32

まあ、トークナイザはまあまあこういうもんですわな。。これはこれくらいの理解でいいな・・。続いてパーサを読んでこうか・・ってやっぱり前読んだことあるなこれ。すっかりわすれてたが😅

2022/4/14 20:01:48

パーサーで気になるのはやはりimportの処理だわな・・これはもうAssembly Scriptのコードで真似できるならそれでいいな。それよりまず理解しないとな。

2022/4/14 20:17:54

parseImport()を読んだ。単にこれはimportのノードを作っただけのように見えるな。この段階ではまだpathからソースを読んでASTにくっつけるみたいことはしないのかなあ・・とするとどのフェーズでimportのソースを読むんだろうな・・

assemblyscript/parser.ts at d884ac8032b2bfa0caf26d4dc11d99c5a9543c13 · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/4/14 20:20:44

最終的にはimportしたモジュールも展開したASTができるんだろうけけどね。それをいつ・どこでやってるかですな・・

2022/4/15 7:23:30

今はcliのソースコードを読んでいる。
そもそも全体の流れを把握せず読んでたし・・まずこれを読むべきだった・・😭

assemblyscript/index.js at main · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/4/15 7:35:26

おお、ここだ😊

なるほどお・・
再帰的に呼び出してるって推測してたんだけど、まあ見た目再帰呼び出しでない感じなんで見過ごしてたわ・・
なるほどなあ・・

assemblyscript/index.js at main · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.
https://t.co/gDWSYU5g1X

2022/4/15 7:42:20

ものすごく簡略化していうと

1.パースしてimportファイルをキューにプッシュ
2.キューに溜まったimportファイルをパース
3.キューが空でない→2.に戻る
4.終了

な感じ。

2.でさらにimportがあればキューに溜まり、空になるまでパースすれば展開完了になるんだな・・

2022/4/15 7:43:52

重複したimportファイルの取り扱いもここで調整するんだなあ・・頭いいなあ・・

2022/4/15 7:44:42

やっぱりコンパイラを完成させられる人たちってすごいや・・😊

2022/4/15 7:47:04

そりゃparser.tsやcompiler.tsだけ読んでもわからんはずだわ。そこに書いてないんだもの・・でもまあよかった。大まかには理解できたな・・😄

2022/4/15 20:37:46

import した時の参照名と実際定義されている関数の名前と一致してるかとかのチェックはやはりパースが完了した後にやるんだろうな。それもソースコードを読み進めて確かめるか・・

2022/4/15 20:45:26

あ、そうだ。ついでに64ビット整数をどう扱ってるのかも勉強させてもらおう。なんか昔このドキュメントを読んでJSのBIGINTとWASMの64ビット整数の受け渡しできるやらできないやらを理解したつもりが、すっかり忘れちゃってるんでね・・

No Image
WebAssembly integration with JavaScript BigInt · V8

2022/4/15 20:46:24

V8の深堀なんかもすごく面白そうなんだけど、まあそれはおいとこう・・

2022/4/16 12:38:20

結局あれだな。文法に適合してるかどうかのチェックをしたらもうどんどんASTにしてしまって、あとからセマンティクスのチェックをかけるってほうが効率的だわな。実際。そしてAssemblyScriptのインポートのアルゴリズムでいけば、循環参照で無限ループになることもなさそうな気もするんだな。

2022/4/16 12:43:20

importはとにかく単純にまずソースインクルードでいいな。そしてAssemblyScriptのインポートアルゴリズムに倣って全部取り込んでAST化すると。そのあとセマンティクスのチェックをする流れですなあ・・。いやしかし、シンタックスとセマンティクスをごっちゃにしがちなんだよな。。

2022/4/16 12:44:25

No Image
compilers - プログラミング言語における構文と意味エラーの違い - de-vraag

2022/4/16 12:47:19

パーサで行うこと→文法チェック
ですわな。peggyだといろいろなアクションできるんで、セマンティクスなチェックを入れてしまったりしてややこしくしてしまいがちだが、シンプルに考えんといかんな。。

2022/4/16 12:47:45

シンプル・イズ・ベストですよ。

2022/4/17 17:42:04

まあそういいながら、コードを2行くらい書いただけで他の雑用でこの土日は過ぎ去ってしまったな・・
しかしpeggyのエラー周りの処理の中身とか少しチェックして理解できたんでよしとしよう・・

2022/4/17 17:44:36

まあ朝は朝で、svelteカスタムビルドしてるんでいつもの元レポジトリを取り込んでマージしたら大量にビルドエラーが出てそれなおすのに四苦八苦してたのもあるんですが😭
結構破壊的変化はある。私にとってはだけど。

2022/4/17 17:47:19

そしてまあ午後は佐々木くんの試合。いやあやはりすごい。本人も言ってたけど、今日は球数が多くて、6-7回あたりは少し疲れた感じだったもんな。試合はロッテの負けか。しかし日本ハムのピッチャーもこのシチュエーションであのピッチングはすごかったな。プロ野球選手ってやっぱりすごいわ。

2022/4/17 17:48:57

言語つくりはゆっくり進めよう。焦ってはいかん。。ロッテが佐々木君にしたように、じっくり大切に育てるようにしよう。

2022/4/20 6:05:07

ASTからbinaryenに引き渡すコードを書き始めてるが、いろいろ考慮漏れがあって手が止まるというか、考えてる時間が非常に長い。例えば変数のスコープとかね。

2022/4/20 6:07:43

WASMだと変数のスコープって

1.グローバルスコープ(グローバル変数)
2.ローカルスコープ(ローカル変数と関数引数)

この2つだと思ってるんだけど、1.、2.の変数が関数本体に現れた場合、仮に同じ名前だとするとどちらを参照してよいのかコンパイラに情報を与えないといけないんだな。

2022/4/20 6:11:08

実際ローカル変数へのアクセスは最終的には
local.get/local.set
だしグローバル変数だと
global.get/global.set
というインストラクションにしないといけないんでね。

2022/4/20 6:12:10

もっというと今作っている言語の変数は名前でアクセスできるようにしているけども、最終的にはインデックス値に変換する必要もあるからね。

2022/4/20 6:19:30

でグローバルとローカルが同じ変数名であった場合に

・既定はローカル変数であるとみなす

っていう考えでいた。しかしこれだとグローバル変数にアクセスできなくなってしまうんで、「この変数はグローバルですよ」ってコンパイラに教える構文が必要なのだな。そういうの忘れてたりとかね😅

2022/4/20 6:22:47

あと私の言語上ではメモリ変数という変数もあるんで、それも1つのスコープ。その中では名前の重複は許されないけど、ローカル変数スコープとグローバル変数スコープとの名前は重複しててもよいとすると、それを識別するための構文が必要ですわな。

2022/4/20 6:27:19

メモリ変数っていうのはWASMの線形メモリ上にラベルと型、大きさを事前定義してラベルを変数みたく使うっていうものですわ。これまあ私の言語上の話ですけどね。変数で線形メモリのデータを出し入れ(load/store)できるようにするってことなんですが。 https://t.co/jjX5OrVzqu

2022/4/20 6:31:24

アセンブラなんかにある機能を参考にしてるというかほぼまんまですが😅
関数のステートメント上では普通に変数みたくアクセスできるんですが、WASMレベルではオフセット計算してload/storeするインストラクションに変換されるわけですわな。変数は定義順にメモリにアサインされる。

2022/4/20 6:32:56

もちろんオフセットの先頭アドレスを明示的に指定できたりとかいう仕様も入れてるんですわ。スタックメモリはWASMでは線形メモリとは別の領域にあるんでそれは気にしなくていいんだよね。

2022/4/20 6:35:41

動的に確保するメモリとかってどうするんだ?っていうことなんだけども、いわゆるヒープっていうのは言語仕様としては存在しない。
必要であればライブラリで線形メモリ上に作るって感じですな。

2022/4/20 6:40:33

もし動的管理が必要な部分があればそこはJSに逃がすってこともできるしね。つまりはメモリは必要な分をあらかじめ静的に確保しておいて、その中でチマチマやるってことを想定してる。私が作りたいゲームはまさにそういう感じの言語仕様が望ましい。

2022/4/20 7:17:34

まだ迷ってるところとしては式あたりのところなんだよね。WASMはスタックマシンなんで、演算結果はスタックに置かれるんですわ。これをうまいこと使って冗長な操作を端折れんかな?っていうことも考えとるんですわ。

2022/4/20 7:22:17

例えばテンポラリな値の入れ物をわざわざローカル変数で用意せずとも、スタックで代用できないかなあとかね。
func hoge(a:i32,b:i32,c:i32):(i32){
stack = a+b;//a+bの値をスタックに
stack += c;//スタックの値とCを足してスタックに
//スタックの値をそのまま戻り値とする
return stack;
}

2022/4/20 7:27:29

このスタックを使った演算をもうちょっとわかりやすく書けんやろか・・って思っててね。

= a+b;
+= c;

ってだけ書けばよいってのはどうかなあとかいろいろ考えてるところですわ。

スタックなんで
= a;
= b+c;
+=;
って書けるなあとか、これはかえってわかりにくいなあとかね。

2022/4/20 7:32:11

=もなくして書けるのもいいのかもなあ?ってとかね。pegによる構文をかなり直す必要があると思うけど。

a+b;
+c;

しかしこれだと+cの+が符号を表すのか加算を表すのかわからんようになってしまうなあとかね・・。

2022/4/20 7:35:58

まあこういうことを考えてるのは例えばローカル変数を一時変数として使用してしまうと、
d = a+b;
d += c;
return d;
ってやるとWASMにコンパイルすると

local.get b
local.get a
i32.add
local.set d
local.get d
local.get c
i32.add
local.set d
local.get d
return;

こうなってしまうんだよね。

2022/4/20 7:39:02

まああの、binaryenに渡すんで最適化されるかもだけどね。これがスタックを一時変数として使えるとするとコンパイルしたときに

local.get b
local.get a
i32.add
local.get c
i32.add
return

こうなるわけですな。ローカル変数は疑似的なものですわな。最終的には整数インデックスになるけども。

2022/4/20 7:43:45

言語ソースからコンパイル結果がある程度イメージできるというか、1:1っぽくなるようにしたいっていうかね・・。せっかくWASMが式指向なんで、rustっぽくしたいなあっていうのはあるね・・

2022/4/20 7:47:30

スタックを言語上で意識して使えるようになると、関数呼び出しも引数あたりの処理で最適化できそうな気もするんだよなあ。

2022/4/20 7:47:59

ってなことを考えてたりすると時間はあっというまに過ぎるな😰

2022/4/20 18:58:17

webassembly 2.0のWorking Draftか。。

No Image
WebAssembly Core Specification

2022/4/20 18:59:49

それよりまずこれもう一度読み返そう。2年前と比べると仕様追加部分が加筆されとるんだよね。このドキュメントはとてもわかりやすいと私は思う。

WebAssembly テキスト形式の理解 - WebAssembly | MDN
WebAssembly を人間が読んだり編集したりできるようにするため、 wasm バイナリー形式にはテキスト表現が存在します。これはテキストエディター、ブラウザーの開発者ツールなどで見せるために設計された中間表現です。この記事では、テキスト形式のしくみ、生の構文、および元のバイトコードの表現との関係 (と JavaScript で wasm を表現したラッパーオブジェクト) について説明します。

2022/4/20 19:02:09

blockも考えたら引数持てるから、ブロック単位のスコープってのもできるんじゃないかな?とか思ったり。スコープとか別にコンパイラ側でなんとかすりゃいい話だけど、コンパイラが余分なランタイムインストラクションを吐かんようにしたいってのもあってね。WASMに寄り添う言語でありたいので。。

2022/4/21 6:12:44

blockの仕様を読んでるけど、やっぱりこの抽象構文ってえげつなく読みにくいなあ・・。
数学記号の意味が頭に入ってないせいかと思うんだけどね。

No Image
Instructions — WebAssembly 2.0 (Draft 2022-04-16)

2022/4/21 6:14:48

「⇒」は「ならば」の意だとかね。

2022/4/21 6:18:24

もうこのblocktypeの定義だけで「はあ?」ってなってる😭 https://t.co/MB1OSaKHIC

2022/4/21 6:31:39

なんとなく
tがresultならばtですよと。しかしかっこがついてる。かっこがついてるということは複数あるってことを表すらしい。「?」記号はoptionalってことなので、0以上のtのリストってことになるのかなあ?ってなぼんやりした理解でいいのか🤔 https://t.co/ndDqo1IJOl

2022/4/21 6:32:08

resultはさすがにわかりますわ。
(result i32)
みたいなのですわな。 https://t.co/jfpfrPRUtH

2022/4/21 6:37:43

ああ、「?」は「optional occurrence 」なんでそれ自体複数の可能性あるのか。 https://t.co/sZWvKgUpKT

2022/4/21 6:41:14

このtypeuseのお尻の下付きイタリックの「I」はなんやねん?とかなっている。 https://t.co/U0mYpxgkBh

2022/4/21 6:45:48

「x,I':typeuse」っていう部分は、「xがtypeuseだった場合」ってことかな。
そしてtypeuseってなんやねん?っていうのもちゃんと定義はある。

No Image
Modules — WebAssembly 2.0 (Draft 2022-04-16)

2022/4/21 6:48:49

そしてこの「'」だよな。これはなんとなくインスタンス化した実体(コピー)みたいなものを表すって気もするな。数学的には「プライム」って読むらしいな・・まあこの抽象記法が数学的な記法に沿ってるかどうかもわからんですが。「'」記号は文脈によって取る意味は違ってくるようだけどね。

2022/4/21 7:10:06

厳密に定義するとめちゃくちゃ長くなって書くのが大変だから、記号に意味を持たせて抽象化する(省略する)んですわな。

2022/4/21 7:10:41

まあこの仕様を読みこなすにはそれなりの知識が必要だってことですわな。

2022/4/21 7:21:24

とは言いながら、binaryen.js上のblockでは引数付きのblockサポートしとらんようですがね・・ https://t.co/hd9nAGDMGe

2022/4/21 7:40:40

まあおおもとのbinaryenのソース見てもやはりBlockは引数サポートしとらんね。ここはいったんスルーしよう。 https://t.co/CmVvLQVKwz

2022/4/22 7:42:58

昨日からじわじわと、コードジェネレート部分を実装している。なんと1日10数行レベル!
もうその行間に沸く疑問や謎が半端ないのだ。いかに自分の知識が薄いか、痛感しているここ数日なのである。

2022/4/22 7:46:24

まあしかし、実装のセオリーみたいなものが見えてきたのもまた事実。スピードは少しずつ上がっていくだろうと思ってはいるがしかし我ながら超遅いな😭

2022/4/22 7:48:37

今回はきちんとコンパイルエラー吐いて、デバッグビルドでソースマップ吐いてブラウザでデバッグできるようにしようと思ってるのでね・・。そこまでできたらVS Codeでデバッグとか、コード補完とかもできそうな気もしてきたりと。まあこれは今の状況では単なる夢想でしかないのですが😅

2022/4/26 5:27:11

やはりこの時期、やる気にムラが出るなあ。今はまったくやる気がでないな・・。5月病ですかな。

2022/4/29 10:10:13

ちょこちょこいじってはいるんだけど、進捗ははかばかしくないですな。仕事ではないんで追われるようなスケジュールもないからね😄
まあいつものことか😅

2022/4/29 10:15:41

なんかこう「再帰呼び出し」についていろいろ考えるところがあってですな。長考してることが多い。普通に考えて条件分岐が多い冗長なやつを書くんではなくて、再帰呼び出しでスマートかつ短いコードを書くことができんかな?って思ってね。

2022/4/29 10:17:10

「とりあえず動くものを今知っている方法で書く」のではなくて「自分にとってあまり過去書いたことのない手法で書いてみたい」って感じが強い。まあこれ私にとってなんで、他人が見ると「ふつう」ってことなのかもしれないけれどもね。

2022/4/29 10:19:10

長考して「続きはまた明日」ってなるんだけど、長考した内容を忘れてしまって、「あれ昨日なんでこんなコード書いてるんだ。何を考えてたっけかな?」ってなったりもしてるな😥

2022/4/29 10:23:10

デバッガが優秀なんで、途中までコードを動かしながら変数の中身を見てその先をどう書くか考えるようなやり方を取っている。期待したような変数の値にはなってないことも多くパーサコードの手直しも結構多く発生しているな。

2022/4/29 10:26:38

ちょっとこの記事を読んでから、私の考え方が少し変わったというか。逆に混乱してるのかもしれんけども。かなり影響を受けた気がする。

ABNF Parser の実装 | blog.jxck.io
IETF の RFC では ABNF 形式の表現がよく使われ、たまに実装することがある。しかし、実装するたびに前のコードを引っ張り出して思い出す、を繰り返しているので、自分用にメモとしてやり方をまとめる。完全に我流であり、目的は「その ABNF が正しいかを確認すること」な...

2022/4/29 10:27:47

この記事と今の私のコードの書き方とはまったく関係ないけどね。なんかこう見え方が変わったというかね。なんて言っていいのかわからんのですが。

2022/4/29 10:30:03

むしろパーサやコードジェネレータについて分かった気になっていたが、この記事を読んで私が何も理解していないということが分かったということかもしれんですな。

Wizordum 🧙‍♂️ (Wishlist me)@wizordum

2022/4/29 3:40:30

Secret, secrets, everywhere!🧙‍♂️#Wizordum
What do you like the most about secrets?

#indiedev #boomershooter #FPS #retroFPS #madewithunity https://t.co/yWW2amzauJ

t-sin@bak-shaver@sin_clav

2022/4/28 18:09:25

自作VST3のチップチューンシンセ、まだ不具合あるけどついに全機能の実装を終えたような気がするぞ…!?!?
波形表示機能はON/OFFが可能で(デフォルトOFF)、OFFになるとフレームレートを落とす感じ。
ぜんぶRustで書いていてソースコードこんな感じです。
github.com/t-sin/soyboy-s… https://t.co/7BmV8zSho8

ENgelou@EN_gelou

2022/4/22 23:15:13

40年前の音声合成LSIで遊んでいる https://t.co/NReLs6nIij

S.F.@SFPGMR

2022/4/22 5:17:21

そういえばsvelte kitのビルドシステムがこれに変わったみたいなんだな。

Turborepo

TAKUYA🐾個人アプリ作家@craftzdog

2022/4/20 23:02:40

このツイから4年、普通に食えるどころかとても良い暮らしが出来ているので戦略は間違っていなかったと今も思える twitter.com/craftzdog/stat…

yone™13 Pro®︎@yone

2022/4/20 22:42:23

最近レトロPC関連何もできてないので、NeXT (OPENSTEP) 設定してる。ネットワークをつなげたいところ。NeXTの美しいGUIにウットリしてる。 https://t.co/sqGAfFfL8k

相ダ@sg_m3_md_ss_dc

2022/4/21 3:13:17

#ゲーム制作  #MMF2 #CF25
巨大戦艦の攻略に時間がかかりそうなので後半に出そうかと…
本当はR-TYPEみたいに前半に出そうと思ってたんだけどね…ちと巨大すぎたw
没にもしたくないし
そのかわりに前回のラスボスの巨大戦艦を改良したものを出そうかと思いました https://t.co/81NwYlsjnB

James Swiney@JamesSwiney

2022/4/20 21:39:34

Another boss, might need some difficulty tuning yet #IndieGameDev #indiegame #shmup #pixelart https://t.co/tIOt0J8MTz