「Geo3x3 - Supported Languages」
94のプログラミング言語に対応 (JavaScript / TypeScript / Zen / C / C++ / C# / Swift / Java / Python / Ruby / PHP / Go / Kotlin / Dart / Rust / Haskell / OpenVBS / VBScript / Visual Basic / Scala / R / GAS / Nim / Lua / Perl / Elixir / Groovy / D / Julia / Racket / OCaml / Erlang / Clojure / F# / Haxe / Scheme / Common Lisp / Elm / Hack / PureScript / CoffeeScript / Objective-C / Frege / Eiffel / Ada / Free Pascal / Crystal / Forth / Bash / AWK / Vim script / Vim9 script / IchigoJam BASIC / GnuCOBOL / MoonScript / Octave / Emacs Lisp / Fortran 90 / MariaDB SQL/PSM / PL/pgSQL / Tcl / V / Pike / Io / Wren / GNU Smalltalk / JScript / Pharo / Scratch / Standard ML / なでしこ / Kuin / ClojureScript / HSP / Reason / THPL / Janet / Phel / Raku / 文言 / Vala / SmileBASIC / Small Basic / Flix / PowerShell / Koka / Zig / BanchaScript / AssemblyScript / Clawn / FORTRAN 77 / orelang / Laze / WebAssembly)
「in WebAssembly」
同じアルゴリズムを書いているので、どんな言語かざっくり見るのにも便利です!お気に入りの言語、ありますか?
「geo3x3.wat - Geo3x3」
WebAssemblyのテキスト表現WATファイルでのGeo3x3はこんな感じで、LISPで有名、S式で記述します。変数取得が local.get、変数への代入が local.set と、先頭に必ず命令が登場するので冗長になり勝ちです。コンパイラさんの気持ちになれます。
「Index of Instructions — WebAssembly 2.0 (Draft 2022-12-15)」
命令はこちらに全部載ってます。欲しい命令を探してやってみて動けばOK!ローカル変数は local で関数の先頭で宣言して、メモリに1byte書き出す i32.store8、整数を実数にする f32.convert_i32_u、逆の i32.trunc_f32_u など、いろいろ駆使して作ります。
1ファイルで完結させるため、main関数を作り、外部に出力用の関数があることを想定した作りになっています。実行ランタイムは一緒に作った、DenoだけでOK、WebAssemblyのアセンブラ&ランタイム「wata.js」です。WASI対応もいいかも。
「WebAssemblyの歴史について」
誕生して5年、今ではどのブラウザでも普通に使えるようになった「WebAssembly」。その歴史がまとまった記事がありました。NaCl+asm.js→WebAssembly だったんですね!LLVMに組み込まれたのも大きい!
「Issues - Geo3x3」
Geo3x3に、もしお気に入りの言語がなければぜひ、対応予定言語が並べているIssuesに追記ください。最近見つけた4言語を追記しています。チャレンジしたい方、ぜひ!