2023-01-03
プログラミング初めで作った言語「Mochi」は、JavaScriptのパーサーを使ってWASMを生成する言語です。せっかくなのでJavaScriptとしても動かせるように、拡張子を .mochi から、.mochi.js と変更し、型付けをシステムハンガリアン記法によって実装しました。最初のターゲット、Geo3x3のエンコード・デコードの記述に成功。Geo3x3の100言語目のサポート言語になりました!

こちら、すっきりシンプル、MochiによるGeo3x3への変換コード (geo3x3.mochi.js) import { i32, f32 } from "./mochi/std.js"; export function i_encode(flat, flng, ilevel, pccode) { let funit, i, x, y; if (ilevel < 1) { return 1; } pccode[0] = 'E'; if (flng < 0.0) { pccode[0] = 'W'; flng += 180.0; } flat += 90.0; // 180:the North Pole, 0:the South Pole funit = 180.0; for (i = 1; i < ilevel; i++) { funit /= 3.0; x = i32(flng / funit) y = i32(flat / funit) pccode[i] = x + y * 3 + 49; // 49='1' flng -= f32(x) * funit; flat -= f32(y) * funit; } return 0; } システムハンガリアン記法により、iではじまる変数と一文字変数は32bit符号付き整数(i32)、cは符号なし8bit(uint8)、fは32bit浮動小数、pで始まるものはポインタとして配列アクセスが可能。関数名も一文字目で返り値の型を表すという言語仕様。これでJavaScriptのパーサーそのままで静的型付け言語化ができました!

エンコードとデコードを合わせてWebAssemblyのバイナリに変換すると、524byte。元のJavaScriptのソースコードが1263byteなのでなかなかの凝縮感。ダウンロード時間も短くなり、速度アップにも貢献してくれそうです。

JavaScriptとしても動かせるので、下記のようにESモジュールとしてimportとして呼び出せます。WebAssemblyのメモリの替わりに配列を作って渡せばOK! import { pc2s, s2pc } from "../wasmutil.js"; import { i_encode, i_decode } from "./geo3x3.mochi.js"; const pccode = new Uint8Array(15); const res = i_encode(35.65858, 139.745433, 14, pccode); console.log(res, pc2s(pccode)); mochic.js(もちこ)でWASMかWATを生成したら、次のように呼び出して使えます。 import { importWASM } from "../wasmutil.js"; const { i_encode, i_decode, memory } = await importWASM("./geo3x3.wasm"); const pccode = 0; const res = i_encode(35.65858, 139.745433, 14, pccode); const pccodemem = new Uint8Array(memory.buffer, 0, 14); const code = new TextDecoder().decode(pccodemem); console.log(res, code);

WebAssembly用システムインターフェイスWASIにもオプションで対応可能な新プログラミング言語、Mochi。下記、GitHubでのオープンソースでお楽しみください!

「Mochi lang on GitHub」

IchigoJamロゴフォントで作ったMochi言語ロゴ、大事なことはIchigoJamで学べます。 今回、Geo3x3が実装できるくらいまで成長したコンパイラですが、コンパイラのコードの長さは212行とコンパクト!(Mochi.js on GitHub

1つのメモリ空間を自由に使えるWebAssemblyはマイコンのプログラムを作っている自由さと、ネットを含めていろいろつなげる楽しさがあります。IchigoLatteも、JavaScriptのサブセット。JavaScriptをC言語的に使う時代、到来です!


「Geo3x3」

せっかくなら自作プログラミング言語で100言語目を達成しようと、ReScriptEffektCeylonを追加しました。新しい言語の育て方、いろいろ勉強になります!

links
- プログラミング初め、WebAssemblyを出力するJSサブセット言語「Mochi」

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS