Udon VM 向けのコンパイラを作ろうとしている[1]

とりあえず Unity 外でコンパイル・実行できるようにした.ソース有
3
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

えっVRCでコンパイラ開発の需要が出てきたんです? 実は拙者プ言沼の人間でござるが……

2019-12-20 20:46:48
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

とりあえず今日は UAssembly に目を通しておこう

2019-12-20 21:16:11
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

ドキュメントがふわっとしていてよくわからんぞう

2019-12-20 21:34:14
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

とりあえず Unity 入れないとどうにもならなさそうだな

2019-12-20 21:59:36
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

VRC.Udon.Common.UdonProgram のコンストラクタに何渡せばいいのかさっぱりわからんな(bytecode はわかるけども)

2019-12-20 23:27:08
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

特に instructionSetIdentifier: string と instructionSetVersion: int はなんなんだ 我々はどうすればいいのだ

2019-12-20 23:27:55
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

<型名からドットを除いたもの>.__<メソッド名>__<引数の型1>_<引数の型2>_<略>_<引数の型n>__<返り値の型>

2019-12-20 23:38:35
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

これ static じゃないものも呼べるのか?

2019-12-20 23:39:05
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

これ型名からドットを抜いてるわけじゃなくて、使える API を dictionary 的なもので持ってて、そこで定義されてるものしか使えないっぽい匂いがするな

2019-12-20 23:52:38
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

問題は何がサポートされてるかが当然ドキュメントになってなく、最悪逆アセンブルが必要かも

2019-12-20 23:53:23
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

たぶんこのへんを管理してるのが VRC.Udon.Wrapper 以下にありそうだ

2019-12-20 23:53:59
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

えぇ、ExternSystemConsole あるが……

2019-12-20 23:55:08
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

こいつだけコンストラクタがなくて、ExternFunctionCall と GetExternFunctionParameterCount が static member になってるな。作りかけ?

2019-12-21 00:02:18
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

よくわかりませんが System.Console はまだ使えなさそうということがわかりました。いかがでしたか?

2019-12-21 00:11:20
たーびん @tar_bin

@cannorin_vrc Debug.Logは使えるんでしたっけ?

2019-12-21 00:12:16
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

@tar_bin 非 Unity 環境で動かしてるから確証はないけど、UnityEngine 用のラッパーが見えるのでたぶん使えると思う?

2019-12-21 00:13:55
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

私はかしこいので自作Wrapper を登録すればよいことに気づいた

2019-12-21 00:14:24
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

twitter.com/cannorin_vrc/s… わかった。これはただの命名規則でしかなくて、名前は本当はどうでもいい。wrapper からはスタックに積まれた値が自由に取れるから、static method も member method も property も全部 wrapper 側で好きなふうに呼ぶようになってる。ドキュメントないので普通に地獄では?

2019-12-21 00:30:05
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

こういう命名規則になってるのは、引数の型名と戻り値の値を書かせることでオーバーロード解決を無くしている(オーバーロードごとに違う名前の関数として登録している)

2019-12-21 00:32:07
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

で、関数の名前の解決は IUdonWrapperModule のメソッドの中でやってるから、実際にサポートされている関数の一覧を得る方法はソースコードを読む以外ない。地獄じゃん

2019-12-21 00:33:28
𝚌𝚊𝚗𝚗𝚘𝚛𝚒𝚗 @cannorin3

命名規則から外れた名前で wrapper を作成 / EXTERN で呼び出ししてみたけどちゃんと動いたので確定ですね pic.twitter.com/eGL2da11iz

2019-12-21 00:36:15
拡大