オレオレ言語

node.jsでWASMを吐くコンパイラを作っています。まだ完成には至っていません。少々放置していましたがまた新たな言語を作り始めてます。 ■オレオレ言語の中間成果物として作ったもの https://qiita.com/SFPGMR/items/427a0ac38338e659fe4a 続きを読む
3
前へ 1 2 3 ・・ 77 次へ
S.F. @SFPGMR

データ型としてunsignedを追加するかどうか迷ってきた。。

2020-06-01 07:00:12
S.F. @SFPGMR

型に応じたデータ変換のうち、reintepretはちょっとJSでは難しいかなと思ったけど、TypedArrayとDataView使って簡単にできたんだった。。

2020-06-01 06:59:16
S.F. @SFPGMR

type conversionのwasm instructionをJSで使えるようにしてみた。全部使うかわからんけどね。 pic.twitter.com/chtdeWp3Mx

2020-06-01 05:15:15
拡大
S.F. @SFPGMR

あとはPseudo Typeの型変換をどう考えるかですな。。

2020-05-31 18:56:31
S.F. @SFPGMR

型変換に関して、FIXED SIMDのことすっかり忘れとるなあ(笑)

2020-05-31 18:53:26
S.F. @SFPGMR

というわけでwatでヘルパライブラリを書いている。簡単ではありますが。 pic.twitter.com/TM1PN4PejI

2020-05-31 18:49:59
拡大
S.F. @SFPGMR

簡単にやるにはwasmでreinterpretを行う関数を作ってJSで実行するのがよいと思う。ほかの変換もそれでいいかもしれないな。

2020-05-31 18:02:46
S.F. @SFPGMR

定数式の場合、この型変換はコンパイル時にJSでエミュレートする必要がある。が、reinterpretの処理が結構面倒である。

2020-05-31 17:59:55
S.F. @SFPGMR

対して f32.const 1 i32.trunc_s はスタックにi32型の値「1」がセットされる。少数以下は切り捨てになる。

2020-05-31 17:41:23
S.F. @SFPGMR

reinterpretというのは同じビット幅を持つ整数と実数をビット列はそのままに型変換するというやつ。 f32.const 1 i32.reinterpret_f32 これを実行するとスタックにはi32の0x3F800000が入る。wasmのスタックに入ってる値は型情報を持っているということですわな。。

2020-05-31 17:37:25
S.F. @SFPGMR

型変換構文はTypeScript風である。 a:i64; b:f32 <i32>a;// wrap <f64>b;// promote reinterpret <i64>b; // reinterpret 型変換構文がどの命令を選ぶのかは変換先と変換元の型で決まる。

2020-05-31 17:01:22
S.F. @SFPGMR

wasmは型変換のインストラクションがある。これをまんま構文に当てはめていこうと当初考えていた。 1.整数<-->実数の変換 ・convert_u/s,trunc_u/s 2.bit幅の変換(32bit <--> 64bit) ・wrap,extend_u/s,demote,promote 3.破壊的変換(reinterpret type conversion) ・reinterpret

2020-05-31 16:43:31
S.F. @SFPGMR

定数式処理を実装している。今は型変換をどうしようか考えているところ。定数式であっても型チェックを行い、型が異なる場合はエラーとするつもりである。暗黙変換は行わない方向で進めているから、型変換の構文は必要である。

2020-05-31 16:24:58
S.F. @SFPGMR

これは式の記法になるというよりは、記法に近い(似ている)並びというか実装になるということですな。。

2020-05-30 18:48:44
S.F. @SFPGMR

LispというかS式にある種の美しさを感じるのは私だけではないはず。そんなに知らないのにこう言うのは何だが。

2020-05-30 18:23:11
S.F. @SFPGMR

これがS式だと (i32.add (i32.const 1) (i32.const 2) ) とこうなって演算子が先に来る。

2020-05-30 18:14:30
S.F. @SFPGMR

しかしwasmのフラットモードだと式は逆ポーランド記法っぽくなるよな。 i32.const 1 ;; スタックに積む i32.const 2 ;; スタックに積む i32.add ;; スタックから左辺値・右辺値を取り出して加算し、スタックに積む まあ、どうでもいいことだが。。

2020-05-30 18:13:07
S.F. @SFPGMR

違うか。ASTの時点で式ツリーはポーランド記法で書いた式と等価な内容になっているのかな。

2020-05-30 18:09:38
S.F. @SFPGMR

wasm S式で式を書くとポーランド記法になる。LISPもそうなるのかな。同じS式だからね。。 pic.twitter.com/te1MIrzotM

2020-05-30 18:02:43
拡大
S.F. @SFPGMR

これは結局式の中置記法を逆ポーランド記法に変換しながら計算するということになるんだよな。確か。

2020-05-30 17:58:45
S.F. @SFPGMR

式を処理する関数は、関数を再帰的に呼び出しながら式ツリーを辿っていき、値(変数の値やリテラル)に到達したら計算しながら戻る感じなんだよね。

2020-05-30 17:55:30
S.F. @SFPGMR

このあたりを読むと結構面白いと思う。 graphics.stanford.edu/~seander/bitha…

2020-05-30 17:28:08
S.F. @SFPGMR

ビットの並びを反転させるというのも最初見たときは???だった。理解できたときは嬉しかったのでQiitaに書いたほどだった。 qiita.com/SFPGMR/items/4…

2020-05-30 17:26:25
S.F. @SFPGMR

ビット演算のハックも面白い世界である。

2020-05-30 17:23:20
S.F. @SFPGMR

ローテートの元ネタはこれ。これをBigIntでやってるだけ。 github.com/dfrankland/bit…

2020-05-30 17:21:20
前へ 1 2 3 ・・ 77 次へ