よくある質問
トラブルシューティングはこちら
printIntとprintLongで表せる数が同じなのはなぜか
Cの仕様で,intとlongの表せる範囲が同じになっている. 詳細:https://learn.microsoft.com/ja-jp/cpp/c-language/cpp-integer-limits?view=msvc-170
同じ範囲だが分けて関数を用意している理由は,型のチェックでコンパイルエラーになることを防ぐためである(Arduino関数にはintを返すものとlongを返すものが混在しているため)
GoでGoでなくTinyGoでビルドするのはなぜか
Go1.21からWebAssemblyへのコンパイルに対応した。 //go:wasmimport env fib
のようにつけると関数のエクスポートができるが、import用の仕組みは未対応などまだ発展途上の段階である。
またMahiwaではマイコンをターゲットをしており、厳しい制限の中で利用する必要がある。
これらを踏まえてMahiwaではTinyGoからのWebAssemblyコンパイルとした。
TinyGoも本来であればLLVMのtargetでwasm32-unknown-unknownを指定したいが,TinyGoのIssueにもある通りそれがまだ実現できていないのでやむを得ずwasm(wasm32-unknown-wasi)を利用しているを利用している.
TinyGoではwasiとwasmをtargetで指定できるが,内部的にはどちらもLLVMのターゲットをwasm32-unknown-wasiとしているため,現行最新のTinyGo 0.30の時点ではwasmを指定することを推奨している.
RustやGoなどUTF-8な文字コードに依存した環境で文字列を使用して問題ないか
UTF-8にはASCIIとの互換性が有り,数値やアルファベットであれば問題なく動作する. 一方で日本語や絵文字などは問題となり,
serial::println("😀");
のようなコードは,cargo build --release
でコンパイルは通り,シリアル通信でも
Project Mahiwa : WebAssembly launch
😀
上記のように出力できる←想定外
確実なのはASCIIで表現できる文字だが,一応UTF8の4byte文字でも出力できるっぽい?
Goのgoroutineはどうなる?
WebAssemblyは並列実行できない.
TinyGoの機能を使うとどうなる?
WASIを使うとどうなる?
LLVMではだめなのか
たしかにLLVMも多くの言語から多くのターゲットへの書き込みができる. 中間表現のLLVM IRでは最適化も期待できる.
LLVMを採用するメリット
実際,TinyGoではLLVMが用いられている
しかし
- ライブラリをフロントエンドの言語側に持つ必要がある
- C/C++でのライブラリ資産を活かしにくい
- LLVMのバックエンドにないマイナーなマイコンに対応できない可能性がある
の観点からWebAssemblyを用いている.
またLLVMは既にTinyGoという事例がある点も大きく,WebAssemblyでは実用的に可能かを検討したいという意味もある.