プログラミング初めで作った言語「
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言語目を達成しようと、ReScript、Effekt、Ceylonを追加しました。新しい言語の育て方、いろいろ勉強になります!
links
- プログラミング初め、WebAssemblyを出力するJSサブセット言語「Mochi」