Guild icon
swift-developers-japan
main / wasm
Avatar
@hiragram
2:25 AM
@omochimetaru -emit-irで吐いた.llをemに食わせると Appending variables with different alignment need to be linked! って言われてコンパイル通らないんだけどなんだかわかりますか・・・
Avatar
はい
2:25 AM
$ ./emsdk-portable/emscripten/incoming/emcc swift/hello.ll -o swift/hello.html warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmp4kw329/hello_0.o' is 'x86_64-apple-macosx10.9' error: Appending variables with different alignment need to be linked! ERROR:root:Failed to run llvm optimizations:
Avatar
全体としてはわからんけど何かの型についての情報が足りないって感じがする different alignment は アライメントが違うってことだから
Avatar
全文
Avatar
例えば Int は 8 ?(4?) で、 UInt8 は 1 で、みたいな。
2:26 AM
Appending variables ってのがよくわからんね
2:26 AM
どの次元の何のAppendの話なんだろう
Avatar
元のSwiftは print("Hello, Swift!") これだけ
2:27 AM
1行
Avatar
ll を生成した行は?
Avatar
$ swiftc swift/hello.swift -emit-ir -o swift/hello.ll
Avatar
swiftc swift/hello.swift -emit-ir -static-stdlib -o swift/hello.ll だとどう?
Avatar
変わらんすねえ
Avatar
llのサイズ変わった?
2:31 AM
元のやつだと、 print と String についての情報が生成されてないから
Avatar
かわんない
Avatar
あと @convention(c) func a(x: Int) -> Int { return x * 2 }
2:32 AM
とかから試したほうが良いと思う
2:32 AM
print とか String の定義とか
2:32 AM
いろいろあるから
Avatar
ok
Avatar
あれ~サイズ変わらないのか
2:33 AM
あれか、static-stdlib は リンクステージの話だから、
2:33 AM
ll を吐くステージで止めてるから意味ないのか。
Avatar
@convention って初めて使った。
Avatar
(c) つけとくとC言語から呼び出せる関数になる
Avatar
@omochimetaru swift/hello.swift:1:2: error: attribute can only be applied to types, not declarations @convention(c) ^
Avatar
付ける場所が違うかもw
Avatar
コンパイル通んなかったw
Avatar
調べて
Avatar
ok
Avatar
@_cdecl じゃないかな?
Avatar
emscripten側は内部に持ってるclangを使っててターゲットが asmjs-unknown-emscripten で、swiftcはターゲットが x86_64-apple-macosx10.9 になってるっぽい
2:50 AM
warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWhbLkq/hello_0.o' is 'x86_64-apple-macosx10.9'
2:51 AM
swiftc側のコンパイルをasmjs-unknown-emscriptenをターゲットにできればいいのかな
2:52 AM
微妙に書いてないな・・・
2:54 AM
あーどうなんだろう、同じになったほうがいいけど、しなくても大丈夫な気もしつつ。
2:54 AM
LLVMIR の時点で LLRMIR 側の i32 みたいな型で記述されているから
Avatar
alignmentが合わないのはそこの差異が原因ってことはないもの?
Avatar
ターゲットの違いがあまり問題にならない気もする
Avatar
ふむ
Avatar
いや、ありえる
Avatar
なんか調べた感じemは自分でclangのコンパイラ持ってて、swiftcで使ってるやつと別のやつが動いてる気がする
Avatar
うん、それはそう
2:55 AM
emはIRからその先の変換処理をもつために独自改造したclangを使うんだと思う
Avatar
emのSwiftに関するなっげえissue今読んでる
Avatar
序盤はdylib周りよ
2:56 AM
とりあえず @convention(c) はおいといて普通にfuncつくろう
2:56 AM
普通の(トップレベルでキャプチャがない) funcはC互換な気がしてきた
2:57 AM
ObjCから呼べるし。(thunkが作られている可能性はあるが
Avatar
hello.swift空っぽにしても同じエラーなんだけどそういうもん?
Avatar
マジか
Avatar
なんかfuncとかのステージにすら立ててない感ある
Avatar
逆にコンパイル後ってそれ何が入ってる?
Avatar
; ModuleID = 'swift/hello.ll' source_filename = "swift/hello.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9" @__swift_reflection_version = linkonce_odr hidden constant i16 3 @llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8 define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* ret i32 0 } attributes #0 = { "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="core2" "target-features"="+cx16,+fxsr,+mmx,+sse,+sse2,+sse3,+ssse3,+x87" } !llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !9, !10} !0 = !{i32 1, !"Objective-C Version", i32 2} !1 = !{i32 1, !"Objective-C Image Info Version", i32 0} !2 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"} !3 = !{i32 4, !"Objective-C Garbage Collection", i32 1280} !4 = !{i32 1, !"Objective-C Class Properties", i32 64} !5 = !{i32 6, !"Linker Options", !6} !6 = !{!7, !8} !7 = !{!"-lswiftCore"} !8 = !{!"-lobjc"} !9 = !{i32 1, !"PIC Level", i32 2} !10 = !{i32 1, !"Swift Version", i32 5}
2:58 AM
空のhello.swiftのemit-irしたものね
Avatar
@llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8
2:59 AM
これあやしそうだね
Avatar
その怪しみ分からない…
Avatar
appending
Avatar
おー
Avatar
あと、外部関数 __swift_reflection_version
2:59 AM
が絡んでる。
2:59 AM
原理的にいまうまくいかない理由になる。
3:00 AM
; ModuleID = 'swift/hello.ll' source_filename = "swift/hello.ll" target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.9" define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* ret i32 0 }
3:00 AM
↑これだけにしたらいけないかな、あと、 main があるのおかしい気がしてきました。
3:00 AM
static library としてビルドしよう
3:00 AM
まあ、 main って名前の関数になってくれるかもしれんけど。
Avatar
Hello All, I tried using clang 3.9.0 to emit the llvm ir with -target wasm32-wasm32-wasm32, but end up getting warning for different data layout and target triple. The question is if llvm WebAssembly target is usable as is to generate llvm ir to be fed to emscripten ? The warning is expected, but should not cause problems in practice. The important things are the same in those two triples. (Except perhaps for the size of long doubles, is that important in Swift?)
3:02 AM
target違いのwarning問題なしみたいなこと言ってる
3:02 AM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
Avatar
↑はどう? シンプルにするのと、 static libary にするの。
Avatar
llをこれに置き換えればよし?
Avatar
うん。
Avatar
やってみます
Avatar
余計そうなのを消してみた。
Avatar
warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/dlmalloc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: Linking two modules of different data layouts: '/Users/hiragram/.emscripten_cache/asmjs/wasm-libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'e-m:o-i64:64-f80:128-n8:16:32:64-S128' warning: Linking two modules of different target triples: /Users/hiragram/.emscripten_cache/asmjs/wasm-libc.bc' is 'asmjs-unknown-emscripten' whereas '/var/folders/b6/shjk0l7j0mb0j9__n3w7z92w0000gn/T/tmpWrnym7/hello_0.o' is 'x86_64-apple-macosx10.9' warning: incorrect target triple 'x86_64-apple-macosx10.9' (did you use emcc/em++ on all source files and not clang directly?)
3:05 AM
warningはなんか出たが一応エラーなく終了した。
Avatar
いけたw
Avatar
wasmファイルも書き出された。
3:05 AM
電車降りちゃうからまたあとで
3:22 PM
これ、今のSwiftじゃWebAssemblyできませんよでFAなのかな
3:22 PM
かなしい
Avatar
swiftc本体からのwasmターゲットが駄目なだけじゃないか
Avatar
Avatar
これはwasmバイナリの生成パスでしょう
Avatar
clang -emit-llvmとかそういう感じ?
Avatar
LLVMIRを生成して、そこから先はemやclangの機能でもっていきたい
Avatar
IRGen.cppでwasmサポート無いって言われてるから無いのかなーと判断したけど
3:25 PM
要はswiftcが-emit-irで asmjs-unknown-emscripten というターゲットでIRを吐く必要があるんじゃねという理解なんだけど
Avatar
本来的に
3:27 PM
LLVMって 言語→CPU中立なIR のフロントエンド と、 IR -> アセンブリ のバックエンドに
Avatar
うん
Avatar
分けたのが価値だったはずで
3:27 PM
でもなんでLLVMIRの生成にターゲットトリプルが絡んでくるのか
3:28 PM
そこがよくわかってない
Avatar
CPU中立なIRっていうのはCPUに依存せず同じIRっていう意味であってる?
Avatar
CPUの差と、実行ファイル形式の差(ELFとか)はまた別で、後者まではIR生成時に決まってしまうのかなあ
3:29 PM
そう
3:29 PM
同じIRからarmv7とかx86向けのアセンブリを作るのがバックエンド
Avatar
つまりosxターゲットのIRとwasm用のIRが違うのがおやおやという感じなのよね
3:29 PM
そこはなんとなくわかる
Avatar
osxターゲットというのはちょっと違う osxは armでもintelでも動くから
Avatar
おう
Avatar
で、osxの実行ファイルやstaticライブラリは Mach-O 形式
3:31 PM
あとemscriptenはもともと LLVM to JS なやつで
3:31 PM
wasmがないころからあったプロジェクトだから
3:31 PM
wasm object formatではない ELF や Mach から JSに持っていく機能があると思うんだけどなあ
3:33 PM
こまったなあ
Avatar
僕もいろいろやってみる
Avatar
@omochimetaru なんかググりのキーワードありませんか
3:36 PM
学びたい
Avatar
キーワードはもう出てる限りだと思う
Avatar
ヒィン
Avatar
バイナリと実行ファイルのしくみについての知識が不足してそう
Avatar
してる
Avatar
急がば回れ感
Avatar
そうね
Avatar
少なくとも現時点で「こうやるとできる」ってテキストは見当たらないから
3:46 PM
なんとも
Avatar
$ swiftc -emit-ir -Xcc --target=wasm32 first.swift -o first.ll
Avatar
↑それだと昨日のfatalErrorのとこに行きそう
4:34 AM
多分clangがSIGABRTで死んだ
4:34 AM
darwinが云々いわれているの、これLinuxで同じコマンド叩いたらしれっと通ったりしないかしら、というのを考えている
Avatar
<unknown>:0: note: No available targets are compatible with this triple.
4:35 AM
死亡メッセージこれだね
Avatar
でも、本当に存在しないやつとはエラーが違うのでなにかありそう $ swiftc -emit-ir -Xcc --target=wasm32aaa first.swift -o first.ll <unknown>:0: warning: argument unused during compilation: '-mmacosx-version-min=10.9.0' <unknown>:0: error: -fobjc-arc is not supported on platforms using the legacy runtime <unknown>:0: error: unknown target triple 'wasm32aaa', please use -triple or -arch <unknown>:0: error: clang importer creation failed
Avatar
5 swift 0x000000010f02cfe7 swift::performFrontend(llvm::ArrayRef<char const>, char const, void, swift::FrontendObserver)::$_0::invoke(void*, std::1::basic_string<char, std::1::char_traits<char>, std::1::allocator<char> > const&, bool) + 551
4:36 AM
clangじゃなくてswiftcだと思うよ
Avatar
swiftcか
Avatar
clangの関数とかも使って作ってるから
4:37 AM
clangっぽい関数も出てくる。
4:37 AM
エラーメッセージでswiftのソース検索すれば多分デル
4:37 AM
ていうか普通に swift::performFrontend じゃないかな
4:39 AM
さっきのメッセージはここからllvm内部から戻ってきてそう
Avatar
DockerでUbuntuたててその中でやってみたけどやっぱSIGABRT
4:58 AM
Darwinとか言われなくなったけど多分Macでやったのと同じ話だとおもう
4:59 AM
お仕事もどります 🙃
Avatar
error: <unknown>:0:0: in function _T01b3addS2i_SitF i64 (i64, i64): WebAssembly doesn't support non-C calling conventions
7:30 AM
define hidden swiftcc i64 @_T01b3addS2i_SitF(i64, i64) #0 { entry: %2 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %0, i64 %1) %3 = extractvalue { i64, i1 } %2, 0 %4 = extractvalue { i64, i1 } %2, 1 br i1 %4, label %6, label %5 ; <label>:5: ; preds = %entry ret i64 %3 ; <label>:6: ; preds = %entry call void @llvm.trap() unreachable }
7:31 AM
Swiftのトップレベル関数は swiftcc ってコンベンションになってて、 llc の wasm モードがそれをサポートしてないからダメっぽい
7:36 AM
LLVM自体は swiftcc のサポートがバックポートされてるっぽくて
Avatar
おー
Avatar
CallingConv::Swift で調べると lib/Target/X86とか lib/Target/ARMに
7:37 AM
CallingConv::Swift の分岐がある
7:37 AM
でも lib/Target/WebAssembly には無い
7:37 AM
これが一つの壁っぽい
Avatar
これ誰の進化が必要なんだ
Avatar
LLVMのwasmターゲットがswiftccをサポートする必要がある
7:39 AM
LLVMのIRまではswiftccがサポートされてるけどwasm仮想CPU向けが無いってこと
Avatar
LLVM側かあ
Avatar
wasmの関数呼び出しについて調べて、swiftcc周りのx86とarm周りの勉強をすれば
7:40 AM
ちょっと進むね。
Avatar
けわしー❗
7:40 AM
けど興味あり
Avatar
険しいけどちょっとおもしろそうだからいろいろ調べてみようかな
Avatar
本家LLVMとSwiftのLLVMがどのくらい乖離してるのか見てるんだけど
10:17 AM
git show-branch llvm/master origin/swift-4.1-branch .... + [origin/swift-4.1-branch~577] Canonicalize the spelling of RefDie (NFC) + [origin/swift-4.1-branch~578] dsymutil: strip unused types from imported DW_TAG_modules + [origin/swift-4.1-branch~579] Debug Info: Don't strip clang module skeleton CUs. ++ [llvm/master~5237] Recommit r274270, [CMake] Module builds depend on target intrinsics_gen to be built first.
10:18 AM
本家のmasterの5200コミット前と swift-4.1-branchの580コミット前に共通のコミットがあってそこからわかれてる、つまり5700コミットぐらい乖離している・・・?
Avatar
おもしろ
Avatar
commit 18e8f9ef0645b15c777547d8655a17a315b0815d Author: NAKAMURA Takumi <geek4civic@gmail.com> Date: Wed Jul 19 11:27:31 2017 +0000 Recommit r274270, [CMake] Module builds depend on target intrinsics_gen to be built first. The builder clang-x86_64-linux-selfhost-modules-2 complains. Investigating. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308439 91177308-0d34-0410-b5e6-96231b3b80d8
10:21 AM
その共通のコミットが2017年6月なんだけど
10:21 AM
半年間ぐらいSwift側の成果が本家に戻ってないってこと・・・?見方があってるのかよくわからない
10:26 AM
あ〜〜〜〜
10:26 AM
Swiftの方のLLVMだと、最近のWASM対応が入って無くて、 llc b.ll -march=wasm32 -filetype=asm -o b.s llc: error: invalid target 'wasm32'.
Avatar
xcrun clang で動くclangは-target=wasm32使えたけどそういうもん?
Avatar
llcはllvmのツールで
10:29 AM
clangはまた別管理だから
Avatar
ふむ
Avatar
それはあれだよね、C言語を .ll にするときに、ターゲットをwasm32にできるってことよね
Avatar
そそ
10:30 AM
Cはできた。
Avatar
その続きっていける?
Avatar
emscripten?
Avatar
clang: a.c => a.ll ( この続きは何を使う? ) (edited)
Avatar
10:31 AM
できたって言ったのは .llじゃなくて .bc 吐くのだった
10:31 AM
xcrun clang -emit-llvm hoge.c -o hoge.bc
10:32 AM
.ll 吐いてその先は試してない
Avatar
bcとllは同じもののバイナリとアスキー版じゃないんかな
Avatar
そうなん?
Avatar
bitcodeファイルはllvm-disコマンドでテキストのLLVM IRとして出力することができます。
Avatar
へー
Avatar
disってことは逆かな アスキーのIRが バイナリのbcになるんかな
Avatar
なんとなく中間表現→ビットコードのイメージだった
10:34 AM
llvm-as is the LLVM assembler. It reads a file containing human-readable LLVM assembly language, translates it to LLVM bitcode, and writes the result into a file or to standard output.
10:34 AM
If the input is a file that ends with .ll, then the output file is of the same name, except that the suffix is changed to .bc.
10:34 AM
llvm-as で .ll が .bc になると
10:35 AM
で、llcで .ll または .bc がネイティブアセンブリ (.s) になりますよと
10:37 AM
で、wasm32な .s を吐ければ、あとは Wasmのツールの管轄
10:38 AM
Cから生成された .ll であれば llc で .s にできるけど、 swiftから生成された .ll は、 .ll の中で swiftcc などのSwift仕様が含まれていて、 llc が通らない。
10:38 AM
ってのがここまでの流れ。
Avatar
llcをどうにかする方法を模索する流れ?
Avatar
実装するしかないんじゃあないかなあ
Avatar
おおごとになってきた
Avatar
swiftc -emit-ir b.swift -o b.ll llc b.ll -o b.s libs=/Users/omochi/work/swift-source/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib/swift/macosx gcc -L$libs b.s -o b.out LD_LIBRARY_PATH=$libs ./b.out
2:09 PM
↑そもそも通常のswiftの場合で実行までの手順を調べた
2:11 PM
$ cat b.swift print("hello swift")
2:12 PM
printだけじゃなくて、 _swift_retain とかも外部リンクされているので
2:14 PM
wasmに乗っける時に持ってこないといけないんだけどそこらへんもやり方が謎
Avatar
-static-stdlib の挙動について調べたけど、 /usr/bin/ld に -force_load_swift_libs を渡すようになっているだけで、
2:52 PM
/usr/bin/ld についてはオープンソースになってないから、何もわからんという結論になった
3:50 PM
llvmの引数属性として Swiftの self 用とか Swift の error 用とか足してある
Avatar
upstream-with-swiftっていうブランチがあるけど、CIは通ってないぽい。 https://ci.swift.org/view/swift-master-next/
Avatar
Kotlin/Nativeはwasmを正式にサポートしているのね
Avatar
昨日 LLVMの lib/Target をリーディングしてみたけど
1:49 AM
CPUに関する広くて深い知識が無いと何がなんだかわからん、ってなった
Avatar
KotlinNativeがwasmサポートしたのごくごく最近だった。
7:03 AM
We’re happy to announce the release of Kotlin/Native v0.4, KotlinConf 2017 edition! This release adds support for accessing Objective-C APIs on iOS and macOS, WebAssembly target platform, as well as introduces major changes making app development in Kotlin/Native way easier. Platform … Continue reading →
7:04 AM
SwiftがどうにもならないとしたらKotlinでWebフロント開発のほうで遊んでようかな
Avatar
KotlinNativeでwasm、 $ kotlinc -target wasm32 hello.kthello.wasm が直接吐かれて超楽っぽい。
6:22 AM
emscriptenいらずかも
Avatar
omochimetaru 12/4/2017 6:32 AM
よいね
6:33 AM
メモリ管理ってどうなってる?
Avatar
どうなってるとは
Avatar
omochimetaru 12/4/2017 6:33 AM
Kotlin/Nativeってことだから、参照カウント方式だったと思うんだけど
6:33 AM
弱参照作れるの?
Avatar
まだKotlinハローワールドしかしてないので答えを持っていない
6:33 AM
やっていく
Avatar
omochimetaru 12/4/2017 6:36 AM
想像なんだけど今は弱参照作れなくて循環参照で無限メモリリークだったりしない?
Avatar
うーん
Avatar
omochimetaru 12/4/2017 6:40 AM
Kotlin/Native uses automated memory management, currntly based on automated reference counting with cycle collector. See here for details: https://github.com/JetBrains/kotlin-native/blob/master/runtime/src/main/cpp/Memory.cpp
kotlin-native - Kotlin/Native infrastructure
6:40 AM
Will Kotlin native be garbage collected or managed manually like C, Rust, etc?
6:40 AM
まじかよサイクルコレクター入ってた
Avatar
サイクルコレクターって何ですか
Avatar
omochimetaru 12/4/2017 6:41 AM
循環参照があってもメモリ解放してくれる機構のことです。
6:41 AM
pythonとphpに入ってるよ。
Avatar
へえ
Avatar
omochimetaru 12/4/2017 6:41 AM
あ、それの、参照カウンタ方式のときに使うアルゴリズムのことね。
6:41 AM
普通のmark-sweep等のTrace GCなら循環の解放は当たり前なので。
6:43 AM
循環参照の問題が無いから特に何も書かれてないのか かっこいい
Avatar
omochimetaru 3/10/2018 2:45 PM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
2:45 PM
swift-wasmに進捗があったみたい
2:46 PM
The calling conventions are mostly for the backends, so it should be possible to just ignore it. That is, if swift didn't emit it, it should be ok, and for now you can strip it from the IR manually for testing. (There are exceptions like tail call optimizations that are done on IR and depend on the convention, but I don't think that would be an issue here.)
2:47 PM
swiftccコーリングコンベンションは普通に無視すればいいよってkripkenさんが言っていて、そのあと他の人が進捗してる
Avatar
そのスレの最後にもあるし、さっきTwitterにも書いたけど
Avatar
omochimetaru 3/10/2018 2:49 PM
お?
Avatar
swift-llvmがLLVM 6.0に追従したようなのでちょっと楽になるのかな https://github.com/apple/swift-llvm/pull/80 (edited)
2:50 PM
WebAssembly backendがSwift付属のLLVMに含まれることになりそうということで。
Avatar
omochimetaru 3/10/2018 2:50 PM
あ、なるほど
Avatar
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swi...
3:02 AM
Swift for WASM スレで、定期的に誰かしら「なんか進捗あった?」って書き込まれるんだけど
3:03 AM
今回はなんかでかめの進捗が報告されてる
3:04 AM
stdlibのビルドはほぼできたらしくて
3:04 AM
バイナリのリンクとかdylibの取り回しの方をWASM環境に適用するのに手こずってるらしい
3:04 AM
めっちゃ大変そう > Unfortunately, a build system used within Swift compiler infrastructure is not very modular, it uses a mix of shell scripts, Python scripts and CMake.
Avatar
This adds an extension point so the ABI can declare whether or not it supports the swift calling convention. Open to suggestions if you think this doesn't belong here (or is flat out the wrong ...
2:25 AM
いつぞやのwasm対応でswiftcc切るやつ、ジョンマッコールに、「ちゃんとやりなさい」ってリジェクトされてて笑った
Avatar
omochimetaru 4/10/2019 1:25 AM
@daniel_dunbar Are you still working on Swift WebAssembly exploration? (SR-9307, https://t.co/u88AVpVn2M hasn't seen activity since January) I'm also trying to get Wasm working (trying to integrate either Emscripten or WASI as the runtime) and would like to know how I can ...
1:26 AM
新たなWASM進めるマンが来た!(ダニエルさんは作業止まってたらしい)
Avatar
omochimetaru 5/10/2019 7:56 PM
おお!?
7:57 PM
Website for the SwiftWasm project. Contribute to swiftwasm/swiftwasm.org development by creating an account on GitHub.
7:57 PM
zhuoweiさんが主にやってるっぽいな
7:58 PM
What&#39;s in this pull request? This pull request adds initial support for compiling Swift code to WebAssembly. &quot;Hello world&quot; works, and a large subset of the stdlib already ...
Avatar
https://forums.swift.org/t/wasm-support/16087/17 正しく意図が読み取れてるか自信がないので相談させてください。
If there's the equivalent of an import table or GOT, it might still be interesting to have something like RelativeIndirectablePointer, but with an absolute address, to still be able to avoid up-front load time costs for cold metadata structures.
これってGOTがあるなら絶対アドレスにしなくてもロード時間は減らせるよね?っていうことですかね。
Avatar
omochimetaru 2/20/2020 7:41 AM
もしインポートテーブル(Windowsのやつ?)かGOT(Linuxのやつ)と同じものがWASMにもあるなら、 RelativeIndirectablePointerを採用することは意味があるだろう(be iteresting) もし(それがあるのに(but))絶対アドレスを使うのであれば、 コールドメタデータの起動時のロード時間を減らす事がそれについても(still be able)できる
7:41 AM
と読んだ。
7:42 AM
起動時じゃないかもな、(up-front)
Avatar
なるほど
Avatar
omochimetaru 2/20/2020 7:43 AM
RelativePointerを使ってれば、内部のRelative差分についてはGOTのエントリが減るわけだから、GOTの書き換えコストがカットできるって話かと思った。
7:43 AM
RelativeIndirectablePointerは、基準となるシンボル(GOTエントリ)からの相対オフセットでアドレスを表すから、リンクするのは基準シンボルだけだけど、 絶対ポインタを使ったらそういう隠蔽が効かなくなって何もかもGOTエントリに載ってくる (edited)
Avatar
RelativePointerを使わない場合でもwasm上では内部のシンボル参照にGOTは必要なくて、静的にリンクするときに全部解決されるはず。
7:48 AM
あと、GOTエントリに何もかも載るのは普通のGOTじゃないですか? (edited)
Avatar
omochimetaru 2/20/2020 7:48 AM
うん、俺もそう思ってて、WASM実行プロセスにGOT自体存在していないのでは?
7:49 AM
WASMファイルを動的に追加で読み込んだ場合って、JavaScript経由で関数取り出してガチャガチャとバインディングするしかないよね?
7:50 AM
RelativeIndirectablePointerで指し示す対象はシンボルの公開をしないでおけて載らないんじゃないかしら? > GOTエントリに何もかも載るのは普通のGOTじゃないですか? (edited)
Avatar
GOTはLLVMがそれっぽく見せかけるために静的なテーブルを用意してくれますが、動的にリンクしたりするのは出来ないです。
Avatar
omochimetaru 2/20/2020 8:01 AM
通常の関数呼び出しはそれ経由になってるの?
Avatar
1つのオブジェクトファイルにまとまってないやつはそうなるはずです
8:04 AM
リンカが関数テーブルを作ってくれて再配置可能wasmモジュール間の関数参照を解決してくれます
Avatar
omochimetaru 2/20/2020 8:05 AM
あ〜オブジェクトファイル境界がそう効いてくるのか。
Avatar
なので、返信としては相対絶対に関わらずGOTを経由するケースはあるのでIndirectPointerを使う必要はある、ですかね。
Avatar
omochimetaru 2/20/2020 8:10 AM
オブジェクトファイルって .o 単位の事?
Avatar
そうです
Avatar
omochimetaru 2/20/2020 8:11 AM
.o ごとにGOTがあるの? .dylibごとかと思ってた
Avatar
うーん、あれれ。たしかにリンク時にテキストセクションを参照先のアドレスに書き換えれば良いからGOT経由しない気がしてきた
Avatar
omochimetaru 2/20/2020 8:15 AM
そうそう。
8:15 AM
でdylibごとだとするとwasmの場合全部静的リンクされてるから
8:15 AM
たとえGOTがあったとしても誰も使わないのではと思って。
Avatar
そうそう、それ朝思ったんだ。朝の時点では「本来GOTを経由する必要は無いので、RelIndirectPterって本当に必要が考える必要あるよね(interesting) 」だと思ってたんだ (edited)
Avatar
omochimetaru 2/20/2020 8:18 AM
あ、but以下読み違えてたかも
8:20 AM
絶対アドレスを使えば静的メタデータの読み込み時間は回避できるよね(関節化が無くて速いから) か?
8:21 AM
avoid up-front load time costs がよくわからないな〜
Avatar
butの前後関係がイマイチわからんなー
Avatar
どうして静的にnon-PICなwasmファイルを構成する個別のオブジェクトファイルにGOTがあるのかわかった。コンパイラ自体はPICなコードを吐くから個別のオブジェクトファイルにGOTエントリが生成されるけど、リンカはnon-PICなコードを吐きたいのでそれを静的なGOTとしてwasmに埋め込むんだ。
Avatar
リンカはnon-PICなコードを吐きたいので
ここの「ので」がわからなかったので、詳しく知りたい
11:02 AM
位置独立コードからデータを参照する場合はさらに間接的な方式となり、そのコードがアクセスする全グローバル変数のアドレスを格納したGOT (Global Offset Table) を使用する。コンパイル単位またはオブジェクトモジュールごとにGOTがあり、コードから見て固定の相対位置に置かれる(ただし、ライブラリをリンクするまで実際のオフセットは不明である)。リンカがモジュール群をリンクして共有ライブラリを作る場合、各モジュールのGOTをマージし、最終的なコードとのオフセット値を設定する。
https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89
11:03 AM
↑とりあえず、オブジェクトファイルごとにGOTはあって、静的リンクするときにマージされていくものらしい (edited)
Avatar
のでの意味
これは単にwasm-ldのデフォルトの挙動としてnon-PICなコードを吐く、という意味でした。一応PICとして吐くこともできるんですけど、その場合はEmscriptenのABI unstableなdynamic loaderの仕様に載っかることになるので一般的ではないです。
Avatar
単にコンパイラがオブジェクトファイルを生成する時にはPIE対応してGOTを含めているのがリンク後も残っているという話?
Avatar
そんな感じです。
11:32 AM
リンカの中で分岐があって、静的にGOTを作る場合とdynamic loaderであとからリンクする場合があります。 https://github.com/llvm/llvm-project/blob/c8f9e526bc5319f2d0beed4012fbf17b11e15161/lld/wasm/Relocations.cpp#L47-L59
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
ふむふむ
Avatar
技術的内容は理解していないのですが、英語としてはこの"but"は「ではなく」くらいの意味じゃないかな。「GOT的なものがあるので有れば、絶対アドレスではなく、Relative..Pointer的なもの持つことをを検討する価値があるかも知れない」。
Avatar
おお、そうすると頓珍漢な回答をしてしまったかもしれない…
12:28 PM
ありがとうございます
Avatar
んーわからん。英語わからないのでリフレーズしてください、が確実か?
Avatar
そうですねー、適当なこと書くよりそれが確実ですね
Avatar
https://forums.swift.org/t/wasm-support/16087/19 だいぶ前提が共有されたみたいで話が前進しました
Well, if all wasm code is eventually linked into one object file for deployment, then there shouldn't ever strictly be a need for a GOT (though Swift or LLVM may end up incidentally generating entries because it assumes a symbol might come from a dynamic library in many cases)...
😊 1
Avatar
omochimetaru 2/20/2020 4:53 PM
結局IRGen飛び越えてLLVM内部の方に行くのね
Avatar
このスレッドの文脈でKeyPathの呼び出し規約が通常のswiftccから逸脱しているのでは?ということを質問してみました。 https://twitter.com/omochimetaru/status/1232538643731927041?s=20 (edited)
@kateinoigakukun あ〜そっか、サンクの仕様までを固定しておけば、本当のプロパティのgetter自体のABI仕様は露出しないのか。それはありそう。
11:34 PM
@Joe_Groff Hi! While I was fixing the rest of failing test suites, I found that another issue for ABI. As described here, Swift ABI allows using non-generic function as generic function directly. On WebAssembly runtime, this ABI causes signature mismatch between callee and...
11:37 PM
具体的にはindicesの有無とジェネリックコンテキストの有無がオプショナルになっている部分です。
11:39 PM
さっき回答が来て、それを見るにこの呼び出し規約は多分KeyPath特有で、これのせいでKeyPathのインライン化も面倒なことになっているらしい https://forums.swift.org/t/wasm-support/16087/23
Regarding key paths, their weird calling convention is also an issue for optimization, so we may introduce a SIL convention for key path accessors, which would be another marker you could use to lower them to a consistent LLVM function type for wasm:
Avatar
omochimetaru 2/27/2020 2:07 AM
so we may introduce a SIL convention for key path accessors, which would be another marker
2:07 AM
これって、新しいSIL conventionを新たに追加して、KeyPathアクセサにそれを設定するようにしようと思っていて、
2:07 AM
そうすれば、KeyPathアクセサのところにWASM対応を仕込まなくても、
2:08 AM
このSIL convensionがついてる関数の呼び出しのところにWASM対応を入れるようにすることで
2:08 AM
今後同種の呼び出しが追加されたときもうまく動くようにできるって意味かと思った。
2:08 AM
conventionってcalling conventionの事なのかなと。
Avatar
同じように解釈しました
Avatar
omochimetaru 2/27/2020 2:23 AM
あい。このマーカーが付くまでのことに関しては、KeyPathアクセサしか存在しないと。
2:23 AM
Swift ABIの文書でのくだりだと、細かい調整以外は原則Cコンベンションと同じだって気当てあって
2:23 AM
Cコンベンション自体が原則、末尾引数の無視が可能だから
2:24 AM
なんか厳密なロジックだとあらゆる場面で無視されうる気はする。
Avatar
あー、たしかにそんなこと書かれてた気がするなぁ
Avatar
omochimetaru 2/27/2020 2:24 AM
swiftselfとかswifterrorに関しても
2:24 AM
専用のレジスタを割り当ててオプショナルにすれば性能が出せるけど
2:25 AM
最悪それがなくても、ベースのコンベンションがCで可変だから、そこの仕組みで無視したら良いしね、みたいな
2:25 AM
触れられ方をしている。
2:25 AM
まあ、どうせ無理だしスルーが良いと思うけど
2:25 AM
規格としてもう禁止してほしいよな。
Avatar
ですねー
2:26 AM
逆にclangとかのCのwasmローワリングはどうなってるんだろう
Avatar
omochimetaru 2/27/2020 2:27 AM
たしか〜に
2:27 AM
Cでコレがダイレクトに効いてくるのが確か
2:27 AM
Cの可変長引数として実装した関数を
2:27 AM
固定引数の関数として呼び出しても動くっていうのじゃなかったっけ
2:28 AM
あれ、逆かな?
Avatar
そのへんちゃんと調べたこと無いなぁ
Avatar
omochimetaru 2/27/2020 2:28 AM
てか、printfとかどうなってんだろうね。
Avatar
ちょうどva_listのテストケース壊れてるんで調べてみます
Avatar
omochimetaru 2/27/2020 2:29 AM
format文字列とパラメータ数が不一致の場合、引数のclaimができないはず
Avatar
↑のClangのWebAssemblyローアリングパス調べてみたんですけど、シグネチャが一致してない関数呼び出しに対して、新しくその呼び出し専用の関数を作って置換してました。
4:16 AM
ただこれができるのはcalleeが特定できるダイレクトな関数呼び出しでないといけないのでSwiftの場合は同じ要領ではできなかったです。
Avatar
omochimetaru 3/12/2020 4:16 AM
じゃあ動的な関数ポインタ経由だったらダメなのか。
Avatar
です
Avatar
omochimetaru 3/12/2020 4:17 AM
壊れてるやん。
Avatar
変換用のPassがあって、それ読む限り関数ポインタまで追っかけてないように見えるんですよね https://github.com/llvm/llvm-project/blob/master/llvm/lib/Target/WebAssembly/WebAssemblyAddMissingPrototypes.cpp
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
omochimetaru 3/12/2020 4:18 AM
まあ動的にやってたらわからんしね。
4:19 AM
そうかあ。そういうこともあるんだなあ。
Avatar
こっちのPassで関数同士のbitcastに対してサンクを挟んでるのでそれで実は動くのかもしれない https://github.com/llvm/llvm-project/blob/master/llvm/lib/Target/WebAssembly/WebAssemblyFixFunctionBitcasts.cpp
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...
Avatar
omochimetaru 3/12/2020 4:20 AM
いずれにしても uintptr_t とかタグポインタとか挟んで取り回してたら検出できないっしょ。
Avatar
そうですねー。
Avatar
omochimetaru 3/12/2020 4:22 AM
まあやっぱ本質的には互換を取る方法は無いってことなんだな。
4:22 AM
いろいろな前提条件の範囲でごまかすしかない
Avatar
そうなんですよ。高級ゆえの制限が既存アーキテクチャよりめちゃくちゃ多い
Avatar
wasm向けツールチェーンの配布をはじめました。swiftenvで入れられるので良かったら試してみてください。 https://twitter.com/kateinoigakukun/status/1240070796321492992?s=20
自動で毎日UTC 00:00に最新のSwift for WASMツールチェーンを配布するようにしました https://t.co/ZAi1ggJfDe
👏 1
Avatar
omochimetaru 3/18/2020 9:09 AM
swiftenvを使わずにxcodeのツールチェーン切り替えではできないの?
Avatar
~/Library/Developer/Toolchains に手でインストールすればXcodeからも切り替えられます
9:12 AM
インストーラは署名しないといけなかったり面倒だったのでまだ作ってないです。
Avatar
omochimetaru 3/18/2020 9:13 AM
あー、インストーラってそうなのか。 でもswiftenv入れるよりはハードル低いと思った
Avatar
なるほど
9:13 AM
時間あるときに用意してみます
🙂 1
Avatar
SwiftでWebアプリ開発のPoCを作ってみました https://twitter.com/swiftwasm/status/1247797285016055809?s=20
Things are progressing really well here at SwiftWasm! With JavaScript/DOM bindings and SwiftPM more or less working, @kateinoigakukun created a simple Conway’s Game of Life demo here: (wait for it to load, binary size is still something we’re working on) https://t.co/mIDYmV...
🤩 1
8:21 AM
ローカルで動かす分には全く気にならなかったんですが、インターネットを介すと無視できないダウンロード時間がかかります
Avatar
Kishikawa Katsumi 4/8/2020 8:24 AM
おお、すごい。 めっちゃすぐ動いたよ
Avatar
omochimetaru 4/8/2020 8:26 AM
いま買い物に出てるけど4G回線で一瞬だった
Avatar
うち今WFH勢で回線逼迫していて20秒くらいかかった
Avatar
omochimetaru 4/8/2020 8:27 AM
ww
Avatar
うちもキャッシュないと20秒くらいかかるんですよねー
8:28 AM
ちなみに一瞬だった勢は下りどのくらい出てますか?
Avatar
omochimetaru 4/8/2020 8:29 AM
Avatar
Kishikawa Katsumi 4/8/2020 8:30 AM
ダウンロードのスピードはどのくらいですか? Fast.comでは瞬時かつ簡単に、お客様の推定ISPスピードを表示します。
8:30 AM
そんな速くないよ。
Avatar
うーん何でそんなに差が出るんだろう… https://fast.com/ja/share/90Mbps.html
ダウンロードのスピードはどのくらいですか? Fast.comでは瞬時かつ簡単に、お客様の推定ISPスピードを表示します。
Avatar
Kishikawa Katsumi 4/8/2020 8:33 AM
ほとんど一緒や
8:34 AM
ChromeとSafariのプライベートセッションで試してみたけどやっぱりすぐだったよ。計測したわけじゃないけど2、3秒もかかってないと思う。20秒は絶対かかってない。
8:36 AM
WebAssenblyは演算した結果を見せようと思ったらJSのブリッジが必要になってCanvasとかDOMを使って表示する、ということですか?
Avatar
そうですー
Avatar
Kishikawa Katsumi 4/8/2020 8:40 AM
なるほど。じゃあ描画がボトルネックのものをなんとかするものじゃないんですね。 SwiftとWebでいわゆるビジネスロジックが共通化できる、というのは明確な利点か。
Avatar
omochimetaru 4/8/2020 8:42 AM
高速化にも期待したいですね 書きやすいRustのポジション
Avatar
Kishikawa Katsumi 4/8/2020 8:44 AM
実際、今のJSとRust、Swiftで速度差ってかなり違うんですか?
8:45 AM
今のJSは普通に速い印象。
Avatar
ちゃんと計測したことないですね、
Avatar
omochimetaru 4/8/2020 8:45 AM
JSとRust比べるとちょっと早いみたいな事をgfxさんが以前言っていたような
Avatar
ほー
Avatar
omochimetaru 4/8/2020 8:46 AM
RustとSwiftはいい感じの比較をそもそも見たことがない
8:46 AM
使う領域が重なってないから実験する人が居ない・・・
8:47 AM
ただJSのJITとWASMランタイムに歴史の差があるからJSが結構速いって感じらしい
Avatar
Kishikawa Katsumi 4/8/2020 8:48 AM
まあRust、Swiftの比較は重要じゃないと思います。JSと「Rust、Swift」でそこまで違いがあるかどうか、ですね。
Avatar
前にChromiumのWASMランタイムちょっと読んだときは未だあんまり積極的なJIT最適化は無かったですね
8:52 AM
ネイティブバイナリに近いパフォーマンスを実現するっていうのがwasmのウリなので気合い入れてるとは思うんですけどね
Avatar
omochimetaru 4/8/2020 8:55 AM
スマホでは5秒ぐらいだった 多分初見の時にボタンの意味とか考えてた
8:55 AM
これ緑の初期状態が出るまでがロード時間か。
8:56 AM
8:56 AM
macだと1秒ぐらい。
Avatar
Kishikawa Katsumi 4/8/2020 8:56 AM
インターネットの速度がめっちゃ速い
Avatar
めっちゃ速い
Avatar
omochimetaru 4/8/2020 8:58 AM
有線のゲーミングマシンならもっと速いで😏
Avatar
バイナリサイズはRustとかGoでも問題になってるんですけど、標準のモジュールの粒度が非常に小さいので一応どうにかなってるんですよねー
Avatar
omochimetaru 4/8/2020 9:01 AM
家庭くんが留学して解決してくれるんでしょ。
Avatar
GSoC採択されなかったとしても個人でやると思いますけどねw
Avatar
omochimetaru 4/8/2020 9:03 AM
留学のほうがオマケだった
9:06 AM
GSocのテーマそのままクラウドファンディングにしてiMacPro調達しようぜ
😎 1
Avatar
4秒ぐらいで見れますね (ただ netlify はCDNに乗ってないとでかいファイルが極端に遅くなるので、あんまり見られてない地域からとかだと遅くなるかも?)
🧐 1
Avatar
iWork for iCloud 10.0では、C++/ObjCで書かれWebAssemblyとして取り出された機能を含む様になったらしい。 https://twitter.com/lrz/status/1250453967957561344 (edited)
What have I been working on lately? Just a few days ago, iWork 10.0 shipped with iCloud apps that now include features extracted from the native codebase (C++/ObjC), using WebAssembly!
Likes
293
Avatar
omochimetaru 4/16/2020 1:49 AM
アップル自身が既存コードのWASMポートを運用してるのか〜
Avatar
やっとwasm向けFoundationのビルドが通るようになりました https://github.com/swiftwasm/swift/pull/1000
Bits of the dependency installation scripts were refactored to make the local development a bit easier. Overall, Foundation is not fully working yet due to the OOB bug, and to link with it you need...
🎉 10
3:49 AM
まだほとんど動かないですが…w
3:50 AM
リンクするとバイナリサイズは11MBから26MBにガッツリ太りました。 (edited)
Avatar
誰かがやるだろう思っていた SwiftWebUIのwasm移植を@CarsonKatriさんが始めたみたいです。 @State周りもちゃんと動いていて凄い https://twitter.com/kateinoigakukun/status/1268065986294378502?s=20
PoC of SwiftWebUI using SwiftWasm was published! https://t.co/SjWSQdi7w8
👀 1
6:31 AM
6:32 AM
SwiftUI with support for WebAssembly. Contribute to carson-katri/SwiftWebUI development by creating an account on GitHub.
6:32 AM
シュッと試すためのスクリプトもREADMEに用意されていたので手元で動かしてみると楽しいと思います。 (edited)
Avatar
omochimetaru 6/3/2020 6:33 AM
おお・・・
Avatar
omochimetaru 10/6/2020 1:20 PM
The SwiftWasm book to get you started. Contribute to swiftwasm/swiftwasm-book development by creating an account on GitHub.
1:20 PM
読んでる
Avatar
1:20 PM
昨日ちょっと書き足した
Avatar
omochimetaru 10/6/2020 1:21 PM
配布してるツールチェインはxctoolchainではないんだね
Avatar
あー、とりあえずtarballで配布してます
1:22 PM
xctoolchainだとなんか違うのかな
Avatar
omochimetaru 10/6/2020 1:22 PM
Xcodeから切り替えられるから安心感があった
1:22 PM
swiftenvを入れたくないので。
Avatar
あー、なるほど
Avatar
omochimetaru 10/6/2020 1:22 PM
自分で入れるとするとどこに置こうかなと迷う 迷うだけだけど
Avatar
swiftenv最近僕も微妙だと思い始めてきたのでちゃんとやろうかな
Avatar
omochimetaru 10/6/2020 1:23 PM
とりあえず $HOME/swift でも作ろっと
Avatar
ツールチェーンによってあったりなかったりするコマンドがあって、shimsが頻繁に壊れて事故る
Avatar
omochimetaru 10/6/2020 1:24 PM
1:25 PM
xctoolchainだと
1:25 PM
export TOOLCHAINS="org.swift.51220191107a" で
1:26 PM
swift自体が自力で切り替わってくれるようになるけど
1:26 PM
この形態の場合はこういう切り替える方法はあるんだろうか
1:26 PM
それともPATHで直接参照させるだけ?
Avatar
PATHの優先度変えるだけで良いと思います
1:27 PM
付随してるライブラリとかはswiftcからの相対パスで決まるので
Avatar
omochimetaru 10/6/2020 1:27 PM
PATHだけいじって $ swift が切り替わってれば他はいろいろと連動するはずってことね、OK
1:30 PM
げ!
1:30 PM
1:30 PM
全部のコマンドに対してこれが出るぞ!
Avatar
うそーん
Avatar
omochimetaru 10/6/2020 1:30 PM
一度右クリックから実行すれば許可リスト入りするけど
1:30 PM
bin/の中の全部にやるのは大変w
Avatar
なんかそれ手元では出ないんですよね
Avatar
omochimetaru 10/6/2020 1:32 PM
誰がビルドしたか的な情報が入ってんのかな。
1:33 PM
コマンドラインで一気に浄化する方法探してる
1:34 PM
EXAMPLES To check whether Mail.app is allowed to run on the local system: spctl -a /Applications/Mail.app To allow Frobozz.app to run on the local system: spctl --add --label "My Stuff" /Applications/Frobozz.app To forbid all code obtained from the Mac App Store from running: spctl --disable --label "Mac App Store"
Avatar
じゃあ僕はちゃんと署名する方法探します
Avatar
omochimetaru 10/6/2020 1:34 PM
助かるw
Avatar
omochimetaru 10/6/2020 1:43 PM
[omochi@omochi-iMacPro bin]$ sudo spctl --add --label swiftwasm $(pwd)/swift-demangle Password: [omochi@omochi-iMacPro bin]$ ./swift-demangle Killed: 9 [omochi@omochi-iMacPro bin]$ sudo spctl -a swift-demangle swift-demangle: rejected (the code is valid but does not seem to be an app)
1:43 PM
できそうでできないなあ
1:43 PM
--master-disable でセキュリティ全解除する情報ばっかり出てくる
Avatar
それは嫌だなぁ
Avatar
omochimetaru 10/6/2020 1:45 PM
I have a "command line tool" target (not an App bundle) in Xcode that is being blocked by Gatekeeper. I've used this tool for years as a simple installer for my PostCheck Address Book plugin. In 2...
1:45 PM
The solution is to distribute the command line tool on a signed disk image rather than in a zip file.
Avatar
100正しい
Avatar
omochimetaru 10/6/2020 1:46 PM
なんかspctlでコントロールできるのは .app だけな雰囲気がある
1:46 PM
the code is valid but does not seem to be an app
Avatar
うーんこれは誰の証明書でサインしたら良いんだ
1:50 PM
Apple Developer AccountはOSS Organizationみたいな括りは無いんだよな
Avatar
omochimetaru 10/6/2020 1:52 PM
CIで作ってるなら、誰かの秘密鍵をCIに設置しないといけないね・・・
1:55 PM
うおーだめだわからん、Finderで右クリックした時相当のspctlの叩き方が不明。
Avatar
それこそ手元で署名したら良いんじゃないですか?
Avatar
omochimetaru 10/6/2020 1:57 PM
再署名ってできるんかな
Avatar
再署名できるはず。XVimとか入れるのにXcode再署名したことがあるきがする
Avatar
omochimetaru 10/6/2020 1:58 PM
なるほど
Avatar
というか今回はもともと署名されてないから。。。 (edited)
Avatar
omochimetaru 10/6/2020 1:58 PM
実行ファイル単体って
1:58 PM
どこに署名がうまるんだ?
Avatar
objdumpするとinfo_plistなるセクションが出てくるからMachOバイナリとして埋まってるんじゃないですかね (edited)
Avatar
omochimetaru 10/6/2020 2:00 PM
なるほど。
Avatar
いや、よくわからんな… これ
Avatar
omochimetaru 10/6/2020 2:04 PM
iPhoneだけで、Mac developerのidentifier入ってなかった。また明日・・・
Avatar
なるほど
Avatar
omochimetaru 10/6/2020 2:06 PM
swift-demangleが通らなくてもswift demangleは通ったから(swift-frontend)は右クリック済み (edited)
2:06 PM
もしかしたら困ったら手動で右クリックしてればそんなに困らないかも
Avatar
なるほど?直接発火するバイナリさえ浄化されていればOK?
Avatar
omochimetaru 10/6/2020 2:07 PM
そうっぽい
Avatar
でも普通にbrewとかで入れたバイナリって署名されてないけどワーニングでないですよね。
2:09 PM
何が違うんだろう
Avatar
omochimetaru 10/6/2020 2:14 PM
たしかに・・・
2:15 PM
Safariでダウンロードすると
2:15 PM
危険マークが付く?
Avatar
そうかなと思ってさっき試してみたんですけど出ないんですよね
Avatar
omochimetaru 10/6/2020 2:19 PM
/usr/local は聖域?
2:21 PM
chromeで落としたけど駄目だった
2:22 PM
safariで落とした時に許可したやつはいけた。
2:22 PM
バイナリのハッシュ?に対して許可登録してるっぽいな。
Avatar
TN2206: Intermediate to expert level overview of macOS code signing that details specific options and gotchas
2:22 PM
読み始めた
Avatar
omochimetaru 10/6/2020 2:23 PM
思ったけど、もしかしてhomebrewは
2:23 PM
homebrew側でなんかやってんのかもね最後に。
Avatar
いや、やってないです
Avatar
omochimetaru 10/6/2020 2:23 PM
そうなのか
Avatar
brewで入れたgdbは自前で署名しないとプロセスアタッチの権限が無くて使えなかった記憶がある
Avatar
omochimetaru 10/6/2020 2:24 PM
ふむ
Avatar
$ codesign -dvvv /usr/local/bin/swiftlint /usr/local/bin/swiftlint: code object is not signed at all
Avatar
omochimetaru 10/6/2020 2:24 PM
Avatar
どうして俺たちのツールチェーンだけ…
Avatar
Kishikawa Katsumi 10/6/2020 2:25 PM
Notarizationは?
Avatar
omochimetaru 10/6/2020 2:27 PM
/usr/local/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin に動かしたけど駄目だなあ。 フォルダコピーするときにFinderが謎のダイアログを出して確認してきたからなんかいけそうな気がしたけど。
Avatar
Notarizationとcodesignは関連するんでしたっけ
2:29 PM
Apple's notary service requires you to adopt the following protections: Enable code-signing for all of the executables you distribute, and ensure that executables have valid code signatures, as described in Ensure a Valid Code Signature.
軽く調べただけなんですけど、Notarizationはcodesignを前提にしている? https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution
Avatar
Kishikawa Katsumi 10/6/2020 2:29 PM
それはちょっとわからないけど「開発元を〜」っていうアラートは公証があれば消えると思う。
2:30 PM
コードサインはなんでもいいんじゃないかな。
Avatar
なるほど
Avatar
Kishikawa Katsumi 10/6/2020 2:32 PM
Command Line ToolのApple公証を行う XcodeでCommand line toolを作っている場合、.appと同じ用にOrganizerから公証を行うことができません。 Terminalからコマンドを叩...
Avatar
ありがとうございます 🙏
Avatar
omochimetaru 10/6/2020 4:11 PM
右クリックで許可されたファイルであっても
4:11 PM
[omochi@omochi-iMacPro wasm]$ spctl -a /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/swift-frontend /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/swift-frontend: rejected (the code is valid but does not seem to be an app)
4:11 PM
spctlから見るとrejectedって出てる
4:11 PM
spctlを超える何かで許可されてる・・・
4:11 PM
昨日調べたやつだ
4:12 PM
com.apple.quarantine ついてるかどうかで
4:12 PM
変わる
4:12 PM
どこにも書いてないけど
Avatar
omochimetaru 10/6/2020 4:12 PM
なんじゃそりゃ・・・
Avatar
それだけ
Avatar
なんだそれ。。
Avatar
サイニングいらない
Avatar
When I’m packaging an application for deployment, I normally download the latest version from the vendor. If it’s a drag-and-drop install, where the application is a self-contained bund…
Avatar
homebrew は自分でダウンロードしてファイル作ってるから、そのフラグがつかないから
4:13 PM
サインしてないけど、そのバイナリでも実行できる (edited)
4:13 PM
普通にブラウザやcurlでダウンロードしたりzipで解答するとそのフラグがつくから、gatekeeperが、お?なにそれちょっとまって (edited)
4:14 PM
って言ってくる
Avatar
omochimetaru 10/6/2020 4:14 PM
[omochi@omochi-iMacPro wasm]$ sil-opt Killed: 9 [omochi@omochi-iMacPro wasm]$ xattr sil-opt xattr: No such file: sil-opt [omochi@omochi-iMacPro wasm]$ which sil-opt /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/sil-opt [omochi@omochi-iMacPro wasm]$ xattr $(which sil-opt) com.apple.quarantine [omochi@omochi-iMacPro wasm]$ sudo xattr -r -d com.apple.quarantine $(which sil-opt) Password: [omochi@omochi-iMacPro wasm]$ sil-opt --version LLVM (http://llvm.org/): LLVM version 10.0.0 Optimized build. Default target: x86_64-apple-darwin19.6.0 Host CPU: skylake-avx512
4:14 PM
ほんとだ できた・・・・
Avatar
notarization はサインしたあとのはなしだから (edited)
Avatar
omochimetaru 10/6/2020 4:14 PM
spctlじゃなかったのか。。。
Avatar
サインしなきゃそもそも要求されない
4:14 PM
ちがいますね
4:14 PM
どこにも書いてないし
Avatar
omochimetaru 10/6/2020 4:14 PM
アイヤー
Avatar
Appleのドキュメントも明言してないけど
Avatar
omochimetaru 10/6/2020 4:15 PM
ありがとうございます!
Avatar
First of all: I’m one of the developers of Little Snitch, a user-friendly firewall for macOS that allows creating rules on a per-application (or per-executable) basis. We occasionally have users who run into issues because executables installed via Homebrew do not have a code...
4:15 PM
長いけどこのスレ全部読むとなんとなくわかる
4:16 PM
I think you’re mixing up a few things here. Developer ID is a program by apple that provides code signing certificates, among other things. Developer ID has nothing to do with any review process whatsoever. Notarized apps are an extension of the Developer ID program. Notariz...
4:16 PM
このへんがポイント
Avatar
omochimetaru 10/6/2020 4:16 PM
find . -perm +111 -type fxattr を組み合わせたらガッと浄化できそう。
Avatar
そんな感じ
4:17 PM
昨日めっちゃ調べた
Avatar
omochimetaru 10/6/2020 4:17 PM
奇遇ですね。
Avatar
ちょっとバイナリ配布のアレがあって
Avatar
omochimetaru 10/6/2020 4:17 PM
ww
Avatar
いまいち理解してなくて
4:17 PM
人としてまずいと思ったので。。
Avatar
omochimetaru 10/6/2020 4:18 PM
おかげで人に成れた
Avatar
xattr -r -d com.apple.quarantine ディレクトリパス でディレクトリ内一気に消せますよ
Avatar
omochimetaru 10/6/2020 4:18 PM
マジか
4:18 PM
findもいらんかった
Avatar
-r は recursive
Avatar
omochimetaru 10/6/2020 4:19 PM
removeかなと思ってスルーしてしまった なるほど。
4:19 PM
recursive deleteか
Avatar
なんでかわかんないけど、まあ何と無くわかるんだけど
4:19 PM
このquatrain フラグをつけるのは、open(2)するプロセスの責任で (edited)
4:20 PM
べつにカーネルが面倒見てくれてるわけじゃないっぽいんだよねー。
Avatar
omochimetaru 10/6/2020 4:20 PM
え。
4:20 PM
じゃあシェルが勝手にやってるんですか
Avatar
だから、RubyとかでHTTP GETしてFile.write()したバイナリはそのまま実行できる
4:21 PM
サインされてなくても。
Avatar
omochimetaru 10/6/2020 4:21 PM
あ、フラグを付ける時の話ですか?
4:21 PM
実行時にフラグを見る話ではなく。
Avatar
そう。フラグつけるのは任意。
Avatar
omochimetaru 10/6/2020 4:22 PM
そうすると、safariがDLした時にフラグをつけて、それをmacOS標準のアーカイバが展開する時に、中身にフラグを付け直してるんかな。
Avatar
フラグ見るのは execve(2) でやられてる
4:22 PM
それっぽい
Avatar
omochimetaru 10/6/2020 4:22 PM
なるほど >execve
4:22 PM
ははあ・・・
Avatar
appleのツールは守ってる
4:23 PM
homebrewはRubyで書いてあるし、多分意図的に守ってない
4:23 PM
そもそもhomebrewを最初に入れるときに許可がいるっていう
4:23 PM
そう言う話だと思う
4:23 PM
あのインストーラースクリプトはcurlとかで取ってくる必要があるから。
4:24 PM
chain of trustかなあ
Avatar
omochimetaru 10/6/2020 4:24 PM
なるほどなあ
Avatar
かたや、notarizationはdeveloper idでサインしたら最近は必須だから、 (edited)
4:25 PM
サインすると面倒という見方も...
4:25 PM
どのみち、エンドユーザーにでるダイアログに大差ないからね
Avatar
なるほどなぁ
Avatar
iOSのようなサンドボックスじゃないシステムの妥協としてはまあ良い方なのでは。
4:27 PM
ということをAppleはどこかに書いたらいいとおもいます。 (edited)
4:28 PM
ブログ書いたらいいのかな。。
4:28 PM
辛いのは誤った情報が溢れてることなんだよね (edited)
4:28 PM
ITのひとの寝言みたいなやつとか
Avatar
omochimetaru 10/6/2020 4:30 PM
ITの人の寝言とは・・・w
Avatar
ITのひとがなんかこうしたら俺んとこでは解決したよみたいなまったく理論的でない個人のポエムみたいな情報かなあ
Avatar
omochimetaru 10/6/2020 4:31 PM
ww
4:35 PM
[omochi@omochi-iMacPro wasm]$ ls -alh total 20432 drwxr-xr-x 4 omochi staff 128B 10 7 01:32 . drwxr-xr-x 14 omochi staff 448B 10 7 01:07 .. -rw-r--r--@ 1 omochi staff 21B 10 7 01:08 a.swift -rwxr-xr-x 1 omochi staff 10M 10 7 01:32 a.wasm [omochi@omochi-iMacPro wasm]$ wasmer a.wasm hello world
4:35 PM
ハロワできた
💯 1
Avatar
codesignコマンドの--deepオプションが全然再帰的に効かなくて困った。。。
4:41 PM
$ sudo codesign --force --deep --sign "Developer ID Application: Neko Chan (XXXXXXXXX)" --options runtime --deep-verify swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/ $ codesign -display swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift-package swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift-package: code object is not signed at all (edited)
Avatar
omochimetaru 10/6/2020 4:41 PM
/Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi';
4:42 PM
XCTestはないから swift test はできない?
Avatar
いや、あるんですよ
Avatar
omochimetaru 10/6/2020 4:43 PM
なんか俺が間違えてるんかな
Avatar
うーんなんかツールチェーンが腐っている気がする。。。
Avatar
ねこちゃん
Avatar
🐱
Avatar
omochimetaru 10/6/2020 4:45 PM
[omochi@omochi-iMacPro usr]$ tree | grep -i xctest │   │   │   ├── XCTest.swiftmodule │   │   │   │   ├── XCTest.opt.bitstream │   │   │   ├── libswiftXCTest.dylib │   │   │   ├── XCTestOverlayShims.h │   │   ├── XCTest.swiftdoc │   │   ├── XCTest.swiftmodule │   │   ├── XCTestOverlayShims.h │   ├── libXCTest.a │   └── swiftpm-xctest-helper
4:45 PM
たしかになんかは入ってるな
Avatar
オフィシャルのツールチェーンと比較しようと思ったのにswift.orgが落ちててスナップショット落とせない。。。
Avatar
omochimetaru 10/6/2020 4:48 PM
うーん、 --sdk を指定してないのがいかんのかと思ったが
4:48 PM
swift build と swift test は指定すると逆に通らないな
4:48 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot <module-includes>:1:10: note: in file included from <module-includes>:1: #include "LibcOverlayShims.h" ^ /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift/shims/LibcOverlayShims.h:31:10: error: 'semaphore.h' file not found #include <semaphore.h> ^ <unknown>:0: error: could not build C module 'SwiftOverlayShims' <module-includes>:1:10: note: in file included from <module-includes>:1: #include "../../../../share/wasi-sysroot/include/ctype.h" ^ <module-includes>:1:10: note: in file included from <module-includes>:1: #include "LibcOverlayShims.h" ^
4:49 PM
a
4:49 PM
ミスってた
4:50 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift test --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot /Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi'; found: arm64e-apple-ios-macabi, x86_64-apple-ios-macabi, arm64, arm64-apple-macos, x86_64, arm64e-apple-macos, x86_64-apple-macos, arm64-apple-ios-macabi, arm64e import XCTest ^ /Users/omochi/github/omochi/SwiftDeclWeb/Tests/SDWVDOMTests/VDOMTests.swift:1:8: error: could not find module 'XCTest' for target 'wasm32-unknown-wasi'; found: arm64e-apple-ios-macabi, x86_64-apple-ios-macabi, arm64, arm64-apple-macos, x86_64, arm64e-apple-macos, x86_64-apple-macos, arm64-apple-ios-macabi, arm64e import XCTest ^ error: fatalError
4:51 PM
ビルドは通った (TOOLCHAIN_PATHがシェルから消えてた) けど、could not findだ
Avatar
あ、corelibsのswiftmoduleの配置がマズそう (edited)
4:55 PM
とりあえずIssue立てておきます
Avatar
omochimetaru 10/6/2020 4:56 PM
古いのダウンロードしたらいけたりするやつ?
4:56 PM
いまやってるの swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a なんだけど。
Avatar
動くスナップショットはあるはず
Avatar
omochimetaru 10/6/2020 4:57 PM
なるほどね
4:57 PM
bookに出てくるやつにするわ
Avatar
10/2はもう腐ってます
🧟‍♀️ 1
Avatar
omochimetaru 10/6/2020 4:58 PM
笑う (edited)
4:58 PM
イントロで紹介してるの10/2やで
Avatar
それは凄く良くない
4:59 PM
e2eテストが足りてないですね。
Avatar
omochimetaru 10/6/2020 4:59 PM
しょうがないよやること無限にある
Avatar
たぶん1ヶ月前くらいのスナップショットなら動くと思うんですけど、古いのもはオプティマイザが壊れてたり別の問題があるのでとりあえずXCTestは待っててください
Avatar
omochimetaru 10/6/2020 5:00 PM
了解!
Avatar
同様にFoundationもimportできないと思います 😢
5:00 PM
あれ、できた
Avatar
omochimetaru 10/6/2020 5:02 PM
executable作ってFoundation走るかみてみる。
5:06 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build --triple wasm32-unknown-wasi --sdk $TOOLCHAIN_PATH/share/wasi-sysroot wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSTimeZone.swift.obj): undefined symbol: CFHash wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: _CFDeinit wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: CFDateGetTypeID wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSDate.swift.obj): undefined symbol: CFDateGetTypeID wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(NSRegularExpression.swift.obj): undefined symbol: kCFAllocatorSystemDefault
5:06 PM
エラーが1000行出てきた
5:07 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ tree -L 2 -d $TOOLCHAIN_PATH/share/wasi-sysroot /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/bin/../share/wasi-sysroot ├── include │   ├── arpa │   ├── bits │   ├── c++ │   ├── net │   ├── netinet │   ├── netpacket │   ├── scsi │   ├── sys │   └── wasi ├── lib │   ├── wasm32-wasi │   └── wasm32-wasi-unknown ├── share │   └── wasm32-wasi └── usr └── include 17 directories
5:07 PM
sysrootはあってると思う・・・
Avatar
あ、
5:08 PM
思い出した
👀 1
5:09 PM
{ "extra-cc-flags" : [ "-I", "TOOLCHAIN_DIR/usr/lib/swift/wasi/wasm32" ], "extra-cpp-flags" : [ ], "target" : "wasm32-unknown-wasi", "version" : 1, "extra-swiftc-flags" : [ "-I", "TOOLCHAIN_DIR/usr/lib/swift/wasi/wasm32", "-Xlinker", "-lFoundation", "-Xlinker", "-lCoreFoundation", "-Xlinker", "-lBlocksRuntime", "-Xlinker", "-licui18n", "-Xlinker", "-luuid" ], "sdk" : "TOOLCHAIN_DIR/usr/share/wasi-syroot", "toolchain-bin-dir" : "TOOLCHAIN_DIR/usr/bin" }
5:10 PM
こういうdestinationファイルを作って、TOOLCHAIN_DIRを置換して、
5:10 PM
swift build -c debug --build-tests --destination wasm32-unknown-wasi.json
5:11 PM
--destination オプションに渡す
Avatar
omochimetaru 10/6/2020 5:11 PM
やってみます。
Avatar
cartonでビルドするとこれ隠蔽されるんですけど、たぶんおもちさんの好みじゃ無さそう
Avatar
omochimetaru 10/6/2020 5:14 PM
carton使う気は無いですね
5:14 PM
好みじゃなくて・・・
5:14 PM
[omochi@omochi-iMacPro SwiftDeclWeb]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(Data.swift.obj): undefined symbol: _withStackOrHeapBuffer clang-10: error: linker command failed with exit code 1 (use -v to see invocation) error: link command failed with exit code 1 (use -v to see invocation) [16/18] Linking SwiftDeclWebPackageTests.xctest
5:14 PM
なんかもうちょっとぽい感じになった。
5:14 PM
エラー一件
Avatar
なんだこれ
5:17 PM
package initで作ったパッケージでは通る
5:19 PM
The error is raised by wasm-ld: wasm-ld: error: /Users/maxd/.carton/sdk/wasm-5.3-SNAPSHOT-2020-09-23-a/usr/share/wasi-sysroot/lib/wasm32-wasi/ libc.a(__original_main.o): undefined symbol: main The ...
5:20 PM
直したやつっぽい
Avatar
omochimetaru 10/6/2020 5:20 PM
[omochi@omochi-iMacPro wpkg]$ swift package init --type executable Creating executable package: wpkg Creating Package.swift Creating README.md Creating .gitignore Creating Sources/ Creating Sources/wpkg/main.swift Creating Tests/ Creating Tests/LinuxMain.swift Creating Tests/wpkgTests/ Creating Tests/wpkgTests/wpkgTests.swift Creating Tests/wpkgTests/XCTestManifests.swift [omochi@omochi-iMacPro wpkg]$ open . [omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:20:23: error: cannot find 'Process' in scope let process = Process() ^~~~~~~ /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:23:20: error: cannot find 'Pipe' in scope let pipe = Pipe() ^~~~ /Users/omochi/temp/wpkg/Tests/wpkgTests/wpkgTests.swift:44:28: error: value of type 'Bundle' has no member 'bundleURL' return Bundle.main.bundleURL ~~~~~~~~~~~ ^~~~~~~~~ [6/9] Compiling wpkgTests XCTestManifests.swift
5:20 PM
完全に空のディレクトリからやりなおしてみたらこうなった (edited)
Avatar
Processは使えない気がする (edited)
Avatar
omochimetaru 10/6/2020 5:21 PM
ああ、たしかに。
5:21 PM
これをちょっと書き換えてみるか
5:22 PM
import XCTest final class wpkgTests: XCTestCase { func testExample() throws { XCTAssertTrue(true) } static var allTests = [ ("testExample", testExample), ] }
5:22 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swift_static/wasi/libFoundation.a(Data.swift.obj): undefined symbol: _withStackOrHeapBuffer clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [7/8] Linking wpkgPackageTests.xctest
5:22 PM
同じシンボルでコケた
5:23 PM
ほんとだ。リグレッションだ > issue 1824
5:23 PM
10/05が駄目なんだな
5:24 PM
10/02にしてみるか。
Avatar
$ cat Tests/helloTests/helloTests.swift import XCTest final class helloTests: XCTestCase { func testExample() throws { XCTAssertTrue(true) } static var allTests = [ ("testExample", testExample), ] } $ ~/Downloads/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a.xctoolchain/usr/bin/swift build -c debug --build-tests --destination wasm-5.3-SNAPSHOT-2020-09-08-a.json [12/12] Linking helloPackageTests.xctest /var/folders/br/7sr_p7cj7v549x_gtkb33df00000gp/T/tmp.BSZU6PLa $ wasmer ./.build/debug/helloPackageTests.xctest Test Suite 'All tests' started at 2020-10-06 17:24:16.346 Test Suite 'testBundle.xctest' started at 2020-10-06 17:24:16.346 Test Suite 'helloTests' started at 2020-10-06 17:24:16.346 Test Case 'helloTests.testExample' started at 2020-10-06 17:24:16.346 Test Case 'helloTests.testExample' passed (0.0 seconds) Test Suite 'helloTests' passed at 2020-10-06 17:24:16.346 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'testBundle.xctest' passed at 2020-10-06 17:24:16.347 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2020-10-06 17:24:16.347 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
5:25 PM
うーーん??
Avatar
omochimetaru 10/6/2020 5:25 PM
そっちも1005なのか。
5:25 PM
あれ、.xctoolchain ?
Avatar
ああ、これは作業中のツールチェーンです
5:26 PM
バイナリ自体には影響ない
Avatar
omochimetaru 10/6/2020 5:26 PM
あとdestinationファイルは09-08?
5:26 PM
jsonの中身は1005なの?
Avatar
お、合わせたら再現した
5:28 PM
じゃあ09-08は動く
Avatar
omochimetaru 10/6/2020 5:29 PM
なるほど。
5:35 PM
10-02で同じエラーでた
5:35 PM
09-08落とす
Avatar
5.3-SNAPSHOT-2020-10-02-a はOK
Avatar
omochimetaru 10/6/2020 5:41 PM
あー、DEVELOPMENTなしのほうか (edited)
Avatar
そっちはもうちょっと安定してる
Avatar
omochimetaru 10/6/2020 5:41 PM
なるほど
5:48 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-09-08-a/usr/wasm32-unknown-wasi.json wasm-ld: error: /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-09-08-a/usr/share/wasi-sysroot/lib/wasm32-wasi/libc.a(__original_main.o): undefined symbol: main clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) [8/9] Linking wpkgPackageTests.xctest
5:48 PM
グアア
5:49 PM
10-02 無印 ダウンロードする
Avatar
ウオー見つけた
Avatar
omochimetaru 10/6/2020 6:01 PM
ウオオオw
6:02 PM
__withStackOrHeapBuffer のテストケースがあれば・・・
6:02 PM
[omochi@omochi-iMacPro wpkg]$ swift build -c debug --build-tests --destination /Users/omochi/swift/swift-wasm-5.3-SNAPSHOT-2020-10-02-a/usr/wasm32-unknown-wasi.json [12/12] Linking wpkgPackageTests.xctest (edited)
6:03 PM
10-02無印でビルドできました!!
6:03 PM
[omochi@omochi-iMacPro wpkg]$ wasmer .build/debug/wpkgPackageTests.xctest Test Suite 'All tests' started at 2020-10-06 18:03:44.789 Test Suite 'testBundle.xctest' started at 2020-10-06 18:03:44.790 Test Suite 'wpkgTests' started at 2020-10-06 18:03:44.790 Test Case 'wpkgTests.testExample' started at 2020-10-06 18:03:44.790 Test Case 'wpkgTests.testExample' passed (0.0 seconds) Test Suite 'wpkgTests' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'testBundle.xctest' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2020-10-06 18:03:44.790 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
6:03 PM
XCTest走った〜〜
6:05 PM
お、手元のプロジェクトの方もビルド実行できた
6:06 PM
bookのやつは無印の10-02だから結局オッケーだったのか。
Avatar
わーい 🙌
Avatar
omochimetaru 10/6/2020 6:08 PM
今日は終わっときます〜 どうもありがとう〜
Avatar
おやすみなさい〜
Avatar
知見のおおいthreadだった
Avatar
destination.jsonの書き方はこれか。 https://github.com/apple/swift-package-manager/pull/1098
General This adds experimental support for cross compilation or more precisely configurable destinations for binaries to SwiftPM. The basic idea is that you hand a JSON file in the format described...
Avatar
とりあえずFoundationリンクできないやつは治った https://github.com/swiftwasm/swift-corelibs-foundation/pull/143
Resolve swiftwasm/swift#1824 (comment) $ swift build -c debug --build-tests --destination wasm32-unknown-wasi.json wasm-ld: error: /path/to/swift-wasm-DEVELOPMENT-SNAPSHOT-2020-10-05-a/usr/lib/swi...
Avatar
norio_nomura 10/7/2020 5:06 AM
.xctoolchainにしてexport TOOLCHAINS="org.swift.…"でツールチェインを切り替える仕組みは、SwiftPMがツールチェイン添付のXCTest.swiftmoduleを使ってくれないから、SwiftWasmには使えないんじゃないかな。 (edited)
Avatar
そうなんですよね。今はとりあえずdestinationファイルで-I付けてツールチェーンのXCTest.swiftmoduleを優先するようにしてるんですけど微妙。。。 (edited)
Avatar
omochimetaru 10/7/2020 1:22 PM
C側ではattribute付きのextern宣言をしておいて、 WebAssembly.instantiate でJS側の関数をWASM環境にいれるやつ
1:22 PM
これ引数と返り値の型はどうやって合わされてるの?
Avatar
実行時検査ですね
Avatar
omochimetaru 10/7/2020 1:24 PM
あー、C側の呼び出しが
1:24 PM
WASM環境だから
1:24 PM
ランタイムが引数の型を知っている?
1:25 PM
普通のC環境だったらcallerが信じてるcalleeの呼び出し規約と引数に応じてレジスタ/スタックを構成してからジャンプするけど
1:26 PM
WASMだと 関数と引数を指定してコールする抽象度だから、
1:26 PM
WASMランタイムがその情報に基づいて引数の値をWASMの型からJSの型に変換してからJSの関数を呼ぶ?
Avatar
多分そういう実装になっているはず
Avatar
omochimetaru 10/7/2020 1:28 PM
なるほど・・・
Avatar
calleeが引数をどう使おうと要求している引数の数が提供される数を超えない限りは問題ない
Avatar
omochimetaru 10/7/2020 1:29 PM
仮引数に対して実引数の数が足りてなくても
1:29 PM
JSだったらundefinedになって呼び出されそう
1:29 PM
例外飛ぶんだっけ
Avatar
どうだろう。。
Avatar
omochimetaru 10/7/2020 1:29 PM
あと
1:29 PM
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
1:30 PM
// Output stdout and stderr to console const originalWriteSync = wasmFs.fs.writeSync; wasmFs.fs.writeSync = (fd, buffer, offset, length, position) => { const text = new TextDecoder("utf-8").decode(buffer); // Filter out standalone "\n" added by every `print`, `console.log` // always adds its own "\n" on top. if (text !== "\n") { switch (fd) { case 1: console.log(text); break; case 2: console.error(text); break; } } return originalWriteSync(fd, buffer, offset, length, position); };
1:30 PM
これがいまいち理解できないんだけど
1:30 PM
ここにかいてある print って Swift.print のこと?
Avatar
これ書いた覚えがないな…
1:30 PM
多分そうだと思うます
1:31 PM
↑bookにもこの書き換えが出てくる
1:31 PM
Swift.print の末尾の改行が不要なのであれば、 print(str, terminator: "") って呼び出せばよくない?
Avatar
たぶんconsole.logの改行とSwift.print側の改行で2つ改行されるのが嫌なんじゃないですかね
Avatar
omochimetaru 10/7/2020 1:32 PM
この wasmFS.fs.writeSync の先に繋がってる console.log で勝手に改行されて改行が2つになることを気にしてそうな
Avatar
そうそう
Avatar
omochimetaru 10/7/2020 1:33 PM
でも、それおかしいことになるよね
1:33 PM
console.logはどうやったって改行をつけちゃうというか
Avatar
途中に改行入ってたりすると壊れる
Avatar
omochimetaru 10/7/2020 1:33 PM
与えられた文字列の単位で行をわけて表示する仕組みだから
1:33 PM
逆にそもそも Swift.print("str", terminator: "") ってやっていたとしても
1:33 PM
console.logによる改行?というか表示上の区切りは生じる
1:34 PM
blameみるとたしかにこれかいたのはJedFoxさんだな
1:35 PM
いや、ちがうな、
1:35 PM
更にずっと前に Max も同じことやってる
1:36 PM
ア…
1:36 PM
まあ見た目をキレイにしたい気持ちはわかる
Avatar
omochimetaru 10/7/2020 1:36 PM
やるなら改行が来るまでバッファリングして
1:37 PM
改行のところで分割してconsole.logだったら
1:37 PM
結果が同じになるから正しいと思う・・・
1:37 PM
でも fflush() が呼ばれたら詰む。 (edited)
Avatar
どうしようもない
Avatar
omochimetaru 10/7/2020 1:40 PM
console.logにマッピングしてるのがまあ無理だよね
Avatar
Node.jsだったらprocess.stdout.writeにマップして幸せになれる
1:42 PM
ブラウザでのSwift.printはどうせ開発者しか見ないし。。。
Avatar
omochimetaru 10/7/2020 1:42 PM
Monorepo for Javascript WebAssembly packages by Wasmer - wasmerio/wasmer-js
1:43 PM
デフォルトのconsole.logにつなげてる場所どこだろ
Avatar
wasmer-jsのリポジトリではそういうユースケースないです
Avatar
omochimetaru 10/7/2020 1:44 PM
const originalWriteSync = wasmFs.fs.writeSync;
Avatar
wasiアプリケーションのstart関数が終わった後にまとめてstdoutをprintしてる
Avatar
omochimetaru 10/7/2020 1:44 PM
このoriginalWriteSyncの実装はどこに?
1:44 PM
1:44 PM
あ〜
Avatar
じっそう?
Avatar
omochimetaru 10/7/2020 1:45 PM
これフックしてconsole.logに横流ししてるだけか
Avatar
そうそう。フックしてconsole.logに流した後、元のwriteSync呼ばないとバッファリング壊れるんで。 (edited)
Avatar
omochimetaru 10/7/2020 1:45 PM
読み間違えてた。なるほど。
1:46 PM
これがないと wasmfs的には /dev/stdout にファイルとして書き溜めてるだけなのね
Avatar
そうなんです。
Avatar
omochimetaru 10/7/2020 1:48 PM
うーん。Swift側にconsole.logを意味的にもインポートしてくるのが良さそうだなあ。
1:48 PM
でもXCTestの出力は多分勝手にstdoutに出されてるよね・・・
Avatar
Rustはwasm-bindgenでconsole.logをRust側に引っ張ってきてますね。
1:48 PM
そうなんですよ
Avatar
omochimetaru 10/7/2020 1:49 PM
XCTestの出力は逐次で見たいなあ。
Avatar
XCTestは大体wasmerとかwasmtimeとかコマンドラインでやるからconsole.log必要なくないですか? (edited)
Avatar
omochimetaru 10/7/2020 1:51 PM
DOMがちゃんと操作されるかテストしたい。
Avatar
ああそうか〜
Avatar
omochimetaru 10/7/2020 1:51 PM
だからブラウザ上でしかテストできない。
1:51 PM
This seems like a bit of a computing systems 101 question, but I'm stumped. I am integrating existing code from C/C++ project A into my own project B. Both A and B will be linked into a single
1:51 PM
C環境で、freopenとかdupとかで
1:52 PM
stdoutの向き先を自前で用意したpipeにすることができるんだけど
1:52 PM
WASI上でそういうのできんのかな。
Avatar
wasi-libc側でできそう
Avatar
omochimetaru 10/7/2020 1:55 PM
どういうスタックになってるんだ?
Avatar
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
Avatar
omochimetaru 10/7/2020 1:55 PM
wasi-libc が wasi APIの上で実装されたlibc ?
1:56 PM
こう
Avatar
omochimetaru 10/7/2020 1:56 PM
Swiftはlibcを使ってるつもりになっているのか
1:56 PM
普通のプラットフォームがこれ
Avatar
omochimetaru 10/7/2020 1:56 PM
freopenだとファイルパスだからちょっと微妙だよね、dup2が良さそうだ
1:57 PM
なるほど
1:57 PM
freopenの中がdup3だ
Avatar
リダイレクトしてどうするんですか?
Avatar
omochimetaru 10/7/2020 1:58 PM
自作のpipeオブジェクトに対して
1:58 PM
別スレッドからselect pollingすればリアルタイムに吸い出せる
1:58 PM
いやスレッドないな・・・
1:59 PM
stdoutに来てるストリームを受け取れればあとはどうにでもなるので。consoleには出せないけど。
1:59 PM
<pre> タグの中に流し込んでいくとかのほうがマシな挙動だと思う。
2:00 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:00 PM
WebAssembly System Interface. Contribute to WebAssembly/WASI development by creating an account on GitHub.
2:01 PM
WASIになんかリッチな名前のdupがあった
Avatar
ちゃんと名前がついていてわかりやすい
2:02 PM
writeFileSyncで引っ掛けてpreタグに流し込むだとまずいんでしたっけ
Avatar
omochimetaru 10/7/2020 2:02 PM
制御がSwift側にない。
2:02 PM
JS側でできるだけ何もしたくない・・・
Avatar
なるほど
Avatar
omochimetaru 10/7/2020 2:03 PM
でもなんかコスパに見合ってる感じがしないねえ。
2:04 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:04 PM
freopenがrenumberでかいてあるんだな
2:04 PM
これsyscallはどこに行くんだろ
2:04 PM
f2 = fopen(filename, mode); if (!f2) goto fail; if (f2->fd == f->fd) f2->fd = -1; /* avoid closing in fclose */ #ifdef __wasilibc_unmodified_upstream // WASI has no dup else if (__dup3(f2->fd, f->fd, fl&O_CLOEXEC)<0) goto fail2; #else // WASI doesn't have dup3, but does have a way to renumber // an existing file descriptor. else { if (__wasilibc_fd_renumber(f2->fd, f->fd)<0) goto fail2; f2->fd = -1; /* avoid closing in fclose */ } #endif
Avatar
syscallはよばれないっすよ
Avatar
omochimetaru 10/7/2020 2:04 PM
いやなんか不穏だな
2:05 PM
なるほど・・・
Avatar
改造前のコードが残ってるだけですね
Avatar
omochimetaru 10/7/2020 2:05 PM
そういうことか〜
2:05 PM
じゃあこのwasi-libcにはdup2はなくって
2:05 PM
freopenはあって普通にC関数としてwasiのrenumberを呼ぶのか。
Avatar
ですね
Avatar
omochimetaru 10/7/2020 2:06 PM
逆にWASMSwift環境からは
2:06 PM
普通にWASI APIは直接触れる?
Avatar
ヘッダインクルードすれば
2:07 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
2:08 PM
wasi APIって言っても、ただモジュール名と関数名とシグネチャが指定されてるextern関数なので
Avatar
omochimetaru 10/7/2020 2:09 PM
なるほど
Avatar
特に特別扱いされてないですね
Avatar
omochimetaru 10/7/2020 2:10 PM
wasi側のAPIでなんとかfdを作ってrenumberでstdoutをくっつけてから非同期に読み出せれば
2:10 PM
やりたいことはできそうだな。
Avatar
非同期に読み出せるか…?
Avatar
omochimetaru 10/7/2020 2:12 PM
poll_oneoff(in: ConstPointer<subscription>, out: Pointer<event>, nsubscriptions: size) -> (errno, size)
2:13 PM
うーんちがうのかな。
2:13 PM
読めるように成ったら関数読んでくれるコールバック登録的な仕組みがあればできそうだけど
2:15 PM
そもそもファイルに紐付かないfdが欲しいけど・・・
Avatar
libcのレイヤーでそういうのあるのかな
Avatar
omochimetaru 10/7/2020 2:17 PM
open の世界だったら pipe がそう
2:18 PM
fopen が返す FILE* は 生fd のラッパー
2:20 PM
mkfifoでパス付きのpipeを作ってfopenするとFILE*に見えるけどpipeらしい。でもlibcじゃなさそう。
2:22 PM
うーんなんかなさそうな気がするな〜
Avatar
コールバックはなさそう
Avatar
omochimetaru 10/7/2020 2:23 PM
unixのファイルディスプリプタは
2:23 PM
ファイルといっても実際には抽象的なストリームで
2:23 PM
pipeもsocketも抽象化されてるんだけど
2:23 PM
wasiのファイルディスクリプタは本当にファイルシステムの方のやつしかなさそう?
2:24 PM
poll_oneoff(in: ConstPointer<subscription>, out: Pointer<event>, nsubscriptions: size) -> (errno, size) Concurrently poll for the occurrence of a set of events.
2:24 PM
poll_oneoffがconcurrencyって書いてあるんだけど
2:24 PM
subscriptionの構築方法がさっぱりわかrなn
2:26 PM
subscription { subscription_u { subscription_fd_readwrite { file_descriptor } } }
2:26 PM
なんかこんなのを作れば fd が監視できる気がする?
2:26 PM
でもコールバック関数を渡せそうな場所がない。
Avatar
これシグネチャ的に関数ポインタ渡せなくないですか
2:27 PM
ですね
2:28 PM
pollの実装に使われてるからこれは待つ感じかな
Avatar
omochimetaru 10/7/2020 2:29 PM
あー
Avatar
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
Avatar
omochimetaru 10/7/2020 2:30 PM
メインループの中で使うやつか。
2:31 PM
イベントが無かったらすぐ抜ける方なのかなあ。
2:33 PM
なんか、自分で、毎フレーム呼びまくってポーリングするためのものにも見える
Avatar
ぽい
2:34 PM
libcのapiってそういうの多いですよね
2:35 PM
あ、
2:35 PM
fd_writeって関数をSwift側に作ってリンク時に静的にそっちに実装が紐づくようにすれば良いんですよ
Avatar
omochimetaru 10/7/2020 2:36 PM
あー
2:37 PM
それstdout以外はどうしよう
2:38 PM
libc上でやるんじゃなくてlibc実装をフックするのは確かに・・・
2:39 PM
でもそれだったらあれだね、最初のJSの方式で
Avatar
void __wasi_fd_write(...) { // do redirect return original_fd_write(...); } void original_fd_write(...) __attribute__(( __import_module__("wasi_snapshot_preview1"), __import_name__("fd_write") )) (edited)
2:39 PM
こんな感じになるかな
Avatar
omochimetaru 10/7/2020 2:40 PM
あー
2:40 PM
そこは名前指定がもう一手かかってるのかややこしいな
Avatar
ややこしい
2:42 PM
Safariがi64をJS境界でサポートしていないことのpolyfillでも似たようなことした https://github.com/kateinoigakukun/swiftwasm-pad/blob/master/Frontend/Sources/i64_polyfill/i64_polyfill.c
swiftwasm-pad is a online playground to help developers learn about Swift on Web. - kateinoigakukun/swiftwasm-pad
Avatar
omochimetaru 10/7/2020 2:44 PM
今のビルドだと
2:45 PM
sysrootの中にある何かが既にそれをやってるんだよね?
2:45 PM
なんていえばいいんだ、wasiのfd_writeの実態に紐付けられようとしてるexternは既に書かれてる (edited)
2:47 PM
Swiftstdlibとかももうlibcとリンクされてるわけで
2:47 PM
そこをつなぎ替える?
Avatar
いや、Swiftサイドはwasiのインターフェースをフックするみたいなことはしてないです
Avatar
omochimetaru 10/7/2020 2:48 PM
wasi-libcをビルドしてできたlibcがツールチェインに既に入っているんじゃ?
Avatar
Swift stdlibはlibcとリンクされているけど、__wasiプレフィックスの付いてるexternなやつたちはundefinedのままです
Avatar
omochimetaru 10/7/2020 2:49 PM
なるほど。
Avatar
リンクされている、は嘘だ。
2:50 PM
実行可能ファイルに最終的にリンクするときに全部一気にリンクする
Avatar
omochimetaru 10/7/2020 2:50 PM
バラバラにstatic libで配布されててswiftpmがリンクしてるけど
2:50 PM
wasiシンボルはそれでもまだつなげていなくて
2:50 PM
それはwasm上でロードするときにwasmerのjs実装が流し込まれてるのか。
Avatar
で、その結果、最後までundefinedだったシンボルについて、ランタイムサイドからインポートするようなImportセクションを書き出すのがリンカの仕事です
Avatar
omochimetaru 10/7/2020 2:51 PM
そうするとやっぱJSで流し込む直前につなぎ替えることになりそう
Avatar
つなぎかえ?
Avatar
omochimetaru 10/7/2020 2:52 PM
> void __wasi_fd_write(...) { > // do redirect > return original_fd_write(...); > } > void original_fd_write(...) __attribute__(( > __import_module__("wasi_snapshot_preview1"), > __import_name__("fd_write") > )) (edited)
2:53 PM
↑この方法が機能しない気がしてる
2:54 PM
__attribute__(( __import_module__("wasi_snapshot_preview1"), __import_name__("fd_write") )) __wasi_fd_write(...) ↑すでにこう書かれたヘッダーがビルドに含まれてるわけでしょ?
Avatar
はい
Avatar
omochimetaru 10/7/2020 2:54 PM
original_fd_write と、 wasi関数を受け取ろうとしてるやつが2つできちゃうし
2:54 PM
どっちが本物になるのか曖昧にならん?
Avatar
あー、
2:55 PM
たぶんおもちさんの誤解ポイントが分かった
Avatar
omochimetaru 10/7/2020 2:55 PM
もともとある wasiのfd_writeをつなぎこもうとしてる __wasi_fd_write と 新たに作ろうとしてる、 もうひとつの fd_writeを本当につなぎたい original_fd_write と、
2:55 PM
2つある状態になる。
Avatar
リンカがシンボルを解決するタイミングでは __import_name__ は見ていなくて、C的なシンボルでルックアップしています
Avatar
omochimetaru 10/7/2020 2:57 PM
あ、じゃあ、実装付きの __wasi_fd_write が別途存在すればそれはそこにつながるのか。
Avatar
で、wasi-libc側のヘッダに書かれた __wasi_fd_write は実装が無いがユーザーが定義した __wasi_fd_write には実装があるので、この時点で __wasi_fd_write はundefinedなシンボルではなくなります
Avatar
omochimetaru 10/7/2020 2:57 PM
ふむふむ
Avatar
definedなシンボルに対してはリンカはimportエントリを発行しないのでwasi-libc側のヘッダの __import_name__ は無視されます
Avatar
omochimetaru 10/7/2020 2:59 PM
はいはい。
Avatar
original_fd_write は実装が無いのでundefinedなので、__import_name__ に基づいてimportエントリを発行します
2:59 PM
なのでリンカ的には曖昧さは無いんですよ
Avatar
omochimetaru 10/7/2020 3:00 PM
なるほどー そこの処理手順がわかってなかった
3:01 PM
たしかにそれなら安定した挙動でさしこめるな。
Avatar
リンカを書くとリンカの気持ちがわかるようになる
Avatar
omochimetaru 10/7/2020 3:03 PM
シンボル解決できたらimport attributeを無視するの気持わかるのだいぶ深い
3:06 PM
あ、もう一個シンプルな方法あるな
3:06 PM
/dev/stdout を wasi で fopen して poll_oneoff 回せば良いんだ。
3:07 PM
スレッドは立てられないから、requestRenderで毎回見るとかtimerとかぶん回す必要があるけど
Avatar
あー、別のwasmインスタンスを作ってその中で回す?
Avatar
omochimetaru 10/7/2020 3:07 PM
別のインスタンス!?
3:07 PM
そんな裏技があるの
Avatar
え、WebAssembly.instantiateをJSから作るだけ。。。
Avatar
omochimetaru 10/7/2020 3:08 PM
回すとは?
3:08 PM
this.view.setUint32(nevents, eventc, true); while (bindings.hrtime() < waitEnd) { // nothing } return WASI_ESUCCESS;
3:09 PM
タイムアウト無限だとビジーループしてそうなんだよね実装が
Avatar
wasmerのwasiインスタンスをもう一つのwasmインスタンスと共有してpollを回す
Avatar
omochimetaru 10/7/2020 3:09 PM
The window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser calls a specified function to update an animation before the next repaint. The method takes a callback as an argument to be invoked before the repaint.
3:10 PM
ブラウザだと多分これが良いんだと思う
3:10 PM
ああ、「回す」の
3:11 PM
ループを作る方法が問題ってこと。
Avatar
あーそうか
3:12 PM
難しいな
Avatar
omochimetaru 10/7/2020 3:12 PM
今年も vimconf にスタッフ兼発表者として参加してきました.名札の名前が「ドッグ」でじわじわきました… 開場 当日は準備スタッフの作業のために 8:30 に会場へ.山手線の遅延に巻き込まれて 8:45 ぐらいに到着. 電源ケーブルの配線などをやりました. Vim on Browser vimconf での発表は今年で3回目です.最近趣味ではウェブのフロントエンド周りや Electron を触っているので,今回は便利プラグインとかの実用的な話からそれて "Vim on Browser" というタイトルで発表してきました. ブラウザ上で「本物の」...
Avatar
requestAnimationFrameがマシなのか
Avatar
omochimetaru 10/7/2020 3:12 PM
りんださんがvimをブラウザで動かした時に同じような問題があってそうやってたって言ってたようなないような (edited)
Avatar
見たことがある気がする
3:15 PM
こっちのスライドだ
Avatar
omochimetaru 10/7/2020 3:16 PM
WebWorkerで並行実行させて
Avatar
atomicで止める
Avatar
omochimetaru 10/7/2020 3:17 PM
AtomicsAPIとやらでタイミングを制御とな
3:18 PM
うーむ。
8:54 AM
関数にしておけば名前が被ってしまう問題も回避できそうに思います。
Avatar
シャドーイングを回避するとそうなりますよねー
Avatar
メソッドチェーンで書けないのも、どうせ try とか await は前に書くし、前に書いちゃえば良さそう。 let x = try await jsTry(jsAwait(foo.bar.baz))
8:55 AM
jsTryAwait があってもいいか。
Avatar
どうせ try とか await は前に書くし
たしかに
8:57 AM
let result = await jsAsync(fetch)("...")
Avatar
そっちは大変じゃないですか?どうせ fetchPromise 返すんだから、 await jsAsync(fetch("...")) でも良さそうな気も?
9:00 AM
エラーについては JSValuecase error(JSValue) を追加すれば良い?
9:00 AM
あ、循環しちゃうから indirect
9:01 AM
(でも .error がネストしてほしくないから微妙だな・・・。)
Avatar
JSError が既にあるので case error(JSError) にできそう
Avatar
なるほど。
Avatar
JSのエラーはオブジェクトのはずなのでJSValueである必要は無いかな (edited)
Avatar
stringthrow したときは String になってるんですっけ?
Avatar
特定の型の式だけではなく、あらゆる式をスローすることができます。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling
9:04 AM
オブジェクトだけじゃないのか!
Avatar
あらゆる式を throw できるけど、オブジェクト化されてる可能性もあるのかなと。
Avatar
try { throw 1 } catch(e) { console.log(e) } // 1 (edited)
9:06 AM
普通に値のままですねー
Avatar
typeof も試してみましたが、オブジェクトになってませんでした。
9:07 AM
いちおうブラウザで試してみましたが、↓で string と出てきました。 <script> try { throw 'error'; } catch(e) { alert(typeof e); } </script>
9:09 AM
あー、 JSError っていうのは throw された値を格納するためのものじゃなくて、 JavaScript の Error に対応してるんですね。
Avatar
ああ、そうですそうです
Avatar
うーん、論理的には↓みたいな構造にしないとネストを防げなさそうだけど、この変更はちょっと・・・。 enum JSValue { case success(_JSValue) case failure(_JSValue) enum _JSValue { case boolean(Bool) case string(JSString) ... } }
9:15 AM
enum JSValue { case boolean(Bool) case string(JSString) ... case error(JSErroValue) } enum JSErrorValue { case boolean(Bool) case string(JSString) ... }
9:15 AM
↑の方が現実的かな。
Avatar
JSValueのerror caseをユーザーがハンドリングすることは滅多に無い気がするので、できれば追加したくないなぁ
9:21 AM
jsTry がJS関数を受け取るようにすれば内部に隠蔽できるかもしれない
Avatar
DOM はわかりませんが、 JS のライブラリを使うときに JS 側でエラーが throw されることは普通にありそうな気がします。
9:22 AM
func jsTry(_ f: JSFunction) -> JSThrowingFunction みたいな?
Avatar
JSValueのerror caseをユーザーがハンドリング
これは例えばこういうコードはユーザーは滅多に書かないのでJSValueのケースを増やしても使われないんじゃないかなと let result: JSValue = ... if case .error(let error) = result { // ... } // or if let error = result.error { // ... }
9:24 AM
throwされることは普通にあると思います。
Avatar
僕のイメージしてたのは JSValue にエラー情報を埋め込んじゃって jsTry されたときにエラーを throw するというものだったので JSValue に埋め込まざるを得ませんでしたが、 JSThrowingFunction みたいなものに変換する方式なら JSValue はいじらずに済みそうですね。
9:26 AM
ただ、それだと関数よりやっぱりメソッド/プロパティであってほしいかなぁ。当初の .throwing みたいに。
Avatar
func jsTry(_ f: JSFunction) -> JSThrowingFunction
こんなイメージでした
9:26 AM
ですよねぇ
9:26 AM
これはもう一つ問題があって、
Avatar
JSValue に埋め込むなら jsTrytry が必ずセットになるから先頭に戻ってもいいけど、 JSThrowingFunction 方式だとそうは限らないですもんねー。
9:28 AM
ただ、 JSThrowingFunction 化してから Swift で取り回すことを考えると、こっちの方がいい気もしますね。毎回 jsTry 噛まさなくてもいいし。
Avatar
取り回しが難しいんですよね。
9:30 AM
例えばこれと let div = document.createElement!("div") これは let createElement = document.createElement.function! createElement("div") thisの扱いが違うんですよね。 (edited)
Avatar
関数になっちゃうのは諦める場合、変換方式なら関数名は jsTry / jsAwait よりも jsThrows / jsAsync が良さそうですね。
9:31 AM
出た、 JS の this 問題。
Avatar
上の場合、JSObjectに生えてるsubscript(dynamicMember name: String) -> ((ConvertibleToJSValue...) -> JSValue)? が呼ばれて、thisがレシーバでバインドされるんですが https://github.com/swiftwasm/JavaScriptKit/blob/4b7981bc1b81a1f25e7aca851866d55913657d61/Sources/JavaScriptKit/FundamentalObjects/JSObject.swift#L34-L40 (edited)
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
9:32 AM
下の場合一度 JSFunction になってしまって、JSFunctionのcallAsFunctionで実行されるのでthisがバインドされないんですよね https://github.com/swiftwasm/JavaScriptKit/blob/4b7981bc1b81a1f25e7aca851866d55913657d61/Sources/JavaScriptKit/FundamentalObjects/JSFunction.swift#L21 (edited)
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
9:33 AM
で、 jsThrows 方式で行くと、レシーバのバインディングができないなと。
Avatar
これは解決が難しそう・・・
Avatar
あー、 (ConvertibleToJSValue...) -> JSValue) をjsThrowsの引数に取れば良いのか? (edited)
Avatar
なるほど。
Avatar
func jsThrows(_: (ConvertibleToJSValue...) -> JSValue)) -> (ConvertibleToJSValue...) throws -> JSValue) func jsThrows(_: JSFunction) -> (ConvertibleToJSValue...) throws -> JSValue)
Avatar
オーバーロードして用意しておけばいけそうな気がしますね。
Avatar
この2つのオーバーロードがあれば良さそう
9:36 AM
これはなんだか実装できそうな気がしてきました
Avatar
これができるとこれに合わせて jsAsync も実装できそうでいいですね。
9:38 AM
PythonKit は throws/try はどうしてるんでしょうね?
9:39 AM
Swift framework to interact with Python. Contribute to pvieito/PythonKit development by creating an account on GitHub.
9:39 AM
これ?
Avatar
お、考えることは同じだなぁ
Avatar
Python でもシャドー問題はありますよね。
9:42 AM
Swift で throws は現状で identifier として使えないですけど、 async は使えてすでに使われてて、そう考えると throws も identifier として使えるようにするという変更があり得て、その上で throwsasync を使うことで名前被りを避けることはできない?
9:43 AM
throws は JS で予約語だから、 throws さえ使えれば foo.throw がいけそう?
9:46 AM
@swift-main -Xfrontend -enable-experimental-concurrency struct Foo { func foo() async {} func async() {} } (edited)
Avatar
@swift-main struct A { var `throws`: Int { 1 } } _ = A().throws (edited)
Avatar
swiftNightly BOT 10/13/2020 9:46 AM
no output (edited)
9:46 AM
no output
Avatar
throws使えるっぽい?
Avatar
おおお
Avatar
これは良い
Avatar
そうすれば throws にしちゃえば解決じゃないですか?
Avatar
ですね
9:47 AM
おー、これはキレイにまとまりましたね
Avatar
This page describes JavaScript's lexical grammar. The source text of ECMAScript scripts gets scanned from left to right and is converted into a sequence of input elements which are tokens, control characters, line terminators, comments or white space. ECMAScript also defines c...
9:48 AM
さっき貼ったページがあやしかったので
9:48 AM
調べ直したら
9:48 AM
Future reserved keywords in older standards The following are reserved as future keywords by older ECMAScript specifications (ECMAScript 1 till 3).
9:48 AM
なのでダメ?
Avatar
a.import a['import'] a = { import: 'test' }.
9:50 AM
これは合法っぽいですね
Avatar
<script> const a = { throws: 'foo', }; console.log(a.throws); </script>
Avatar
var obj = { throws: 1 } これも書けるっぽい。。。 (edited)
Avatar
これで foo と表示されちゃいました😢
9:50 AM
あー、せっかくいい案だと思ったのに・・・。
Avatar
ソースコード上の識別子の制約と実行時のフィールド名の制約は別物なんですね (edited)
Avatar
あ、その import のコードは上記ページのものだったんですね。
Avatar
そうですそうです
Avatar
生きてる予約語でダメなら "in older standards" 関係なくダメだ・・・。 (edited)
Avatar
そうするとやっぱり jsThrows で外から被せる方式ですかね
Avatar
そうですねぇ・・・。
9:55 AM
演算子とかは避けたいですもんねw
Avatar
グローバルに関数を生やすと補完に出ないのがなぁ。。
Avatar
throws はダメだったけど、 JS で使えない identifier にするって方法はないでしょうか?
9:59 AM
Swift でしか使えない文字とかがあれば。
Avatar
JavaScript オブジェクトはキーと値を所持しています。キーは文字列 (または Symbol) ですが、値はなんでもかまいません。これにより、オブジェクトはハッシュマップの様相を呈します。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Data_structures 特にキーに制約なさそうなんですよね
(edited)
あらゆるプログラミング言語は、それぞれ異なったデータ構造を持っています。この記事では、JavaScript で使用可能な組み込みデータ構造の一覧と、他のデータ構造の構築にも使えるように、それらがどのような性質を持ち合わせているかについて述べることにします。また可能である場合は、他のプログラミング言語におけるデータ構造との対比も行います。
😢 1
Avatar
まったく関係ないんですけど、前から気になってたんですが、 JSObject@dynamicMemberLookup にするより、直接 JSValue@dynamicMemberLoopup にして callAsFunction も持たせちゃった方が便利だったりしないでしょうか?どのみち JS 使ってる時点で安全じゃないですし。 (edited)
10:06 AM
!.object, .function などを挟まないといけないのが気になってます。
Avatar
過去に話に出たんですが、それもシャドーイングの問題で辞めておこうって話になったんですよね
10:07 AM
でも改めて考えると名前が被ったときだけ明示的に.object経由でアクセスすれば良いような気もします
Avatar
お、過去にも出てたんですね。どの issue か教えてもらってもいいですか?
Avatar
どこだったかな
Avatar
JSValue にメンバを生やさないで済むのならシャドーイングは問題にならないですか?
Avatar
見つからなかったので夢かDMで話したんだと思います 😢
Avatar
夢w
10:12 AM
jsTry とかと合わせるなら関数か static メソッド/プロパティにしちゃって、インスタンスメソッド/プロパティは @dynamicMemberLookupcallAsFunction のものという切り分けにできるなら、シャドーイングも避けられて切り分けも明快かなと。 (edited)
Avatar
ふむふむなるほど
Avatar
グローバル関数あまり追加したくないから、 JS. とかがあってもいいかもですね。
10:14 AM
JS.throws, JS.async
Avatar
I got feedback that the current API to access JavaScript objects is redundant. As he says, I agree that method!(...) and .object! for every object access is very redundant. I think we can provide u...
Avatar
おお、早速。いいですね!
Avatar
沢山シェルスクリプトを書いてようやくmacOS向けのInstaller配布ができるようになりました https://github.com/swiftwasm/swift/releases/tag/swift-wasm-5.3-SNAPSHOT-2020-10-20-a
swift 2
11:50 AM
swiftenvなしで入れられます
Avatar
おー
Avatar
CI上でプロンプト出さずにコードサインするのが鬼門でした
Avatar
仕事が落ち着いたら触りたい
💪 1
Avatar
macOS向けInstaller、インストール後に作成するシンボリックリンクがswift-latest.xctoolchainではなくswift-latestになってる。
Avatar
ホントですね、ありがとうございます 🙏
10:40 AM
アップストリームのスクリプトがそもそもswift-latestになってました… https://github.com/apple/swift/blob/main/utils/darwin-installer-scripts/postinstall
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
実際の配布パッケージswift-DEVELOPMENT-SNAPSHOT-2020-10-24-a-osx.pkgに入ってるpostinstallはこんな感じ。 #!/bin/bash INSTALLED_TOOLCHAIN=$2 rm -f "${INSTALLED_TOOLCHAIN%/*}/swift-latest.xctoolchain" ln -fs "${INSTALLED_TOOLCHAIN}" "${INSTALLED_TOOLCHAIN%/*}/swift-latest.xctoolchain" (edited)
12:44 PM
CIでの.pkg作成を確認しようとしたら https://ci.swift.org 落ちてるぽい。 (edited)
Avatar
そうか、たしかにCIでもインストーラつくってますね。
12:46 PM
メンテでは無さそうだなぁ
Avatar
上記パッケージのビルドログを見る限りswift/utils/toolchain-installerは使ってないと思われる。 https://ci.swift.org/view/Packages/job/oss-swift-package-osx/5218/
Avatar
秘密のシェルスクリプトがあるのか…
Avatar
現在のtoolchainがWasmをサポートしてるかどうか、ってどうやって判定するの?
Avatar
-targetにwasm32-unknown-wasiを渡してみるか、--versionでベンダー名を見るかですかね
Avatar
ふむ。 $ echo 'print("hello")'|swiftc -target wasm32-unknown-wasi - <unknown>:0: error: unable to load standard library for target 'wasm32-unknown-wasi'
5:19 AM
arm64がサポートされてるかどうかビルドしてみないと判らないみたいで、Wasmがどうしてるのか気になったのでした。
5:23 AM
ghcr.io/swiftwasm/swift:latestのダウンロードが遅い…
Avatar
--print-available-targetsみたいなオプションがあると良いんですけどねー
Avatar
clang11でそんな感じのオプションが追加されるかも?ってのを見かけました。
5:28 AM
実際には追加されてないね…
Avatar
一緒にビルドされたllcがあれば--versionで見れるっぽいですね
5:29 AM
$ llc --version LLVM (http://llvm.org/): LLVM version 11.0.0 Optimized build. Default target: x86_64-apple-darwin19.6.0 Host CPU: skylake-avx512 Registered Targets: aarch64 - AArch64 (little endian) aarch64_32 - AArch64 (little endian ILP32) aarch64_be - AArch64 (big endian) ...
Avatar
arm64サポート有無のチェックはこんな感じとすることに。 $ echo 'print("hello")'|xcrun --toolchain org.swift.50320190830a swiftc -target arm64-apple-macos10.9 - -o /dev/null <unknown>:0: error: unable to load standard library for target 'arm64-apple-macos10.9' $ echo 'print("hello")'|xcrun --toolchain org.swift.531202011121a swiftc -target arm64-apple-macos10.9 - -o /dev/null で、同様にWasmをチェックしてみるとエラーになった。 $ echo 'print("hello")'|xcrun --toolchain org.swiftwasm.20201102 swiftc -target wasm32-unknown-wasi - -o /dev/null wasm-ld: error: cannot open crt1.o: No such file or directory wasm-ld: error: unable to find library -ldl wasm-ld: error: unable to find library -lc++ wasm-ld: error: unable to find library -lc++abi wasm-ld: error: unable to find library -lm wasm-ld: error: unable to find library -lwasi-emulated-mman wasm-ld: error: unable to find library -lc clang-10: error: linker command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: link command failed with exit code 1 (use -v to see invocation) docker版はエラーにならない。 $ echo 'print("hello")'|docker run ghcr.io/swiftwasm/swift swiftc -target wasm32-unknown-wasi - -o /dev/null (edited)
Avatar
あー、おー
7:05 AM
xcrunか〜
7:06 AM
xcrunセットするSDKROOTを優先して見ちゃってますね
Avatar
あ、SDKROOKか。
7:11 AM
https://book.swiftwasm.org/getting-started/setup.html に書かれたxcrunを使う方法は使えないということ?
Avatar
SwiftPMはSDKROOTに左右されずに-sdkをコンパイラに渡すのでxcrunでも動くんですよね。
7:13 AM
コンパイラ単体だとxcrunだと駄目ですね。直しておきます 🙏
Avatar
なるほど。
7:16 AM
とりあえず、上記Wasmサポートの検出手順は、手順の汎用性を確認するために試してみただけで、SwiftWasmに対して実用する予定は今のところ無いです。 (edited)
🙏 1
Avatar
上記手順でswiftcを使ったのは、swiftだとビルドに成功しても実行に失敗するから。
Avatar
macOS版.pkgによるswift-latest.xctoolchainシンボリックリンクの作成、既にシンボリックリンクが存在するとシンボリックリンクが指す先に新しいシンボリックリンクを作ってしまう。 https://github.com/swiftwasm/swift/blob/swiftwasm/utils/darwin-installer-scripts/postinstall#L16 これを避けるためにln -fhs …とかに変えるべき。
LN(1) BSD General Commands Manual LN(1) … -h If the link_name or link_dirname is a symbolic link, do not follow it. This is most useful with the -f option, to replace a symlink which may point to a directory.
(edited)
WebAssembly support for the Swift Programming Language - swiftwasm/swift
Avatar
なるほど、デフォルトはリンクを追っかけるんですね
4:04 AM
ありがとうございます 🙏
Avatar
katei氏と呼ばれててそこで切れるんだって思った https://www.publickey1.jp/blog/22/rubywebassemblywasiwebassemblyruby.html
Ruby言語のリファレンス実装、すなわち事実上の標準となっているRubyインタプリタはC言語で実装されています。そのため、このRubyインタプリタもしくはそのソースコードは一般に「CRuby」(もしくは、まつもとゆきひろ氏による実装という意...
Avatar
身のある情報を提供できた 😽
Avatar
https://book.swiftwasm.org の流れでwasmをビルドすると wasi_snapshot_preview1 モジュールの関数一式をimportしたがるwasmファイルが生成されるのですが、これって外せないのでしょうかね?
Avatar
色々とわかってきた。これはwasm-bindgenがすごすぎるんだなぁ
Avatar
WASI-lessバイナリはなかなか面倒なんですよねー。一応TODOとしては挙がっていますが
5:34 AM
WASI無しで表現できるlibcとlibcxxを作るか、Swiftのランタイムから完全にそれらの依存を取り除くかしか無くて。(バイナリいじってゴニョゴニョする手もあるがメンテ大変なのでできればやりたくない) (edited)
5:36 AM
wasm-bindgenはかなり色々やっててすごい
Avatar
WASIの扱いが面倒で、WASI使ってなければ消したいと思って調べてたらwasm-bindgenはWASI無くても動いててどういうことかと思ったら出力先ごとにWASI相当のランタイム実装埋め込んでてすごすぎ〜となった
Avatar
ブラウザでなんかしようと思うとWASI邪魔なんですよね。wasmerの提供するWASIブラウザpolyfillは微妙だし。
5:42 AM
しかしWASIが無いと満足にprintすらできないのは厳しい
Avatar
このツイートを見かけたんですが、標準ライブラリはともかく、言語仕様が軽量化の阻害要因になっている点があるんですっけ?LLVMに落ちてしまえば関係なさそうな?前のわいわいの話みたいに、LTOしやすい/しにくいとかはあるかもですが。 https://twitter.com/mizchi/status/1532215162576379904
本当に書ければ選択肢にはなるんだろうけど、あの言語仕様をAOTとはいえ軽量なランタイムに落とすのかなり無理筋では
6:54 AM
SwiftでWASMアプリケーションを書きたいかはmizchiさんがコメントしてくれます
Avatar
omochimetaru 6/2/2022 6:55 AM
みずちさんが「あの言語仕様」として言及したいのがどういう部分なのかわかんないですけど
6:55 AM
SwiftはRustと比べると
Avatar
軽量というのがサイズ面なのか実行速度面なのか難しい
Avatar
Kishikawa Katsumi 6/2/2022 6:56 AM
ここで言ってるのはサイズですね。
Avatar
omochimetaru 6/2/2022 6:56 AM
Resilencyのためにランタイムで持ってるリフレクションっぽい機能とか
Avatar
Avatar
Yuta Saito
軽量というのがサイズ面なのか実行速度面なのか難しい
このスレッドで↓のように続いているのでサイズかなと。 https://twitter.com/mizchi/status/1532216813932584960
ちなみに、自分が他の言語からの Wasm コンパイルで実用可能/エコシステム構築可能と思ってる現実的なラインは、ランタイムのオーバーヘッドが50kb以内です。これを満たしてるのは no_std な rust だけです。
Avatar
Kishikawa Katsumi 6/2/2022 6:56 AM
50kb
Avatar
omochimetaru 6/2/2022 6:56 AM
Unicodeのための定義情報とか
6:56 AM
KeyPathのためのランタイムとか
6:56 AM
そういうランタイム関数がたくさんあるので、
6:56 AM
ランタイムのバイナリサイズが大きいというのはあるんじゃないかなと思ってます
Avatar
ランタイムキャストやデマングラーのコードが割と重いです
Avatar
omochimetaru 6/2/2022 6:57 AM
あとはこれはLTOでカットできる話とかもあるけどメタタイプとかが埋め込まれてデカいとか
Avatar
Avatar
Yuta Saito
ランタイムキャストやデマングラーのコードが割と重いです
omochimetaru 6/2/2022 6:57 AM
ほ〜
6:58 AM
あとstdlibも普通にデカい気が。AnyHashableとか、純粋に振る舞いのロジックが複雑なためにコード量でかそうなやついろいろあるし。 (edited)
Avatar
Unicode周りはRustは落とした状態でだからフェアな比較じゃないと思っていて、あとはLTOで頑張ればかなり落とせる可能性あるのかなぁと思ってました。
Avatar
その辺はライブラリの作り方が微妙なだけなんですよ。言語仕様はあんまり関係ない。
Avatar
omochimetaru 6/2/2022 6:59 AM
いやでも、規格としてmini Swiftみたいな方言が無いので
6:59 AM
結局フルスペックなstdlibが必要でしょう
Avatar
いや、使わないやつはリンクしなければ良いんですよ
Avatar
omochimetaru 6/2/2022 6:59 AM
あーstdlibの個別のコンポーネント自体はそっか。リンク時にカットできるか。 (edited)
6:59 AM
じゃあランタイム関数だな、どうしようもなさそうなのは
Avatar
今はlibswiftCore.aにSwift.oとしてstdlibのSwiftパートがドーンとあるから、一個でもstdlib関数をリンクすると全部ついてきちゃう
7:00 AM
そすね
Avatar
Kishikawa Katsumi 6/2/2022 7:01 AM
まあサイズはある程度大きくても許容できるように環境がなっていくというのもありますよ。
Avatar
Avatar
Kishikawa Katsumi
まあサイズはある程度大きくても許容できるように環境がなっていくというのもありますよ。
omochimetaru 6/2/2022 7:01 AM
実は僕はそっちのほうにウェブが進むほうが筋が良いと思っています
Avatar
Avatar
omochimetaru
いやでも、規格としてmini Swiftみたいな方言が無いので
これについては、一つの可能性として、SwiftWasmがSwiftのサブセットを仕様策定すれば、それが準公式になりそう。
Avatar
wasmが実用的になる前に回線速度が向上する可能性は全然ありますよね
Avatar
Avatar
koher
これについては、一つの可能性として、SwiftWasmがSwiftのサブセットを仕様策定すれば、それが準公式になりそう。
omochimetaru 6/2/2022 7:02 AM
それはそうですね。ポータブルなSwiftっていう概念が合っても良いと思います。今の所コアチームは方言的な発想にはいつも否定的ですけど
Avatar
Avatar
omochimetaru
実は僕はそっちのほうにウェブが進むほうが筋が良いと思っています
omochimetaru 6/2/2022 7:02 AM
全てのサイトで横断的に、「Swiftランタイム」が使えれば、そもそも合理的だと思うんですよね。
7:02 AM
macOSが出荷してるものを事前にブラウザに入れておくって感じです
7:02 AM
昔のFlash playerと同じ。 (edited)
7:03 AM
幸いSwiftのランタイムは、macOSとのからみで、ランタイムの前方互換性が意識されてるし。
7:03 AM
(という趣旨の意見を以前みずちさんに投げてみたんだけど、実際のところはクロスオリジンセキュリティの観点でそういうモチベーションは低そうらしい・・・
Avatar
Wasmがもっと一般的になってきたら、主要言語のランタイムはブラウザに埋め込む時代が来たりしないのかな?
Avatar
Wasmとしては、モジュールの再利用性を進める機能が提案されていて、プログラム間でランタイムを再利用できるっていうのはありえるかなぁ https://github.com/WebAssembly/component-model
Repository for design and specification of the Component Model - GitHub - WebAssembly/component-model: Repository for design and specification of the Component Model
Avatar
Avatar
Yuta Saito
Wasmとしては、モジュールの再利用性を進める機能が提案されていて、プログラム間でランタイムを再利用できるっていうのはありえるかなぁ https://github.com/WebAssembly/component-model
omochimetaru 6/2/2022 7:05 AM
いいね。
Avatar
それはよさそう。
Avatar
Avatar
koher
Wasmがもっと一般的になってきたら、主要言語のランタイムはブラウザに埋め込む時代が来たりしないのかな?
omochimetaru 6/2/2022 7:05 AM
現状のブラウザプラグインみたいな感じでユーザーが管理できると良いと思うんですよね
7:06 AM
初回表示の時にいい感じのUXにできるかは気になるけど・・・
Avatar
Avatar
omochimetaru
現状のブラウザプラグインみたいな感じでユーザーが管理できると良いと思うんですよね
そこの一歩が結構厳しい気が。
Avatar
その辺はもうちょっとやりようがありそう
7:07 AM
まあ現状SwiftでWasmの用途としては、既存コードのWebへの移植がメインですね。 (edited)
Avatar
wasmもだけど、フロントエンドで推論回したいとかもあったりするので
7:09 AM
ドデカバイナリをなんとかしてブラウザで扱いたいなというのは今後叶っていって欲しいところ
Avatar
インターネットがはやくなってほしい
Avatar
Avatar
Yuta Saito
まあ現状SwiftでWasmの用途としては、既存コードのWebへの移植がメインですね。 (edited)
omochimetaru 6/2/2022 7:12 AM
移植用途だと方言は厳しいよな〜
Avatar
そもそも、方言はメンテ出来るパワフルな人が居ればやるかもしれないけど、現状きびしいですねぇ
Avatar
人的リソースが厳しいのか・・・。逆方向はあり得るのかなと思ってたけど。Wasmに最適化されたSwiftのサブセットで、サブセット用に書かれたコードは本家でも実行できる、みたいな。
7:15 AM
第三者がやっても広く利用されるのは厳しいと思うけど、SwiftWasmのプロジェクトとしてなら受け入れられそう。
Avatar
omochimetaru 6/2/2022 7:17 AM
どの機能を取り除くとどのくらいバイナリサイズがカットできて、一方でどういう問題が起きるか、を整理するだけでもかなり大変そう。
Avatar
そうなんですよ、まず分析が必要。
7:19 AM
分析するにはコンパイラを触れる人が必要で、一方でそういう人はUpstreamingで手が一杯
Avatar
omochimetaru 6/2/2022 7:19 AM
今回のRegex関係とかもそうだけど
7:20 AM
未だに結構バンバンビルドとかリンク構成とかが更新されるしね。
7:20 AM
この前のConcurrency runtimeとかもそうだな。
7:21 AM
コンパイラのローレベルな生成部分だけ対応しておけば後は自動的に・・・って行ってないのが大変そう。 (edited)
Avatar
人員絶賛募集中
Avatar
omochimetaru 6/2/2022 7:21 AM
7:23 AM
7:23 AM
@Yuta Saito WASM Swiftコントリビュータを増やすようなトークをすると良いのでは!
Avatar
Avatar
omochimetaru
@Yuta Saito WASM Swiftコントリビュータを増やすようなトークをすると良いのでは!
iOSエンジニアが将来SwiftでWebフロントエンド開発できる理想の(しかし夢物語ではないくらいの)未来を語って、現実とのギャップの大きさと目下の課題を示して人材をリクルートとか?w
Avatar
ww プロポーザルのプロポーザルが出てきた
😅 1
Avatar
Avatar
Yuta Saito
Wasmとしては、モジュールの再利用性を進める機能が提案されていて、プログラム間でランタイムを再利用できるっていうのはありえるかなぁ https://github.com/WebAssembly/component-model
これどうなんでしょうね。トラッキング対策で HTTP キャッシュが origin (もしくは per-site?) ごとに分割されて、JSのライブラリをキャッシュ目的で Public CDN から引いてくる意味が薄くなった…という話と同じ末路になりそうな気もしますが…
Avatar
omochimetaru 6/2/2022 8:07 AM
ああーそうか、トラッキングに使えてしまうのか
Avatar
そこはそうなんですよねぇ
Avatar
omochimetaru 6/2/2022 8:13 AM
ライブラリ自体は各サイトがホストしつつ、ダウンロードするときに別サイトでダウンロードした同一ファイルのハッシュ値でキャッシュ問い合わせするのだとどうかなあ
Avatar
サイドチャネル的にダウンロード時間を計測するんですよ
Avatar
フィンガープリンティングに利用されるんですよね…
Avatar
omochimetaru 6/2/2022 8:14 AM
キャッシュが効いて早かった事がもうダメなのか
Avatar
そういえば、小さなランタイムを作る話としては、compnerdさんがこういうのをやっています。 https://github.com/compnerd/uswift
μSwift[Core]. Contribute to compnerd/uswift development by creating an account on GitHub.
👀 1
9:42 AM
これをガリガリ育ててSwiftWasmのランタイムとして採用しようという話もあった
Avatar
Avatar
Yuta Saito
そういえば、小さなランタイムを作る話としては、compnerdさんがこういうのをやっています。 https://github.com/compnerd/uswift
omochimetaru 6/2/2022 9:49 AM
おーArrayもStringもない
9:52 AM
Runtimeのswift_getGenericMetadataとか中身空っぽだけど
9:52 AM
どこまで何を実装するんだろう
Avatar
わかんないですねぇ
Avatar
omochimetaru 6/2/2022 9:55 AM
計画書があれば読んでみたいなあ
Avatar
compnerdに凸
Avatar
omochimetaru 6/2/2022 9:55 AM
ジェネリクス回りとか
9:56 AM
全てスペシャライズする方針って可能なんだろうか?
9:56 AM
C++みたいに。
9:56 AM
そうすると外せるものが結構増えそうに思うけど
Avatar
最終的なビルド時にソースが全部見えてれば理論的には出来るんじゃないですか?
Avatar
omochimetaru 6/2/2022 9:57 AM
メタタイプをexistencialから渡して型を構成したりしたら無理か?
9:57 AM
一度eraseされちゃうから
Avatar
むりかなぁ
Avatar
omochimetaru 6/2/2022 10:00 AM
無理な気がするね
10:00 AM
rustって言語が提供するerasureどうなってるんだっけ
Avatar
This module implements the Any trait, which enables dynamic typing of any 'static type through runtime reflection.
10:02 AM
Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.
Avatar
omochimetaru 6/2/2022 10:03 AM
そうだ、dynだった
10:03 AM
普通にメソッド呼び出しでopenできとるな
Avatar
でも全部スペシャライズするのってサイズ的に嬉しくないんですよ
Avatar
omochimetaru 6/2/2022 10:09 AM
たしかに・・・
10:09 AM
結局アプリケーションのコードサイズが増えてしまうか。
Avatar
omochimetaru 6/5/2022 7:38 AM
iOSDC Japan 2022 にプロポーザルが投稿されました! 「The state of Swift for WebAssembly in 2022」 / kateinoigakukunさん (@kateinoigakukun) https://t.co/VIjC9TqxrT
Avatar
(このサーバにいる人にはリクルートも兼ねていることがバレてる…)
😉 4
👍 2
Avatar
Kishikawa Katsumi 7/5/2022 8:32 AM
SwiftのWasmのデバッグってどうやるのがいいのかな。Browserで動かす以外に簡単な方法はないんでしたっけ?
Avatar
高度なテクニック知らなくて毎回printfデバッグしてます・・
Avatar
Kishikawa Katsumi 7/5/2022 8:53 AM
そうなんですね。じゃあある程度動くまでは手元で普通のSwiftとして動かしていけそうになったらBrowserに載せて、って感じがいいかな。
Avatar
基本はそうですね。乗っけないとわからない部分でprintfしてます
Avatar
今回のやつだとJS使ってないので、WASI互換のランタイム、wasmtimeとかならそのまま実行できます
👍 1
9:05 AM
まあ、普通にネイティブでデバッグするのがおすすめです
Avatar
Kishikawa Katsumi 7/5/2022 9:06 AM
wasmtime hello.wasm っていう形で動かせるんですね。
9:07 AM
ブラウザで動かすのはそこそこセットアップが必要だからwasmtimeで動かせるのは結構いいかも。
Avatar
@Iceman そういえばこれどうやって見つけたんですか?JSClosureのuse-after-freeがどっかにあるな〜とは思っていたけど再現できてなかったので名探偵とてもありがたかったです。 https://github.com/swiftwasm/JavaScriptKit/issues/218
JSClosure stores its identifier and tell it to JS for bridging, but the identifiers has a trouble. hashValue is used for the identifier, but hashValue is not guaranteed to be unique. JavaScriptKit/...
Avatar
Avatar
Yuta Saito
@Iceman そういえばこれどうやって見つけたんですか?JSClosureのuse-after-freeがどっかにあるな〜とは思っていたけど再現できてなかったので名探偵とてもありがたかったです。 https://github.com/swiftwasm/JavaScriptKit/issues/218
グッとコードを見つめました
t_sasuga 1
Avatar
www
Avatar
すごい
Avatar
経緯としてはreference typesについて調べてて、そういえばJavaScriptKitはJSClosureをいい感じにJSに渡しつつメモリ管理してたような?と思ってコード読んでたらrelease() は手動か〜となって、周辺コードみてたら発見しました
Avatar
なるほど〜
6:07 AM
reference typesはLLVM側のサポートがまだ手薄なんですよねぇ
Avatar
VaporでもこういうhashValueを使った間違いあったりして敏感になってました
Avatar
hashValue警察たすかる
Avatar
reference typesはホストのオブジェクトをwasm内部に持ち込むのはできそうだけど、逆はできるんかなみたいなことを調べてました
6:08 AM
swiftクラスへの参照をホスト側に持たせたい的な
Avatar
そこはgcプロポーザルの範囲ですね
6:09 AM
で、LLVMファミリーでgcオブジェクトを素直に使うのはなかなか難しいんじゃないかなぁという見解です
Avatar
ffiの永遠の課題ですね
Avatar
ffiむずかしい
Avatar
@Yuta Saito https://github.com/swiftwasm/swiftwasm-docker/commit/03216bba5d4c879d9c9aad690e8197f8268e468d これjammyのイメージ消えたのって何でですか?
Avatar
5.7.1ではjammy向けのツールチェインをビルドしてなかったので。。
👀 1
2:07 PM
ダウンロードに失敗してビルドコケてる様子 https://github.com/swiftwasm/swiftwasm-docker/actions/runs/3133069282/jobs/5086054881
Avatar
あ、なるほど。言語側がそもそもjammyに対応できていないということですか?
Avatar
5.7ブランチのnightlyではjammyビルドあるんで、新しくタグ打てば良いんですが。
2:09 PM
そこまで困ることないだろうし5.8からでいいかなと思って今の所やってないですー
2:09 PM
言語側はjammy対応されてます
Avatar
ほんとだ。確かに結構最近のやつからjammyに対応してる
2:11 PM
5.7.1まだなかったんですね (edited)
2:11 PM
理解しました。ありがとうございます
2:12 PM
とくに困ってはないです
Avatar
どもども。困って無くてよかった
Avatar
@Yuta Saito var dic: [Int: CInt] = [0: 42] func getValue() -> CInt { dic[0] ?? -1 } この関数の返り値が-142 のランダムになるっていう不思議現象に遭遇したのですが、何か原因に心当たりありますか? 簡単な再現手順も用意しました https://github.com/sidepelican/SwiftWasmDicIssue
Avatar
おおー、色々要因がありそうでむずかしいですねぇ
2:53 AM
とりあえず環境変数SWIFT_DETERMINISTIC_HASHING=1でハッシュのシード固定して再現するか見てもらえますか?
2:53 AM
あ、でもサンプルでWASI ABIの違反があるな
Avatar
おおーSWIFT_DETERMINISTIC_HASHING=1つけたらうまく動くようになりました
Avatar
exportを複数回外から呼ぶ場合はreactorモードというやつでビルドしないといけないんですよね
Avatar
初耳だ
2:54 AM
最近書き足したのでこちらを
👀 1
Avatar
❯ swiftc -target wasm32-unknown-wasi Lib.swift -o Lib.wasm -Xlinker --export=get_value -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor <unknown>:0: error: unknown argument: '-Xswiftc' <unknown>:0: error: unknown argument: '-mexec-model=reactor'
2:57 AM
これ順番大事なんでしたっけ?
Avatar
えーと、swiftc直接叩く場合は -Xswiftc を削って大丈夫ですー (edited)
2:58 AM
あ、ドキュメントがまちがっておるな
Avatar
あ、なるほど?例のほうも間違ってそうですね
Avatar
直しておきます〜 🙏
Avatar
-Xclang-linker -mexec-model=reactor 足したら _start がいなくなってしまった
Avatar
ですねー、なので _initialize を代わりに。
Avatar
wasmer/wasiはそれで許されてる?
3:03 AM
nodeのwasiは_startじゃないと許してくれないっぽいですね
Avatar
Node.jsのwasi実装では専用のメソッドが生えてるんですよ https://nodejs.org/api/wasi.html#wasiinitializeinstance
Avatar
そっちから呼んでも _startくれって怒られちゃうんですよね
Avatar
えぇ〜
Avatar
うわ、嘘でしたすみません
3:05 AM
手ミスでした
Avatar
なるほどw
Avatar
そして、reactor指定したら毎回必ず -1 が返りますねw
Avatar
main呼んでますか?
3:06 AM
トップレベルにコードある場合それ呼ばないとだめですね
Avatar
なるほど・・。呼んでませんでした。呼んだら 42 になりました
Avatar
おおー
Avatar
つまりreactorモードにうまくできていれば問題は解決しそうです
3:08 AM
ちなみにこのreactorモードって、exportしてる関数全体にかかるものですか?(.c経由して -Xlinker オプション使わずにexportしてても大丈夫?)
Avatar
でもこれは所見じゃ気づけ無いよなぁ。良い感じの診断を出せると良いんですが
3:09 AM
大丈夫です
3:09 AM
wasm-ldでリンクするときにexportエントリにラッパが挟まるか否かが変わるだけなので (edited)
Avatar
なるほど。全然わかんなかったのにすぐ解決して助かりました。ありがとうございます!
🙏 1
Avatar
omochimetaru 1/5/2023 5:59 AM
このスレむずいな
Avatar
commandモードとreactorモードのwat見比べてみると、commandモードの方がexportされた関数それぞれの先頭で何か関数を実行してるんですね
1:57 PM
reactorモードは特に何もしないっぽい
1:58 PM
この毎回先頭で呼んでるのがmain相当の処理なのかな
Avatar
それでctor/dtorを実行するタイミングが変わるんですよね
Avatar
いやmain相当の処理は_startのはずか
2:00 PM
ん?_initializeにはmain入ってないからそうではないか
Avatar
_startはcommandモードではctor,main,dtorの順で呼んで、
2:01 PM
reactorモードの_initializeはctorだけ呼んで、main関数を呼ぶかどうかはユーザ次第になってます
Avatar
dtorってmain関数内で生成された各種インスタンスを破棄する関数のことですか?
Avatar
commandモードでexportされた関数は_startと同様にctor,関数本体,dtorの呼び出しシーケンスになるようにリンカが調整してます
Avatar
ああ、つまりstartでもctor,main,dtorするし、各種export関数でもctor, func, dtorと呼び出されるのか
Avatar
ctor/dtorはグローバル変数のコンストラクタデストラクタのために使われたりします
Avatar
ていうかwasmって高階関数持てるんですね
Avatar
でもctorはもっぱらmain関数より前に実行する目的で使われることが多くて、Swiftの場合だとメタデータリストの構築だったり、ハッシュシードの取得だったりで使われてます
Avatar
Avatar
Iceman
ていうかwasmって高階関数持てるんですね
お、どのレイヤの話でしょう
Avatar
call 27 block (result i32) ;; label = @1 global.get 0 ... こういう呼び出しがあって (edited)
2:09 PM
27は (func (;27;) (type 20) (local i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i64 f64) こう定義されてて、 type 20(type (;20;) (func)) だったのでこれ関数型なのかな?と
2:10 PM
exportされた関数全てが初手でcall 27をしてて、ctor/dtorでラップする動作とあってるなぁと
Avatar
関数型はあるけど、関数のパラメータ部分には拡張仕様がないと取れないやつです
2:12 PM
そこの型は単純に27番目の関数が0引数0返り値の関数であることを示してるやつですね (edited)
Avatar
雰囲気で早とちりしてしまった
2:14 PM
よくみたらおしりでdtor呼んでる様子があった
2:16 PM
しかしcommandモードかreactorモードかって結構動作に重要な影響がある上にWASIのセットアップ方法も変化するのに、概念として難しいしビルド設定もunsafeな記述が必要で厄介ですね
2:21 PM
僕が以前JSからSwift関数を高速で呼び出したらめちゃくちゃ重いと発言したけど、実は1呼び出しごとにSwift全体の初期化をしててそれが重かった説はありそうだなぁ (edited)
Avatar
Avatar
Yuta Saito
_startはcommandモードではctor,main,dtorの順で呼んで、
omochimetaru 1/6/2023 1:38 AM
デストラクタも呼ばれるのってなんで?
1:39 AM
いや、mainが呼ばれてるからそうなのか? プロセスが終わってるみたいで変な感じ
1:40 AM
実際プログラムが終わった状態を期待してそうです
Avatar
omochimetaru 1/6/2023 1:47 AM
ほおー、、、 reactor modeの方がいいなと思ったけどwasm runtimeの中にイベントループあるのか うーん
Avatar
JSの中で使うなら基本的にreactor一択です
Avatar
omochimetaru 1/6/2023 1:50 AM
そうよね
Avatar
omochimetaru 1/6/2023 2:05 AM
イベントループ(の切れ端?)をゲスト言語の実装で提供しないと大変そうな気がするけど、結局根元で呼ぶところに共通の仕組みが必要だからランタイム側にあるのでよいのかな (edited)
Avatar
Venturaにあげたせいかわからないけど、いつも通りのビルドコマンドでTSCUtility/Triple.swift:252: Fatal error: WebAssembly/WASI doesn't support dynamic library yetいわれるようになった・・・
2:43 PM
もう消えてるエラーメッセージっぽいけど、どっからこれ出てくるんだ
2:45 PM
うわーこれPackagePlugin起因だ
2:46 PM
やっぱPackagePluginをアプリと同じPackage.swiftにいれちゃだめだな
Avatar
Swift 5.7 の SwiftWasm のツールチェーンだとまだ入っていなかった記憶がありますが,それ以降のツールチェーンだとその PR の変更が入っていて無事だった気がします (少なくとも 10 月の DEVELOPMENT-SNAPSHOT だと含まれていました) (edited)
Avatar
(無事だったというのは,実際には使っていないターゲットが .dynamic なときも巻き込まれクラッシュするのが防げるという意味でした)
Avatar
なるほど、まだ入ってないならこうなりそうですね。 ツールチェーン同じなのに挙動が変わってびっくりしてましたがうっかりdylib依存のあるdependencyを追加したせいだったので、まさしくその通りことが起きてそうです
Avatar
wasm側で5.7.1リリースした後にそれ直すパッチをSwiftPMの5.7ブランチに入れてもらったので、スナップショットにしかその修正入ってないんですよねー
Avatar
GitHub Actionsでswiftwasmを使ってビルドをしようしたら、stdio.h が見つからないという不可解なエラーが出ました。 [0/3] Compiling CWasmCallableKit XcodeSupport.c 836 In file included from /home/runner/work/CodableToTypeScript/CodableToTypeScript/demo/.build/checkouts/WasmCallableKit/Sources/CWasmCallableKit/CWasmCallableKit.c:1: 837 /home/runner/work/CodableToTypeScript/CodableToTypeScript/demo/.build/checkouts/WasmCallableKit/Sources/CWasmCallableKit/include/CWasmCallableKit.h:4:10: fatal error: 'stdio.h' file not found 838 #include <stdio.h> 839 ^~~~~~~~~
12:44 AM
マシン環境は ubuntu 20.04 で、このスクリプトを使って構成しています https://github.com/omochi/CodableToTypeScript/pull/80/files#diff-9a140f01463ab576fb80ab1ff7ae2fdffd63bf4a3067157756b7659399f620f8
12:45 AM
ローカルのDocker環境だとうまく行ったのですが、GitHub Action上だとこの問題が発生するので、解決しようにもイテレーションが回せなくて困ってます 助けてください (edited)
12:45 AM
/usr/includestdio.h があることは確認できているので、
12:46 AM
更に調べるために、swiftがビルド時に見に行っているinclude dirsを調べる方法を知りたいです
12:46 AM
また、swiftwasmツールチェーンのインストール方法に問題がないか知りたいです
Avatar
GitHub ActionsのUbuntu20.04ってデフォでswift入ってませんでしたっけ? swift —versionした結果が気になります
Avatar
調べてみます
12:56 AM
+ which -a swift 98 /usr/local/bin/swift 99 + swift --version 100 Swift version 5.7.2 (swift-5.7.2-RELEASE) 101 Target: x86_64-unknown-linux-gnu
12:56 AM
うわ〜なるほど
12:56 AM
+ which -a swift 392 /usr/local/bin/swift 393 /usr/bin/swift 394 + swift --version 395 /bin/swift 396 Swift version 5.7.2 (swift-5.7.2-RELEASE) 397 Target: x86_64-unknown-linux-gnu
12:56 AM
元から入っているSwiftのほうが /usr/local/bin にあるのでそっちが使われてしまっていました・・・ 最初から入っていたのか〜
12:58 AM
これは、どうするのがいいんだ・・・?
Avatar
macOSでは https://swiftenv.fuller.li/en/latest/installation.html を便利に使ってますが、これLinuxでも動くのかな?
1:00 AM
あとswiftwasmをセットアップしてくれるGitHub Actionsがあったような気もするんですよね
1:01 AM
GitHub Action with SwiftWasm toolchain and SDK preinstalled - GitHub - swiftwasm/swiftwasm-action: GitHub Action with SwiftWasm toolchain and SDK preinstalled
1:02 AM
カスタムなツールチェーンには対応してないかもしれない
1:03 AM
あとは単純に https://book.swiftwasm.org/getting-started/setup.html に従って、PATHを通すだけでもいけそうに思います
Avatar
omochimetaru 1/14/2023 1:06 AM
まあそうか /usr/bin に入れないで、別のところに置いてPATH通せばいいだけか
Avatar
あとGitHubActionsのUbuntu22.04はデフォでSwift入ってないのでそちらを使う手も。
Avatar
omochimetaru 1/14/2023 1:07 AM
それは将来swiftが入って壊れそうw
Avatar
確かにその可能性はありますね。イメージサイズ削減のために消された形なのであまりないとは思いますが。
Avatar
omochimetaru 1/14/2023 1:08 AM
そうなんですか。わざわざ消したなら20と22でズレてるの気持ち悪いですね
Avatar
22は色んなものが消えましたね
Avatar
omochimetaru 1/14/2023 1:10 AM
やばw ubuntu-latest 罠やん
Avatar
norio_nomura 1/14/2023 1:15 AM
GitHub Actions runner images. Contribute to actions/runner-images development by creating an account on GitHub.
😲 1
Avatar
本当だ!公式の最新情報を見るのが大事…
Avatar
norio_nomura 1/14/2023 1:19 AM
あと、手元のDockerで動いてるならciもubuntu-latestでDocker使うとか。
Avatar
omochimetaru 1/14/2023 1:20 AM
あ〜なるほど・・・
Avatar
norio_nomura 1/14/2023 1:22 AM
ビルドキャッシュを効かせれば、ci内に環境構築するより速くなりそうな気もする。
Avatar
omochimetaru 1/14/2023 1:34 AM
swiftwasmのswiftが通るようにしたらうまく行って先に進みました。
Avatar
Avatar
Iceman
あとswiftwasmをセットアップしてくれるGitHub Actionsがあったような気もするんですよね
ツールチェイン入れるだけのアクションもありますー https://github.com/swiftwasm/setup-swiftwasm
An action to download a prebuilt SwiftWasm toolchain and add it to the PATH - GitHub - swiftwasm/setup-swiftwasm: An action to download a prebuilt SwiftWasm toolchain and add it to the PATH
Avatar
omochimetaru 1/14/2023 4:46 AM
あったか
Avatar
omochimetaru 1/14/2023 4:59 AM
toolchainPath/usr/bin にインストールして addPath してるから自作したやつと原理は同じっぽいな
Avatar
うおー気づかんかった 便利
5:44 AM
.swift-version読んでくれるのか
Avatar
omochimetaru 1/14/2023 5:44 AM
あれ,マジ?アクションymlで指定する必要なかったか (edited)
Avatar
リポジトリルートの .swift-versionじゃないからだめかも
1:00 AM
usesとworking-directoryは一緒に使えなかった
Avatar
@Yuta Saito https://github.com/swiftwasm/swift-corelibs-foundation にIssuesがないのって意図的でしょうか?WasmのFoundationに関するIssueはswiftwasm/swiftに投げれば良いですか?
Avatar
おー、意図的ではなかったです。多分フォークした時の設定が引き継がれてるっぽい
t_naruhodo 1
1:37 PM
Issues有効にしときました
Avatar
ありがとうございます
Avatar
ここの挙動の違いでつまづいたときに iceman さんと同じことを思ってましたが意図していなかったのですね (issues が無効なことを) https://github.com/swiftwasm/swift-corelibs-foundation/blob/6c0904ed27fe693f2a50520ae526c86d15afe1ef/Sources/Foundation/NSURL.swift#L214 (edited)
The Foundation Project, providing core utilities, internationalization, and OS independence - swift-corelibs-foundation/NSURL.swift at 6c0904ed27fe693f2a50520ae526c86d15afe1ef · swiftwasm/swift-cor...
Avatar
Avatar
Yuta Saito
そういえば、小さなランタイムを作る話としては、compnerdさんがこういうのをやっています。 https://github.com/compnerd/uswift
↓がマージされたおかげで公式のコンパイラでもビルドできるようになってそうですね. https://github.com/apple/swift/pull/35970
This allows building the Swift standard library for targets which may not have an actual OS running. This is identified by the OS field in the target triple being set to none. Replace this paragr...
Avatar
単に自分の環境に問題がある可能性もありますが,今日のツールチェーンから macOS で実行できなくなってしまいました.CI の macOS と Xcode バージョンが最近上がったっぽいのでもしかしたら影響してそうな気もしますが. https://github.com/swiftwasm/swift/issues/5387 (edited)
Description The DEVELOPMENT-SNAPSHOT-2023-04-25-a toolchain doesn't seem to be run on macOS because /Users/gha-runner/homebrew/opt/zstd/lib/libzstd.1.dylib is dynamically linked into some execu...
Avatar
お、把握してなかったのでありがたいです
3:08 PM
zstdか… LLVMが依存してたようなしてなかったような
3:13 PM
これかー。とりあえずmacos-arm64のビルドマシンからzstd消せば良さそうな雰囲気 https://reviews.llvm.org/D128465
Avatar
おお,なるほど.llvm-project の upstream の変更は結構遅れて入ってくるんですね.
3:38 PM
と思ったらこっち自体には upstream 側が変更されたらすぐに入っているんですね. https://github.com/apple/llvm-project/commit/e939bf67e34037970192fa90ad22ab7628f5de33
  • add zstd to llvm::compression namespace
  • add a CMake option LLVM_ENABLE_ZSTD with behavior mirroring that of LLVM_ENABLE_ZLIB
  • add tests for zstd to `llvm/unittests/Support/CompressionTes...
Avatar
あー,swift-DEVELOPMENT-SNAPSHOT-2023-02-28-a の時は stable/20220421 branch だったのが,swift-DEVELOPMENT-SNAPSHOT-2023-04-25-a では stable/20221013 branch に切り替わって,zstd の変更がちょうどその間の期間の変更だったから入ってきた感じみたいですね.
👍 1
Avatar
omochimetaru 9/19/2023 9:02 AM
Today, there is no way to create an "export" from Swift. (The current workaround is using @_cdecl and linker option, or linking C source1). This PR adds a new variant of @_expose attribut...
🎉 10
t_kami 4
9:02 AM
Appleでインターンしてるkatei先生がwasm関連パッチをSwiftリポジトリに投げているが
9:02 AM
rdar番号が付いてるってことは・・・?
9:04 AM
隙間でやってるOSS業ではなくインターン業なのではなかろうか
t_tsuyoi 3
Avatar
家庭さんがApple公式CIにWASMを追加しようとしている。その他いろいろ。
1:01 AM
いや、それはもとからあったのかな?
Avatar
わいわい
Avatar
https://zenn.dev/chikoski/articles/webassembly-interface-type-101 WebAssembly Interface Typeっての初めて知りました。 いままでJSから利用する際は言語ごとに専用のランタイムと各種グルーコードをコード生成していたように思いますが、標準仕様があると利用側のランタイムやコード生成を任せられて便利そうですね (edited)
Avatar
WebAssembly Runtime written in Swift. Contribute to swiftwasm/WasmKit development by creating an account on GitHub.
Avatar
おお、もうあるのか
1:52 AM
これはSwiftコード上でWasmを動かすためのラインタイムか (edited)
Avatar
Swiftライブラリをwitと合わせて吐き出す(あるいはwitからSwiftコードを生成して、それに合わせたライブラリを作ればいい感じに配布できる)みたいなやつはありますか?
Avatar
そこに入ってるWITToolコマンドのgenerate-overlayとというのがそれにあたりそうです
Avatar
おお
Avatar
いままで preset=buildbot_linux_crosscompile_wasm @swift-ci Please test with preset Linux Platform と詠唱しないといけなかったのが楽になった
t_naruhodo 1
Avatar
なるほど.utils/build-presets.ini には入っていたからそんなに大きな変化ってわけじゃないんですね.
Avatar
ci.swift.orgでメインブランチのテストもしてもらえるようになったので、僕らがメンテしてるci-external.swift.orgのノードを消せるのは個人的には大きいですが笑 (edited)
t_naruhodo 1
Avatar
Package.swift 内で wasm32-unknown-wasi 向けのビルド時だけ分岐させる方法をご存知の方がいればお聞きしたいです.(beginner-help でやるべき話かもしれないですが) 単純に #if os(WASI) だとうまくいかないですし,やりたいのが cSettings.define を wasm32-unknown-wasi 以外の時だけ指定させたいので .define("HOGE", .when(platforms: [.wasi 以外を全部列挙])) みたいなのも試したんですが,.wasi 以外を全部列挙しないといけないのが微妙で...
Avatar
現状のSwiftPMのAPIでは表現できなさそうですねぇ。
7:09 PM
ちなみに具体的にはどういうケースですか?
Avatar
swift-markdown が依存している swift-cmark をこの define なしでビルドしたいんですよね.まだ thread サポートが入っていなくて適切な分岐に入らないので. https://github.com/apple/swift-cmark/blob/2c47322cb32cbed555f13bf5cbfaa488cc30a785/Package.swift#L18
CommonMark parsing and rendering library and program in C - apple/swift-cmark
Avatar
なるほどーソースを編集したくないケース
Avatar
これがあることによってここでスレッドサポート前提の分岐に入っちゃうので,_POSIX_THREADS も見つからなくて Windows でもないので,必要なマクロが定義されないので,スレッドサポートしていない方の分岐に入って欲しい感じです. https://github.com/apple/swift-cmark/blob/2c47322cb32cbed555f13bf5cbfaa488cc30a785/src/include/mutex.h#L6
CommonMark parsing and rendering library and program in C - apple/swift-cmark
Avatar
SwiftPMに新しいAPIを生やす以外に綺麗な方法は無さそうです…
Avatar
うーむ,やはりそうですよね... not みたいなのが議論されてないか Forums 漁ってみます.
🙏 1
Avatar
SE-0238 関連はあんまり議論がなさげですね... 同様の仕組みを使っている SE-0273 とかまで含めて探せばまだあるかもしれませんが. https://forums.swift.org/t/se-0238-package-manager-target-specific-build-settings/18341 ただ,今回の例に限っては .define("CMARK_THREADING", to: "0", .when(platforms: [.wasi])) で上書きすればいけるような気もしてきました. (ダメでした) (edited)
Hello Swift community, The review of SE-0238 “Package Manager Target Specific Build Settings" begins now and runs through December 4, 2018. Reviews are an important part of the Swift evolution process. All reviews should be made in this thread on the Swift forums or, if you would like to keep your feedback private, directly in email to me as t...
Avatar
omochimetaru 3/3/2024 10:13 PM
全部列挙で良いんじゃないかしら?
10:14 PM
下限OSバージョンとかも、そもそもPackageのplatformsに書いてないものは、非対応って扱いですし
10:16 PM
毎回列挙するとメンテしにくいので、そこはlet notWasi =とか一度変数にいれとく
Avatar
新しく例えば .visionOS (これはもうある) とか .freeBSD とかが指定できるようになった場合に追加し忘れで意図せず制限をかけちゃうのが良くないと思うんですよね. (edited)
Avatar
他にも .openbsd みたいに SwiftPM のバージョンが新しくないと指定できないやつとかに対応させようと思うと Package.swift をバージョンごとに増やす必要が出てきたり,.custom の扱いがよくわからなかったり,全部列挙は問題点が多くメンテナンスコストも高いように思います. https://developer.apple.com/documentation/packagedescription/platform/openbsd
Avatar
omochimetaru 3/4/2024 12:29 AM
まさにそのような観点での考え方の違いなのかと思っています。 visionOS や freeBSDが追加されたタイミングで、 その定義が追記されていないということは、 ライブラリの著者が実際にそのターゲットでビルドした事も無いはずです。 そして、その未知のターゲットについてはビルドも動作も見ていないのだから、 ライブラリの宣言としては非対応と考えるのが正しいのではないかと。 例えば、Foundation.URL.init(filePath:) のような新しいAPIは、 macOS 13以上、iOS16以上で提供されるわけですが、 こういった呼び出しが含まれるライブラリを持っていたとして、 SwiftPMにvisionOSが追加されたタイミングで、 「このAPIがvisionOSではいつから利用できるのか?」を調べて下限バージョンとして宣言するまでは、 このライブラリはvisionOSでは使えない、というのがデフォルト状態で正しいと思います。 (edited)
Avatar
そういう考えがあっても良いとは思いますが SwiftPM のデフォルト挙動はそうじゃなくて「書いてなかったら使える」となっているので,target specific build settings で not を表現しようとしたら急に考え方が変わるというのが気持ち悪さを感じる点です.
Avatar
omochimetaru 3/4/2024 12:45 AM
SwiftPM のデフォルト挙動はそうじゃなくて「書いてなかったら使える」となっている
platformsが空の時は急に全部使えることになってるのはおかしいと思ってます。確かにポリシーが矛盾してますね。
12:47 AM
「デフォルト」には、将来追加されうる未知のプラットフォームで、Unixライクではない全然違うもの(組み込みマイコンとか)も含まれうるので、デフォルトOKは厳しいと思うんですよね
Avatar
condition: .when(platforms: [...]) とかの platforms のことじゃなくてもしかして .package の platforms の話をされてますか?そっちは .linux とかその辺がそもそも指定できないのでまた話が変わってくると思います.
Avatar
omochimetaru 3/4/2024 12:50 AM
あ、はい、そうです。↓で書いたつもり。
下限OSバージョンとかも、そもそもPackageのplatformsに書いてないものは
Avatar
あれって noppe さんの Playdate SDK とかでは .custom でうまいこと使われてましたが,基本的に Apple Platform のためだけにあるという認識でした.
Avatar
omochimetaru 3/4/2024 12:52 AM
うーん確かに、conditionには.linux が書けるのに、 Package.platforms は宣言なしでlinuxが使えることになってますね。
12:53 AM
Packageに関しては Apple以外はデフォルト状態でサポートしてしまう、というか非サポートを書くこともできないのか。 (edited)
Avatar
宣言なしで使えるというかそもそも宣言したくてもできないです.conditional な依存関係やビルド設定のためにある Platform と,SupportedPlatform は別で,omochimetaru さんがおっしゃってる箇所は SupportedPlatform を記述するところなんですがそっちは linux が存在しないんですよね. https://developer.apple.com/documentation/packagedescription/platform https://developer.apple.com/documentation/packagedescription/supportedplatform
A platform supported by Swift Package Manager.
A platform that the Swift package supports.
12:55 AM
error: 'hoge': Invalid manifest (compiled with: ["/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/bin/swiftc", "-vfsoverlay", "/tmp/TemporaryDirectory.NMzSPB/vfs.yaml", "-L", "/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/lib/swift/pm/ManifestAPI", "-lPackageDescription", "-Xlinker", "-rpath", "-Xlinker", "/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/lib/swift/pm/ManifestAPI", "-swift-version", "5", "-I", "/home/kebo/.local/share/swiftly/toolchains/main-snapshot-2024-03-01/usr/lib/swift/pm/ManifestAPI", "-package-description-version", "6.0.0", "/home/kebo/hoge/Package.swift", "-Xfrontend", "-disable-implicit-concurrency-module-import", "-Xfrontend", "-disable-implicit-string-processing-module-import", "-o", "/tmp/TemporaryDirectory.OgHbDE/hoge-manifest"]) /home/kebo/hoge/Package.swift:8:18: error: type 'SupportedPlatform' has no member 'linux' 6 │ let package = Package( 7 │ name: "hoge", 8 │ platforms: [.linux], │ ╰─ error: type 'SupportedPlatform' has no member 'linux' 9 │ targets: [ 10 │ // Targets are the basic building blocks of a package, defining a module or a test suite.
12:57 AM
SupportedPlatform はドキュメント見るとわかるとおり Apple プラットフォームしか存在してないです.
Avatar
omochimetaru 3/4/2024 1:00 AM
なるほど。そうすると確かに非Apple環境はどれもデフォルトで許されている状態で、conditionのところで絞り込む考え方になっているから、 将来追加される全く新しい未知の対象についても、とりあえずビルドできるとする方に倒れているので、not operatorがあった方がいい気がしてきました。 (edited)
t_desudesu 1
Avatar
これは1つの解決になりそう https://github.com/apple/swift-package-manager/pull/7084
Add CaseIterable conformance to Platform Motivation: Close #4478 Sometimes downstream package only cares about excluding a given platform (eg. wasi). And each package need to maintain a supportedPl...
👏 1
Avatar
Motivation がまさに!って感じですね.
Avatar
omochimetaru 3/4/2024 8:29 AM
structでもCaseIterableにできるんだ 自動実装がされないだけか
Avatar
これみたいに macro で自動生成できないんだろうか https://forums.swift.org/t/introducing-staticmemberiterable-swift-macro/65454
StaticMemberIterable Confidently cover all static members. Like CaseIterable, this macro creates an array of all the static members of a type. This is useful when a type has a few examples as static members. Here, we have a Chili type so that we can discuss the heat level and names of various chilis. So far, we have two: jalapeño and habenero. ...
Avatar
omochimetaru 3/4/2024 8:36 AM
case相当とは関係のないメンバを巻き込んでしまいそう (edited)
Avatar
SwiftPMのビルドにマクロ入れたくない…
👀 1
t_naruhodo 1
Avatar
Avatar
Yuta Saito
SwiftPMのビルドにマクロ入れたくない…
omochimetaru 3/4/2024 8:36 AM
でもEquatableとかマクロになることを目指してるからいずれそうなりそう
Avatar
いやぁプロジェクト固有のマクロを入れるのとstdlibのマクロをプロジェクトから使うのは大分ビルドの面倒くささの開きがあり
8:40 AM
StaticMemberIterable がstdlibに入るのであれば一番楽だけどなかなか長そう
Avatar
omochimetaru 3/4/2024 8:40 AM
それはそうですね。
Avatar
Avatar
Yuta Saito
これは1つの解決になりそう https://github.com/apple/swift-package-manager/pull/7084
それが実現するまでは自分で Array を作ってこうするのが一番丸そうですね. https://github.com/apple/swift-package-manager/pull/3018
As reported by @broadwaylamb in SR-13813: In my project, I want to only build a SwiftPM target when the platform I'm building for is not .wasi. For that, I wrote the following code in my Packa...
Avatar
まーそうですねぇ。
Avatar
改めて Vision 出るんですね. https://github.com/apple/swift-evolution/pull/2358
For now this contains an introduction section which doesn't assume any prior knowledge of the Wasm ecosystem. It provides overview of properties of Wasm useful when applied to Swift developer t...
Avatar
omochimetaru 3/14/2024 1:40 PM
おお!公式サポートが本気になってきた
Avatar
がんばります
t_kansha 5
🎉 1
👏 1
Avatar
omochimetaru 3/15/2024 3:55 AM
読んだ
3:55 AM
wasmについての解説が基本から書いてあった
3:56 AM
ブラウザというよりプラットフォームとして使い所がいろいろあって、マクロとかでも使えそうで良いんだよ、という話になってた
3:59 AM
プロセス隔離しなくてもセキュアだからIPC要らない、と言われると確かに良さそうだ
Avatar
swift-foundationをSwift SDKのwasiでビルドしようとするとSwiftSyntaxのコンパイラプラグインをビルドしようとしてエラーになっちゃうんですが、これって何か回避策ありますか? ❯ swift build --target FoundationEssentials --experimental-swift-sdk 5.9.2-RELEASE-wasm Building for debugging... /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:103:19: error: cannot find 'dup' in scope let inputFD = dup(fileno(stdin)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:117:20: error: cannot find 'dup' in scope let outputFD = dup(fileno(stdout)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:124:11: error: cannot find 'dup2' in scope guard dup2(fileno(stderr), fileno(stdout)) >= 0 else { ^~~~
Avatar
omochimetaru 3/26/2024 8:54 AM
いろいろカオスだなそれ
8:55 AM
foundationをwasmで動かすのにsyntaxいらなそうだしコンパイラプラグイン関連のものはさらにいらなそうw
Avatar
まずSwiftPMのビルドシステムがクロスコンパイル+マクロに対応しきれてないのでそれを直す必要があって、、 (edited)
Avatar
やっぱりそんな感じですよね。ありがとうございます
8:58 AM
マクロは複雑だ
Avatar
❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.9 /bin/bash root@5aaf21fbf0d1:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Swift SDK bundle successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip is assumed to be an archive, unpacking... Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` successfully installed. root@5aaf21fbf0d1:/# swift experimental-sdk list 5.9.2-RELEASE-wasm ❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.10 /bin/bash root@59c43fdac52e:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Downloading a Swift SDK bundle archive from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`... Swift SDK bundle archive successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` is assumed to be an archive, unpacking... Error: gzip: stdin has more than one entry--rest ignored tar: Child returned status 2 tar: Error is not recoverable: exiting now
12:56 PM
5.10でartifactbundleの展開が何故かコケるようになってしまった
Avatar
5.10.0のSwiftPMは壊れてるんでhttps://github.com/apple/swift-package-manager/pull/7321 をバックポートしないとダメなんですよねぇ
😇 2
Avatar
そんなw
Avatar
5.10.1をお待ち下さい
Avatar
おとなしく5.9を使います・・・
🙏 1
Avatar
omochimetaru 3/26/2024 1:03 PM
www
Avatar
Avatar
Iceman
❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.9 /bin/bash root@5aaf21fbf0d1:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Swift SDK bundle successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip is assumed to be an archive, unpacking... Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` successfully installed. root@5aaf21fbf0d1:/# swift experimental-sdk list 5.9.2-RELEASE-wasm ❯ docker run -it --rm -v $(pwd):/$(basename $(pwd)) -t swift:5.10 /bin/bash root@59c43fdac52e:/# swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip Downloading a Swift SDK bundle archive from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`... Swift SDK bundle archive successfully downloaded from `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip`. Swift SDK bundle at `https://github.com/swiftwasm/swift/releases/download/swift-wasm-5.9.2-RELEASE/swift-wasm-5.9.2-RELEASE-ubuntu22.04_x86_64.artifactbundle.zip` is assumed to be an archive, unpacking... Error: gzip: stdin has more than one entry--rest ignored tar: Child returned status 2 tar: Error is not recoverable: exiting now
私は一度ダウンロードしてからインストールすることで回避してますよ. https://github.com/kkk669/swift-format/blob/d336d0ba4d49aa6a5fd7ce775a32ecf5fa1e8b73/.github/workflows/build.yml#L19
The WebAssembly (WASI) version of swift-format. Contribute to kkk669/swift-format development by creating an account on GitHub.
Avatar
あーなるほど、zipの展開が問題なだけだから自前で展開してパス指定すればいいんですね
2:52 PM
とりあえず今回は5.9でも問題ないので5.9にして過ごしました
Avatar
いや,展開だけだと何故か成功するんですよ.自前で展開はしてないです.
Avatar
ほんまや、スクリプト見たら自前でやってるのダウンロードだけですね
Avatar
エラーメッセージは展開で失敗してるっぽかったので不思議なんですけどね.(6.0 では問題なくなってるので深追いはしていない) (edited)
Avatar
Avatar
Iceman
swift-foundationをSwift SDKのwasiでビルドしようとするとSwiftSyntaxのコンパイラプラグインをビルドしようとしてエラーになっちゃうんですが、これって何か回避策ありますか? ❯ swift build --target FoundationEssentials --experimental-swift-sdk 5.9.2-RELEASE-wasm Building for debugging... /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:103:19: error: cannot find 'dup' in scope let inputFD = dup(fileno(stdin)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:117:20: error: cannot find 'dup' in scope let outputFD = dup(fileno(stdout)) ^~~ /Users/iceman/Downloads/swift-foundation-main/.build/checkouts/swift-syntax/Sources/SwiftCompilerPlugin/CompilerPlugin.swift:124:11: error: cannot find 'dup2' in scope guard dup2(fileno(stderr), fileno(stdout)) >= 0 else { ^~~~
期待しすぎるのもあれですけど,今年の GSoC のテーマにあった "Building Swift Macros with WebAssembly" は多分その辺を避けては通れないですよね. https://www.swift.org/gsoc2024/
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
macOS OSSツールチェインにlldが入った 🎉 https://github.com/apple/swift/pull/70715 (edited)
We already include lld in the Linux and Windows toolchains. For embedded Swift development, it's common to (need to) use ELF even on a macOS host, but the Xcode-provided linker is Mach-O only. ...
🎉 3
🙌 1
Avatar
omochimetaru 3/28/2024 8:14 AM
embeddedで必要にせよ、それはswift sdkが必要だから、そこで持ってくれば良さそうだけど
8:14 AM
ld64やめていく流れがあるんかな
Avatar
ホスト上で動かすツールを一個入るだけでSwift SDK自体がホスト依存になるんで各ホストごとにビルドしないといけなくて面倒くさいんですよね
Avatar
omochimetaru 3/28/2024 8:16 AM
お、なるほど。SDKパッケージのバリアントが増えてしまうのか。
8:16 AM
SDKパッケージはターゲットだけのバリアントにとどめたいのか。
Avatar
lldを入れるのはあくまでクロスコンパイル用で、Appleプラットフォームではld64を引き続き使い続けるはず
8:17 AM
という気持ちの現われがこちらに https://github.com/apple/llvm-project/pull/8119
For Embedded Swift, we want to start including lld even in Darwin toolchains to be able to link ELF files even on Darwin, see apple/swift#70715. To avoid accidentally using lld to link Mach-O files...
👀 1
Avatar
Avatar
omochimetaru
SDKパッケージはターゲットだけのバリアントにとどめたいのか。
そうそう。今全部のホストごとにツールチェインとSwift SDKを配布してて。。。 https://github.com/swiftwasm/swift/releases/tag/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-03-27-a (edited)
Avatar
omochimetaru 3/28/2024 8:21 AM
まあこれは大変か〜・・・
Avatar
あーたしかにSwiftSDKいれるときホストの情報必要になって一瞬戸惑いがありました
8:38 AM
そういうツールだったけっていう
Avatar
Xcode 15 以降のリンカ (ld-prime) って mold 並に速いので,普通に使うなら lld よりもそっちを使ったほうが速度的なメリットは大きいので ld64 使い続けるのは正しい方向性だと思います. 一方でこの辺の macOS 向けの環境構築手順と Linux 向けの環境構築を見比べると一目瞭然なんですが,lld が同梱されると組み込み開発が Swift ツールチェーンを入れるだけで基本は全て完結して楽になるのが嬉しいですね. https://github.com/ole/swift-rp-pico-bare?tab=readme-ov-file#on-macos (edited)
Avatar
The Lede I decided to take a crack at the whole "Building Macros with WebAssembly" idea and managed to put together something that improves build times by up to 10x even without any compiler integration! There's currently some caveats on the usability front since this is a standalone package instead of integrating into swiftc/SwiftPM, but I thi...
👀 1
2:44 AM
それなりにインタプリタ最適化して書いたおかげで、マクロくらいの短命なプログラムならWasmKitのほうがWebKitより速くなるケースがあるらしい。やったぜ
Avatar
omochimetaru 3/29/2024 8:53 AM
図が欲しいな・・・
8:53 AM
この表はそれぞれ何の時間?
8:54 AM
ビルド時間っぽいけど、WasmKitやWebKitはランタイムだよね?
8:55 AM
あとこれにSwiftSyntaxが横に並ぶ意味がわからない・・・
8:55 AM
(kabiroberai/WacroのREADME.mdは読んだけどわからんかった) (edited)
Avatar
「SwiftSyntax」って書かれてるのは従来のネイティブにコンパイルして評価するパターンですね
Avatar
omochimetaru 3/29/2024 9:19 AM
wasmの場合はSwiftSyntaxはプレビルドで、マクロ部分のビルドと実行?の時間で
9:19 AM
3列目はSwiftSyntaxとマクロをコンパイルしてから実行する時間か?
9:20 AM
そうだったとして、マクロ部分のコードサイズと、マクロ適応対象のソースコードによっても変動するから解釈が難しいな
Avatar
インクリメンタルの行はマクロの実行速度をだいたい示してて、
9:26 AM
  • Clean + WasmKitはWasmKit自体のビルド時間 + コンパイラプラグインのビルド時間 + マクロ実行時間
  • Clean + WebKitは コンパイラプラグインのビルド時間 + マクロ実行時間
になってて
Avatar
omochimetaru 3/29/2024 9:27 AM
WebKitはランタイムがプレビルドなのか!w
Avatar
Clean (debug) + WasmKit > Clean (debug) + SwiftSyntax になってるのはWasmKit自体のデバッグビルドがSwiftSyntaxのビルドより時間かかってるということ何だと思います (edited)
9:29 AM
9:30 AM
Compiler Pluginの部分はツールチェインに同梱できるはずなので、WasmKitのビルド時間は気にする必要がなくなるはず
Avatar
なるほど!
Avatar
omochimetaru 3/29/2024 1:48 PM
struct MyApp: ReactComponent { func render() -> ReactNode { h.div { h.h1 { "Hello My App" } h.p { "hello" } } } } SwiftにReactを提供するとしたらどんなAPIがいいんだろう HTML部分は Result Builder が便利だとは思うが、 div みたいな小文字キーワードを大量にネームスペースにばら撒くのは良くないと思ってて、 グローバルな h. にぶら下げたらマシかなあ (HTMLのh)
Avatar
久しぶりにWebなWasmの話だ
1:51 PM
グローバルに置いても良いんじゃないですか?
1:52 PM
困るかな
Avatar
omochimetaru 3/29/2024 1:55 PM
直感的にはめっちゃ違和感あるけど いいのかな
1:56 PM
TypeScript書いてて意図しないshadowingで困った事無いといえば無いか
Avatar
omochimetaru 3/29/2024 4:57 PM
@Yuta Saito JavaScriptKitって、macでもLinuxでもビルドできるけど、ターゲットがwasmじゃなかったらコンパイルも実行もできない?
Avatar
Avatar
omochimetaru
@Yuta Saito JavaScriptKitって、macでもLinuxでもビルドできるけど、ターゲットがwasmじゃなかったらコンパイルも実行もできない?
ターゲットがwasm以外でも一応ビルドはできるけど実行はできないですね
Avatar
omochimetaru 3/29/2024 5:02 PM
一応ビルドはできるんか
Avatar
外側のJSと喋ろうとするタイミングでfatalError
Avatar
omochimetaru 3/29/2024 5:03 PM
なるほど
5:03 PM
JSKとしては、JavaScript側から一番最初にJS側へのインターフェースを登録することを期待していて (edited)
5:04 PM
それがないので止まるって感じ?
5:05 PM
JS側からは、JSKをビルドしたwasmから関数を引っ張り出すようになってて、Cターゲットでその辺をやっている (edited)
Avatar
そうですねーWasmレベルのimport functionが注入されないのでそれを使おうとしたタイミングでクラッシュ https://github.com/swiftwasm/JavaScriptKit/blob/main/Sources/JavaScriptKit/XcodeSupport.swift
Avatar
omochimetaru 3/29/2024 5:10 PM
これはwasm targetでは無い場合にJS側から入れてもらうはずの関数を手前で定義しているのか。
5:10 PM
Swift側ではif archを使って状況を判定できるんすね (edited)
5:12 PM
Package.swiftのレベルで今wasmターゲットでビルドしてるかどうか状況判定する方法はあるんだっけ (edited)
Avatar
condition: .when(platforms: [...])が使えます
Avatar
omochimetaru 3/29/2024 5:14 PM
wasiがあるのかそうか
Avatar
ここで絞れるのplatformだけでarchは無いんですよねぇ
Avatar
omochimetaru 3/29/2024 5:15 PM
微妙に対応がズレてるね
Avatar
提案すれば通ると思うけどまあ大体現状で何とかなってしまう
Avatar
omochimetaru 3/29/2024 5:16 PM
package側でdefine使ったり、Swift側ではcanImportで2次的に判定したりはできるか?
Avatar
ターゲットにコンパイルされるSwiftソース上ではいくらでもやりようはありますねー
Avatar
omochimetaru 3/29/2024 5:18 PM
なるほど
5:20 PM
ウーンどうしよっかなあ
Avatar
どこで何を分岐したいんだろう
Avatar
omochimetaru 3/29/2024 5:22 PM
Reactを作ろうとしてて
5:23 PM
ブラウザのwasmで動かすのが本命だけど、いろいろ開発が難しそうだから
5:24 PM
macでJSやDOMのない環境でも動くようにしたい
5:25 PM
macで動くってのはダイナミックにGUIとしては動かないけど論理的には動く状態
Avatar
TokamakはGTKにも対応していて同じようなことをしているはず https://github.com/TokamakUI/Tokamak
Avatar
omochimetaru 3/29/2024 5:29 PM
GTK (以前は GTK+, The GIMP Toolkit) は、クロスプラットフォームのウィジェット・ツールキット(GUIツールキット)である。当初は、GIMPの実装のために開発され、現在は、GNOMEデスクトップ環境のツールキット等として広く利用されている。 GTKはGNUプロジェクトの一部であり、GNU LGPLの元で開発されているオープンソースなフリーソフトウェアである。 GTKアプリケーションは、GNOMEに限らずKDEなどのGTKベースでないデスクトップ環境でも動作する。GNOMEライブラリを使用することにより、GNOMEデスクトップ環境のさまざまな機能を使用したアプリケーションを開発することができるが、GTKだけでアプリケーションを構成することも可能。 GTKは、主に...
5:29 PM
このGTK?
Avatar
そのGTK
Avatar
omochimetaru 3/29/2024 5:29 PM
めちゃくちゃ久しぶりに見た
5:31 PM
なるほど
Avatar
omochimetaru 3/29/2024 5:40 PM
Tokamak見てきたけどクソデカいなこれw
Avatar
omochimetaru 3/29/2024 5:48 PM
SwiftUI-compatible framework for building browser apps with WebAssembly and native apps for other platforms - TokamakUI/Tokamak
5:50 PM
SwiftUI-compatible framework for building browser apps with WebAssembly and native apps for other platforms - TokamakUI/Tokamak
5:51 PM
Appのstatic func _launchの実装が、どれをimportするかで変わって
5:51 PM
Viewシステム側が共通でDOMRendererやGTKRemdererなどが切り替わるようだ
5:53 PM
canImportでSwiftUIが通る時は
5:53 PM
TokamakCoreを読み込まないでSwiftUIの型名をそのまま出すのか
5:54 PM
野望がデカすぎるやろ・・・
Avatar
夢は大きく!
Avatar
omochimetaru 3/29/2024 5:55 PM
核融合プロジェクトを思わせる名前なのには納得できてきた
5:55 PM
Swift側ではif os(WASI)も書けるんだね
5:56 PM
Maxのコミットが2年前ぐらいで止まってるのApple行ったタイミングか・・・?
5:59 PM
必要な知識はある程度集まったな、考えてみよう どうもありがとう〜
Avatar
期待してます!!
Avatar
omochimetaru 3/31/2024 8:28 AM
@Yuta Saito https://github.com/swiftwasm/JavaScriptKit/blob/0a4cb162e4561c63195d5f9db08b3efba424bed4/Sources/JavaScriptKit/JSValue.swift#L197 この6つのグローバル関数ってどういう意図でグローバル関数なの? メソッドの方が自然なAPIだと思った
Swift framework to interact with JavaScript through WebAssembly. - swiftwasm/JavaScriptKit
Avatar
ドキュメントも書いてないしpublicにするつもりじゃなかったのかな?
8:32 AM
publicなAPIとしてJSObjectのメソッドがあって、それが中でこれを使ってるはず
Avatar
omochimetaru 3/31/2024 8:36 AM
C実装の_get_propsとかをSwiftインターフェースにするローレベルなやつって感じでエンドユーザーは気にしなくてよさそうなやつか
Avatar
だったはず。なので隠しても問題なさそう
Avatar
omochimetaru 3/31/2024 8:37 AM
破壊的変更になってしまう
Avatar
壊してまで隠す必要はない
Avatar
omochimetaru 3/31/2024 4:10 PM
JavaScriptKitのふりするコード動いたw
Avatar
よさそう
Avatar
omochimetaru 3/31/2024 4:14 PM
なんかミスってた場合、ブラウザで動かしたら全然動かないって事になるけど
4:15 PM
そういう時って ・JSKのC関数の中で死んだらconsole.log出る? ・Swift側の .object! とかで死んだら、どこかに何か出る?
Avatar
クラッシュした場合実行エンジン側がバックトレースを出してくれますね。
4:16 PM
ブラウザの場合デバックコンソールに出る
Avatar
omochimetaru 3/31/2024 4:17 PM
おお、えらい それはだいぶいいな
Avatar
バックトレースと言うかJS環境だと例外が飛ぶ
4:18 PM
例外キャッチしていなければよしなに例外のバックトレースが表示される
Avatar
omochimetaru 3/31/2024 4:18 PM
ブラウザのデバッガはwasm領域ってどうなってるん?
Avatar
デバッグサポートは雑に言うと2段階あって
4:20 PM
一番簡素なのがnameセクションという関数と名前のマップを含んだカスタムセクションが.wasmバイナリにある場合、バックトレースを表示するときにその名前を使ってくれる、というやつ。 https://webassembly.github.io/spec/core/appendix/custom.html#name-section
4:20 PM
これはほぼ全ての実行環境がサポートしてる
Avatar
omochimetaru 3/31/2024 4:21 PM
ん、じゃあWASMのコールスタックもJS側と繋がって出てくるのか
Avatar
Chromeやwasmtimeだともう1段リッチなDWARFサポートがあって、
  • 関数名だけでなくソースコード上のファイル+行番号へのマップ
  • ローカル変数のダンプ
などなど、ができる
Avatar
omochimetaru 3/31/2024 4:23 PM
思ったよりすごい
4:23 PM
文明進んでた
Avatar
ChromeでDWARFサポートを有効にするためには拡張を入れる必要があるんですが、入れるだけでだいぶ文明が進む https://book.swiftwasm.org/getting-started/debugging.html
Avatar
omochimetaru 3/31/2024 4:24 PM
.wasm ファイルの中にsourcemapが埋め込まれてるの?
4:25 PM
既存のswift compilerだとそういうの無さそうだけど
Avatar
DWARF情報がいわゆるsourcemapに対応しますね
4:26 PM
普通のターゲットでも同じくDWARFで行番号マップしてますよ
Avatar
omochimetaru 3/31/2024 4:26 PM
DWARFとかってファイルパスを埋め込んでるだけだと思ってた
Avatar
超リッチ
Avatar
omochimetaru 3/31/2024 4:26 PM
だからビルドした人のマシンじゃないとソースは見えないのかと。
4:26 PM
そうだったのかー
Avatar
ああ、ソースコンテンツ自体は含んでないんでデバッグする人の手元にはソース必要です
Avatar
omochimetaru 3/31/2024 4:27 PM
ああなるほど
4:27 PM
chromeがファイルシステムを見に行ってるのね
Avatar
そうそう
Avatar
omochimetaru 3/31/2024 4:27 PM
理解
Avatar
例の拡張機能がパスの置換もできるんでビルドマシンと手元のソースファイルの位置が違っても大丈夫 (edited)
Avatar
omochimetaru 3/31/2024 4:28 PM
いわゆるsourcemapは、完全にソースコードそのものだから、他の人も読める。(だから、本番にdevelop buildでデプロイしてはいけない)
4:29 PM
もしかしてSafariは文明が遅れている・・・?
Avatar
sourcemapの方をわかってあげられてなかった 😂
4:29 PM
Safariは残念ながら
Avatar
omochimetaru 3/31/2024 4:30 PM
ぐぬぬ swift-wasmのためにapple頑張らないと
4:31 PM
でも思ってたよりwasm on web実用性ありそうやなあ (edited)
4:31 PM
もっとエクストリームかと思ってた
Avatar
プロダクションで使われ始めてだんだん育ってきた 🌱 (edited)
Avatar
omochimetaru 3/31/2024 4:35 PM
ありがたいなあ swift-wasmも統合されて公式サポート間近(?)だし、機が熟してきた (edited)
Avatar
はやくWasm元年を到来させたい
Avatar
omochimetaru 3/31/2024 4:38 PM
VR元年は毎年来てるけどWASM元年は言われてもないな
🙃 2
Avatar
ポテンシャルだけで注目されてきたんでそろそろ実用性を…
Avatar
SIMD が欲しい系 (3D ビューアや機械学習の推論等) では使うのが当たり前になっている印象ですが,そういう用途だと GPU の方が速いので WebGPU があれば WebAssembly そんなに要らないなとなりがち...
Avatar
omochimetaru 3/31/2024 4:57 PM
vscodeが使う正規表現エンジンのonigurumaがwasm実装になってて、これはCPUタスクだから良さそう
Avatar
omochimetaru 4/1/2024 12:57 PM
@Yuta Saito public extension JSValue { /// An unsafe convenience method of `JSObject.subscript(_ name: String) -> ((ConvertibleToJSValue...) -> JSValue)?` /// - Precondition: `self` must be a JavaScript Object and specified member should be a callable object. subscript(dynamicMember name: String) -> ((ConvertibleToJSValue...) -> JSValue) { object![dynamicMember: name]! } これなんだけど、このsubscriptから返ってくる関数に @discardableResult 付ける方法ないよねえ?
Avatar
なさそうなんすよねぇ
Avatar
omochimetaru 4/1/2024 12:59 PM
そうだよねえ
12:59 PM
12:59 PM
voidの関数でも _ = が必要になっちゃって不満
Avatar
クロージャじゃなくてcallAsFunction持つ型を返すようにするとどうだろうか
Avatar
omochimetaru 4/1/2024 1:00 PM
!!!!
Avatar
Avatar
Yuta Saito
クロージャじゃなくてcallAsFunction持つ型を返すようにするとどうだろうか
omochimetaru 4/1/2024 1:18 PM
ありがとう、できたわ しかも、そのような型としてすでに JSFunction が存在していたので、 クロージャからそれに置き換えるだけでよかった
Avatar
なるほどー
Avatar
omochimetaru 4/1/2024 1:20 PM
JavaScriptKitにバックポートしないと意味がないから宿題が増えた
1:20 PM
Mockだけ改善されても意味ねえ
1:24 PM
しかし、後ろに () が付いてることを起点に、dynamicMember subscriptをオーバーロードするの、テクいなあ
1:24 PM
動くのは理解できるけどちょっとこづいたら壊れそうで不安になる実装だ
Avatar
思ったようにオーバーロード選択されるようになるまでにチョッと大変だった
Avatar
omochimetaru 4/1/2024 1:26 PM
そうなんだ @_disfavoredOverload ついてるからこれでクリアしたのかと思った
Avatar
ズルしてクリアした
Avatar
omochimetaru 4/1/2024 1:28 PM
無しでやろうとして苦戦したということね
Avatar
そうそう。
Avatar
omochimetaru 4/1/2024 1:28 PM
家庭君は _disfavoredOverload に慎重な傾向を感じる
Avatar
軽率に_disfavoredOverloadつけている
2:12 PM
正式な機能としてほしい
2:12 PM
ついでに_disfavoredOverloadにもランク付けをしたい
Avatar
人間にオーバーロード管理させようとすると乱用するから…
Avatar
omochimetaru 4/1/2024 2:16 PM
SwiftUIがそれに依存してるから大丈夫だろの気持ちはあるけど、 2段階目がつけられないから、それで困ることはありそうですね
Avatar
  • 汎用的なプロトコル
  • 専用プロトコル
それぞれ用のオーバーロードがあるときに、専用プロトコル側に寄せるための方法がなくてこれに頼る必要が生まれてる
2:20 PM
Codableを受け付けるけど、専用のファストパスがあるならそっち、みたいな。
2:21 PM
内部で分岐すれば1個でもいけるか?
Avatar
omochimetaru 4/1/2024 2:26 PM
それは対応方法があって、 <T: P1> と、 <T: P2> の2つのオーバーロードとは別に <T: P1 & P2> のオーバーロードを用意して、その中の実装で <T: P2> 版に転送すればいいですよ
2:26 PM
P1 & P2 は P1 よりも強いし P2 よりも強いので、どっちにもいけるやつを吸い込んでくれる
2:27 PM
でも、 P3, P4と増えると組合せ爆発するのでスケールはしない方法。
Avatar
omochimetaru 4/2/2024 1:41 PM
うわあー
1:41 PM
型推論のえぐいの引いた
1:42 PM
public final class JSFunction { public convenience init< S: JSNativeObject, A0: ConstructibleFromJSValue, A1: ConstructibleFromJSValue >( _ selector: @escaping (S) -> (A0, A1) -> Void ) where A0.Constructed == A0, A1.Constructed == A1 { let impl = { (this: JSObject?, arguments: [JSValue]) -> JSValue in selector(this!.native as! S)( A0.construct(from: arguments[0])!, A1.construct(from: arguments[1])! ) return .undefined } print(S.self, A0.self, A1.self) self.init(impl: impl) } }
1:42 PM
これに対して
1:43 PM
public class WebNode { public func insertBefore(_ node: WebNode, _ ref: WebNode?) public func _get_property(_ name: String) -> JSValue { switch name { case "childNodes": childNodes.jsValue case "firstChild": firstChild.jsValue case "nextSibling": nextSibling.jsValue case "parentNode": parentNode.jsValue case "description": description.jsValue case "appendChild": JSFunction(Self.appendChild).jsValue case "insertBefore": JSFunction(Self.insertBefore).jsValue case "remove": JSFunction(Self.remove).jsValue case "removeChild": JSFunction(Self.removeChild).jsValue default: .undefined } } }
1:43 PM
これを呼び出したら
1:45 PM
(WebNode) -> (WebNode, WebNode?) -> Void がマッチして
1:45 PM
S == WebNode, A0 == WebNode, A1 == WebNode? と解決されると思ったが
1:46 PM
S == WebNode, A0 == WebNode, A1 == WebNode と解決されてしまった
Avatar
どうなるの
Avatar
omochimetaru 4/2/2024 1:46 PM
確かに contravariance だから、 A1 == WebNode として解決していても、 実際に渡すクロージャは (WebNode, WebNode?) -> Void で広く受けてるから問題ない、理論的には間違ってない
1:47 PM
ただこっちが期待してるのは A1 == WebNode? になってることだから
1:47 PM
呼び出そうとして nil がくると実行時クラッシュする
Avatar
ConstructibleFromJSValueは、Optionalもconformしてるの?
Avatar
omochimetaru 4/2/2024 1:49 PM
してる。conditional conformしてる。 extension Optional: ConvertibleToJSValue where Wrapped: ConvertibleToJSValue { public var jsValue: JSValue { self.map { $0.jsValue } ?? .null } }
1:55 PM
func foo<S, A0>(_ fn: (S) -> (A0) -> Void) { print(type(of: fn)) } struct Z { func method(_ arg: Int?) {} } foo(Z.method) // (Z) -> (Optional<Int>) -> () シンプルなコードだと望ましい挙動になるな。深いぞこれ・・・
Avatar
やってるのは JSFunction(WebNode.insertBefore) であってますかね
Avatar
omochimetaru 4/2/2024 1:55 PM
あってる
1:56 PM
あー正確には実行時には selfWebHTMLElement になっているから、 動的に確認すると (WebHTMLElement) -> (WebNode, WebNode?) -> Void を渡してる 静的にはコンパイル時に S = WebNode, A0 = WebNode, A1 = WebNode になっとる
Avatar
func foo<S, A0: CustomStringConvertible, B0: CustomStringConvertible>(_ fn: (S) -> (A0, B0) -> Void) { print(type(of: fn)) } struct Z { func method(_ arg1: Int, _ arg2: Int?) {} } foo(Z.method) 再現したよ
1:57 PM
あいや、Int?がCustomStringConvertibleじゃないか
Avatar
omochimetaru 4/2/2024 1:58 PM
おお
1:58 PM
再現できてる
1:58 PM
arg2 が Int? なのに、 B0 が Int になってる。
Avatar
Avatar
tarunon
あいや、Int?がCustomStringConvertibleじゃないか
omochimetaru 4/2/2024 1:58 PM
あ、そうね
Avatar
Int?をCustomStringConvertibleにしたら回避できた
1:59 PM
難しいね
1:59 PM
経験則だが、condconfの宣言が、同ライブラリにあるか、別ライブラリにあるかで振る舞いが変わる気がする
Avatar
omochimetaru 4/2/2024 1:59 PM
public protocol ConstructibleFromJSValue { associatedtype Constructed = Self static func construct(from value: JSValue) -> Constructed? } このassociatedtypeも関係あるかなあ
Avatar
その型assoctypeありましたっけ
2:00 PM
あ、これはモックの方か
Avatar
omochimetaru 4/2/2024 2:00 PM
あ〜〜〜 別の間違いがあるかもしれん。
Avatar
Avatar
Yuta Saito
その型assoctypeありましたっけ
omochimetaru 4/2/2024 2:01 PM
そうそう。本家の実装だと問題があるんだよね。
2:01 PM
public protocol ConstructibleFromJSValue { associatedtype Constructed = Self static func construct(from value: JSValue) -> Constructed? } extension Optional: ConstructibleFromJSValue where Wrapped: ConstructibleFromJSValue { public static func construct(from value: JSValue) -> Wrapped.Constructed? { switch value { case .null, .undefined: return nil default: return Wrapped.construct(from: value) } } }
2:01 PM
これ間違ってるな?
Avatar
case .null, .undefined:.some(nil) を返したい?
Avatar
omochimetaru 4/2/2024 2:03 PM
double optionalになるはずやね
Avatar
Avatar
Yuta Saito
case .null, .undefined:.some(nil) を返したい?
omochimetaru 4/2/2024 2:03 PM
え〜っと、そうだと思う。
2:04 PM
外側がデコードの成否だから正しくnilなのでそう
2:06 PM
直った!
2:06 PM
違うところのミスだった、お騒がせしました。
Avatar
めでたし
Avatar
Avatar
Yuta Saito
めでたし
omochimetaru 4/2/2024 2:08 PM
JavaScriptKit本家の定義だと、 JSObjectConstructibleFromJSValue に準拠できないんだよね
2:09 PM
covariance Self の問題が起きる (edited)
Avatar
covariance Self の問題
これどういう問題でしたっけ?
Avatar
omochimetaru 4/2/2024 2:11 PM
Functional JSON parsing library for Swift. Contribute to thoughtbot/Argo development by creating an account on GitHub.
2:11 PM
ちょっと待ってね
2:13 PM
違うな、準拠自体はできるんだわ
Avatar
ふむふむ
Avatar
omochimetaru 4/2/2024 2:19 PM
ハマりを再現しようとしてるけど再現しなくて今困ってるところw
Avatar
w
Avatar
omochimetaru 4/2/2024 2:24 PM
あ〜 わかった 問題なかったわ
2:24 PM
ここで勘違いしたけど、
2:24 PM
public static func construct(from value: JSValue) -> Self? { value.object as? Self } これでいいんだね
2:25 PM
本家の定義で大丈夫だった。
2:26 PM
これもお騒がせだった。
Avatar
いや、 JSFunction のケースがあるんで case .object:case .function:の両方のケースをここでチェックする必要があるんではないかな
Avatar
omochimetaru 4/2/2024 2:27 PM
それはまた別の問題としてあると思う。
2:27 PM
.object のなかの JSObject が 実際には JSFunction の可能性があるけど (edited)
2:27 PM
全体的にその考慮がおかしい気がしてた
Avatar
JSFunctionJSObject のサブクラスにしたのは相当後悔してる
Avatar
omochimetaru 4/2/2024 2:28 PM
というかそもそもJSのランタイムにはそれが区別できないから
2:28 PM
正しい形がわからん
Avatar
.object の中身が 実際にはJSFunctionの可能性はないですね
Avatar
Avatar
Yuta Saito
.object の中身が 実際にはJSFunctionの可能性はないですね
omochimetaru 4/2/2024 2:28 PM
でも JSFunction is JSObjectだよ
Avatar
そこはtypeof objfunction を返してくれるんで
2:28 PM
ああ、ユーザが勝手にJSValueを作る場合か
Avatar
omochimetaru 4/2/2024 2:28 PM
あーtypeofは区別するんだ。知らんかった。
2:29 PM
んーじゃあ case function が存在するのは問題ないのか
Avatar
Avatar
Yuta Saito
ああ、ユーザが勝手にJSValueを作る場合か
omochimetaru 4/2/2024 2:30 PM
えーとそう。 class MyFunc: JSFunction とやってから .object(MyFunc()) が通っちゃう。
Avatar
JSValueenum にしたのがなぁ
2:31 PM
Rubyの方ではまた違うアプローチにしててそれなりに上手く行った
Avatar
omochimetaru 4/2/2024 2:31 PM
あとは JSObject(id: JavaScriptObjectRef) これに実際には function の値を渡す可能性はあるのか?
Avatar
Avatar
omochimetaru
あとは JSObject(id: JavaScriptObjectRef) これに実際には function の値を渡す可能性はあるのか?
それってSPIで隠れてるインターフェースじゃなかったでしたっけ
2:32 PM
ライブラリ内では気をつけてそういう違反がないようにしてたはず
Avatar
Avatar
Yuta Saito
それってSPIで隠れてるインターフェースじゃなかったでしたっけ
omochimetaru 4/2/2024 2:33 PM
隠れてる。
2:34 PM
うーん大丈夫なのか。Cと受け渡すところで、typeof のfunctionに基づいてcaseを決めるから。
2:35 PM
.object(MyFunc()) これをやっても、 MyFunc.jsValueJSFunction のところでoverride されてるから、 .jsValue を使えば大丈夫か。 (edited)
Avatar
そうそう。なのでおそらく問題の穴は JSValue.object(function) が作れてしまうところだけではないかな。
2:36 PM
JSFunction から JSValue を作る場合普通の人は .jsValue を使うので問題が顕在化しない
Avatar
omochimetaru 4/2/2024 2:36 PM
なるほど。
2:37 PM
本当は case JSValue.object を呼び出した時に、内部でJS側の実体を調べて、 functionだったら case function になれば穴はなさそうだけど enum case constructor だからそういうフックが書けないのがダメなのか?
2:38 PM
case _object とかにして static func object() にしたら避けられるけど、switch-caseしたときにダサい名前が出てくるし・・・
Avatar
そう… public enum にしたの本当にまずかった
Avatar
omochimetaru 4/2/2024 2:38 PM
でもcase constructできないけどswitchできるenumって定義できないよね? (edited)
Avatar
static funcで同名のオーバーロードを生やしつつそれをunavailableにマークすると一応できるんだけど、厳しすぎる…
Avatar
omochimetaru 4/2/2024 2:40 PM
そのunavailableってswitch-caseで使うときは許されるのかw
2:41 PM
https://github.com/apple/swift-package-manager/blob/26b4ed010e7ec211f0aad7527961f83508ea4771/Sources/PackageDescription/Target.swift#L51 SwiftPMが、APIをstatic funcにして、実際のcaseはダサい名前にしてるけど
2:41 PM
実際のcaseを勝手に作ることはできちゃうな
Avatar
@swift-main enum E { case c(Int) @available(*, unavailable) static func c(_: Int) -> E { fatalError() } } func check(e: E) { switch e { case .c(_): break } }
Avatar
Avatar
Yuta Saito
@swift-main enum E { case c(Int) @available(*, unavailable) static func c(_: Int) -> E { fatalError() } } func check(e: E) { switch e { case .c(_): break } }
swiftNightly BOT 4/2/2024 2:41 PM
exit status: 1 with <stdin>:3:42: error: invalid redeclaration of 'c' 1 │ enum E { 2 │ case c(Int) 3 │ @available(*, unavailable) static func c(_: Int) -> E { fatalError() } │ ╰─ error: invalid redeclaration of 'c' 4 │ } 5 │
Avatar
あれ、出来なくなってた。 enum case as witness methodが入ったあたりかな
Avatar
omochimetaru 4/2/2024 2:42 PM
あったな〜
Avatar
case constructorのvisibilityを制御したい〜〜
Avatar
omochimetaru 4/2/2024 2:44 PM
今できる安全なAPI設計は、 switch-caseする時用のenum型を専用に用意して enum JSValue.Switcher とかにしておいて、 APIは struct JSValue で全部通す、とかかな。 var JSValue.switcher: JSValue.Switcher { get } (edited)
2:44 PM
不正なSwitcherは作れるけどそれ以上伝搬しないので意味ない
Avatar
それしかないかなぁ。ダサすぎるけど90%のユーザはJSValueに対してswitchしないからギリ許容できるかもしれない
Avatar
omochimetaru 4/2/2024 2:46 PM
まあswitchするときに switch foo.jsValue.switcher って書かないといけないのはダサいねw。
Avatar
Avatar
Yuta Saito
いや、 JSFunction のケースがあるんで case .object:case .function:の両方のケースをここでチェックする必要があるんではないかな
omochimetaru 4/2/2024 2:46 PM
巻き戻って、これは、合ってるのか・・・?
Avatar
まだ穴あるかな
Avatar
omochimetaru 4/2/2024 2:47 PM
public static func construct(from value: JSValue) -> Self? { switch value { case .object(let x): return x as? Self case .function(let x): return x as? Self default: return nil } }
2:48 PM
この as? が不安になるんだけど考え中
Avatar
ついでに case .bigInt も必要だ
Avatar
omochimetaru 4/2/2024 2:48 PM
モックには出てこないのですてました
2:51 PM
1. JSObject.construct.object が渡る → as? JSObject でok 2. JSObject.construct.function が渡る → x: JSFunction で取り出して as? JSObject は成功するから、動的にJSFunctionな静的なJSObjectが返る 3. JSFunction.construct.object が渡る → x: JSObject で取り出して as? JSFunction に失敗して nil 4. JSFunction.construct.function が渡る→ x: JSFunction で取り出して as? JSFunction で OK
2:52 PM
1と4は自明にOKで、 2は、さっきから話してる不正case constructができてしまうだけで、その先で .jsValue を使う限り問題なし 3はダウンキャストの失敗だから失敗でok (edited)
2:53 PM
うーん良さそうか
Avatar
Avatar
Yuta Saito
ついでに case .bigInt も必要だ
omochimetaru 4/2/2024 2:53 PM
てかbigintってなんでランタイムレベルで区別されてるん?
2:53 PM
objectではない?
2:55 PM
typeof の BigInt 値 (bigint プリミティブ) に対する評価値は、"bigint" となります。
2:55 PM
任意長の値型プリミティブだから string の親戚みたいなもんなのか・・・ (edited)
2:57 PM
public final class JSBigInt: JSObject {
2:57 PM
むむ?
Avatar
caseで区別すべきだったかは今考えるとびみょうな所ですねぇ。
Avatar
omochimetaru 4/2/2024 2:58 PM
ようわからなくなってきた。
2:58 PM
JavaScript において、関数は第一級オブジェクトです。すなわち、関数はオブジェクトであり、他のあらゆるオブジェクトと同じように操作したり渡したりすることができます。具体的には、関数は Function オブジェクトです。
3:00 PM
const i = 1; i.__proto__; // Number
3:00 PM
コピーした時のセマンティクスの違いがあるだけで、全部オブジェクト?
3:03 PM
それもよくわかんないな、常にリファレンスコピーにも見える、stringがimmutableだからわからない
3:05 PM
Avatar
なんでだったかな
Avatar
omochimetaru 4/2/2024 3:05 PM
Functionは、プロパティを書き込めるから、参照共有してることが露出する
3:06 PM
stringとbigintは、プロパティが書き込めない(読み取ったら消えてた)し、mutable methodを持たないから、immutable objectになってて、値型っぽく見える
Avatar
一番最初のデザインとしては、Swift側にとって自然な表現に出来てかつJS側に戻すときに情報が失われないのであれば値としてコピーする、という意図だった
Avatar
omochimetaru 4/2/2024 3:06 PM
振る舞いからすると、Functionは確かにObjectっぽいけど、bigintはFunctionよりstringに似てるように見えて、Objectっぽくない
Avatar
で、その意図に沿うとBigIntは値としてコピーするべきなんだけどそういう話は全然出てないな https://github.com/swiftwasm/JavaScriptKit/pull/184
Avatar
omochimetaru 4/2/2024 3:08 PM
検討漏れかしら
Avatar
ついでに case number(Double) になってると書き戻すときにNaNビットが変わる可能性があるのでUInt64のビットパターンで保持すべきだ
Avatar
Avatar
omochimetaru
検討漏れかしら
おそらく
Avatar
omochimetaru 4/2/2024 3:10 PM
symbolも値っぽい?
JavaScript では、シンボルはプリミティブ値です。 Symbol データ型を持つ値は「シンボル値」として見ることができます。 JavaScript の実行時環境では、シンボル値は Symbol 関数を呼び出すことで生成され、動的に無名の一意の値を生み出します。シンボルはオブジェクトプロパティとして使用されることがあります。
Avatar
うむ
Avatar
omochimetaru 4/2/2024 3:11 PM
Avatar
いや、Symbolはダメだ (edited)
Avatar
omochimetaru 4/2/2024 3:11 PM
ここみたらよかった
3:11 PM
プリミティブって分類されるものが、イミュータブルで値コピー風に振る舞うんでは?
Avatar
Swift側で表現する方法がない
Avatar
javascriptは、boxingが入ってるから
3:12 PM
primitiveもオブジェクトに暗黙的に変換できるだったと思う
Avatar
Avatar
Yuta Saito
Swift側で表現する方法がない
omochimetaru 4/2/2024 3:14 PM
Swift側では struct JSString と同じように struct JSSymbol にしたら問題ある?
3:14 PM
内部表現としては JavaScriptObjectRef になってればSwift側でみた同値性をJS側でみた同一性で実装できる (edited)
Avatar
あれ、それでいいのか?
Avatar
Avatar
tarunon
primitiveもオブジェクトに暗黙的に変換できるだったと思う
omochimetaru 4/2/2024 3:15 PM
というか、JSコード側から、これがオブジェクトかどうか、を判定する方法がないように感じた (edited)
3:16 PM
プリミティブも、オブジェクトと振る舞いに違いがない 単にイミュータブルなだけ
Avatar
Avatar
Yuta Saito
あれ、それでいいのか?
omochimetaru 4/2/2024 3:16 PM
文字列からコンストラクトする時に、一旦JS側のAPIでシンボルインスタンスを作らないといけないけど、それで同一性も維持できると思う
Avatar
良いような気がしてきた
3:21 PM
RawJSValue の時点では既にそういう表現になっているので問題はSwift API上での継承関係だな
Avatar
omochimetaru 4/2/2024 3:21 PM
そうね
3:22 PM
Swiftネイティブな暗黙のアップキャストやasを使わせたい場合にclassが必要という事だと思う
3:23 PM
public struct JSHTMLElement: CustomStringConvertible { public init(jsObject: JSObject) { self.jsObject = jsObject } public let jsObject: JSObject public var jsValue: JSValue { .object(jsObject) } public func asNode() -> JSNode { JSNode(jsObject: jsObject) } } public struct JSNode: Equatable & Hashable & CustomStringConvertible { public init(jsObject: JSObject) { self.jsObject = jsObject } public let jsObject: JSObject public var jsValue: JSValue { .object(jsObject) } public func asHTMLElement() -> JSHTMLElement? { if jsObject.isInstanceOf(JSWindow.global.HTMLElement) { return JSHTMLElement(jsObject: jsObject) } else { return nil } } public func asText() -> JSText? { if jsObject.isInstanceOf(JSWindow.global.Text) { return JSText(jsObject: jsObject) } else { return nil } } }
3:24 PM
今JavaScriptKitの上で構築してる型付きインターフェースでは、継承関係があっても値型にして、 アップキャストとダウンキャストは明示的なメソッドにしている (edited)
3:25 PM
こうしないと、JSNode をコンストラクトするときに、値の真の型に応じたサブクラスで包むのが難しい(厳密にやろうとするとサブクラスが200種類とかある) (edited)
Avatar
まーそうですよねぇ。言語間の継承関係をネイティブに対応関係取ろうとするなんて無理だ
Avatar
omochimetaru 4/2/2024 3:26 PM
ラッパーレイヤーでダウンキャストする時に実際にJS側でinstanceofするとそのような無駄な計算がない (edited)
Avatar
Avatar
Yuta Saito
まーそうですよねぇ。言語間の継承関係をネイティブに対応関係取ろうとするなんて無理だ
omochimetaru 4/2/2024 3:26 PM
JSインスタンスにくっついてるプロトタイプ関数が取ってこれれば辞書引いて O(1) にはできるんだけどね。 (edited)
3:27 PM
とりあえず今の所 instanceof しかAPIが開いてなさそうだったから無理そうだった (edited)
Avatar
もしメジャーアップデートするならRuby側でやった「全てがJSObject作戦」を輸入したい
Avatar
omochimetaru 4/2/2024 3:32 PM
ほお
3:32 PM
それって現時点の 「全てが JSValue」とどう違うの?
Avatar
コアのAPIとしてはリファレンスを保持する JSObjectだけがあって
3:33 PM
他のJSなんちゃらクラスは存在しない
Avatar
omochimetaru 4/2/2024 3:33 PM
ふむふむ
Avatar
値としてRuby側にコピーしたい場合は JSObject に生えてるto_i, to_sとかを使う。
Avatar
omochimetaru 4/2/2024 3:37 PM
赤ちゃん起きた
👶 1
Avatar
つまり値としてJS世界のものを取り回そうとするからAPIが複雑になるのであって、コアライブラリの中では全て不透明な型で表現して、特定の型のインターフェースがほしいときはそれを使う側でラップしてくれ、でだいたい上手くいくことがわかった。 (edited)
Avatar
omochimetaru 4/2/2024 3:42 PM
良さそうに見える
Avatar
唯一懸念点があるとすればNumberをやりとりするだけの場合にオブジェクトとしてトラッキングしないといけなくなるので速さとメモリ性能が若干落ちる気がする
Avatar
omochimetaru 4/2/2024 3:47 PM
Numberは実際には JavaScriptObjectRef に埋め込まれた値なんじゃなかったっけ?
3:47 PM
タグポインタ値型
Avatar
そういう実装もできるのでやりようはありますね
Avatar
omochimetaru 4/2/2024 4:43 PM
4:44 PM
Swiftで書かれたDOM上で動いてたテストが、 JSのつもりで書かれたSwiftのDOM をJavaScriptKitMockを通して ラップしたSwiftのDOMの上で動くようになった! (edited)
Avatar
動いてきたな
Avatar
omochimetaru 4/2/2024 4:45 PM
理論上 root.render は ブラウザでも動くはずw
Avatar
(文脈変わりますが) WASI 向けにビルドする場合って executableTarget を import できないみたいな特有の制約があったりしますか?
5:34 AM
executableTarget を import してテストするテストターゲットがホスト環境にはビルドできて WASI 向にはビルドできなかったので気になりました.
Avatar
Description Tests on a default Hello World carton project fails during compilation. Here is the result of carton test: error: no such module 'carton_demo' @testable import carton_demo ^ not...
5:34 AM
むしろできる環境が特殊というか
5:35 AM
リンカの方に機能たさないと出来なくてまだ手つけられてないんですよね〜
Avatar
なるほど,やっぱりそうなんですね.できる環境が特殊というのはわかります.swift-format がそれをしていてうまくテストコードを流用できないなと思ってたところでした.
Avatar
omochimetaru 4/3/2024 5:36 AM
swift-formatそんなことしとんのかw
Avatar
Note that hidden files will always be honored if they are specified explicitly among the paths on the command line. Symlinks encountered during recursive traversal or passed on the command line wil...
5:37 AM
この辺で入ってきましたね.
Avatar
omochimetaru 4/3/2024 5:39 AM
executableの実装全部いれたtargetと、main付けるだけのexecutableTargetに分けた方がいいよお
Avatar
私も自分で書くときは大体そうしますw
Avatar
omochimetaru 4/3/2024 5:40 AM
The reason why the linking is not supported on Wasm is we cannot rename entrypoint symbol by linker (wasm-ld): Stop renaming main symbol for WASI apple/swift-package-manager#3804 On other platforms, SwiftPM build .executableTarget targets with renaming main to {moduleName}_main to avoid conflicting with .testTarget's entrypoint at link-time. For non-testing build, SwiftPM renames the entrypoint back to main by linker option. However, wasm-ld doesn't have the option for now, so we disable the feature now.
(edited)
5:41 AM
う〜ん大変そう
5:43 AM
リンクはできても他にも暗黙の仮定が壊れたりしてマイナーな問題がありそう
Avatar
リンカが複雑になるからこういうの本当に辞めたほうが良いと思う
5:47 AM
こういうのとか。。 https://github.com/apple/swift/pull/69113
Avatar
omochimetaru 4/3/2024 5:49 AM
なるほど async main
5:49 AM
でもこの変更はスマートだね
5:49 AM
リンケージ可視性もなんか色々システムがあるんやな
Avatar
omochimetaru 4/3/2024 12:01 PM
swift-for-wasm-examplesをやってみているが
12:01 PM
$ swift build --triple wasm32-unknown-none-wasm -c release --product swift-audio-c release があるとビルドできる ないとできない
12:02 PM
12:02 PM
error: compile command failed due to signal 6 (use -v to see invocation) Assertion failed: (!f->isGeneric()), function addLazyFunction, file GenDecl.cpp, line 1589. Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
12:08 PM
むずいなこれ
12:08 PM
dlmalloc が入ってるけどどこにも #include <malloc.h> がない
Avatar
クラッシュするのは良くないけどEmbeddedモードなんでまあそんなもんかなぁ
Avatar
Avatar
Yuta Saito
クラッシュするのは良くないけどEmbeddedモードなんでまあそんなもんかなぁ
omochimetaru 4/3/2024 12:09 PM
ランタイムジェネリクスがないはずで、それが最適化パスで全部特殊化されるんだけど、デバッグモードだとそのパスがないからジェネリックなコードが残っちゃって、どっかで怒られる、みたいな雰囲気かな?
Avatar
そうそう。
Avatar
omochimetaru 4/3/2024 12:09 PM
なるほど。気持ちはわかる。
Avatar
ランタイムライブラリが posix_memalignシンボルを参照してるだけなんでユーザコードはdlmalloc直接使わないですね
Avatar
omochimetaru 4/3/2024 12:10 PM
おー じゃあリンクするときまではソースの干渉はないのか
Avatar
そうそう
Avatar
omochimetaru 4/3/2024 12:11 PM
// dlmalloc.c int posix_memalign(void **memptr, size_t alignment, size_t size) { return dlposix_memalign(memptr, alignment, size); } これか
12:11 PM
memalignって何だっけ。mallocの方は使ってないの?
12:12 PM
名前 posix_memalign, memalign, valloc - アラインメントされたメモリの割り当てを行う
12:12 PM
ああ
12:12 PM
アライメント付きmallocがmemalignなのか
12:13 PM
Vult is a transcompiler well suited to write high-performance DSP code - vult-dsp/vult
12:13 PM
なんかこれも謎言語だし・・・
12:14 PM
The Vult compiler is a transcompiler, which takes Vult code and produces plain C/C++ code that can be compiled in any platform with a C/C++ compiler, for example: Arduino or Teensy boards (using fixed-point arithmetics).
12:16 PM
.vult ファイルはビルドと関係なくて、生成された C++ ソースと一緒にコミットされてるだけかな
Avatar
ぽい。そっちは全然知らない
Avatar
omochimetaru 4/3/2024 12:17 PM
すごいな
12:17 PM
ブラウザ上でJS実装のコンパイラを使ってコンパイルすることもできるらしい
Avatar
すごいな
12:18 PM
↑そのデモがあった。やばい音なる。爆音注意
Avatar
しかも微妙に怖い音だw
Avatar
omochimetaru 4/3/2024 12:20 PM
イケイケなEDMが流れるのかと思ったらめっちゃ技術デモっぽい音だった。
Avatar
われわれが何の話をしているかと言うと、最近apple GitHub org傘下にSwift for WebAssemblyのデモリポジトリが出来ました: https://github.com/apple/swift-for-wasm-examples/ (ここでリンク貼ったことない気がするので。) (edited)
Contribute to apple/swift-for-wasm-examples development by creating an account on GitHub.
12:31 PM
↑三角波をライブコーディングしてる 何となくわかる
12:32 PM
なんかシェーダーみたいな感じだな
12:33 PM
あ、最後はちょっと演奏っぽくなった
Avatar
Luaにもコンパイルできるの面白いな
Avatar
omochimetaru 4/3/2024 12:47 PM
exampleの方に戻ってきたけど
12:47 PM
Vultで音を作るんじゃなくて、これは部品として使っていて
12:48 PM
C++化したVultコードをSwiftで合成しているな
12:50 PM
SwiftとWebの境界は、家庭くんが作ってた @_extern(wasm) を使うアプローチなんだな
12:52 PM
Vultでの音楽プログラミングのイメージがわかないからこれをSwiftでラップしてどのくらい嬉しくなってるのかがピンとこねえ
12:53 PM
12:53 PM
これがJS側からWASMに関数を渡している部分で
12:54 PM
Swift側からそれをこうやって宣言することで叩くと
12:55 PM
const { instance } = await WebAssembly.instantiateStreaming( fetch('.build/wasm32-unknown-none-wasm/release/swift-audio.wasm'), { ...importsObject, } ); instance.exports.main();
12:56 PM
JS側から明示的にエントリーしてる
12:56 PM
@Yuta Saito 以前も聞いた気がするけど、WASMオブジェクト側のメモリとかの実行状態は、この instance のなかで継続してるのかな?
Avatar
うむ
Avatar
omochimetaru 4/3/2024 12:57 PM
JS側から呼べるのはSwift側でexposeしているからだな
Avatar
Avatar
Yuta Saito
うむ
omochimetaru 4/3/2024 12:57 PM
じゃあ例えば単純には、Swift側で @_expose(wasm, "onClick") func onClick { ... } みたいなことをやって
12:57 PM
HTML側のonClickからJSで instance.onClick() とやれば
12:58 PM
UIとインタラクトして動作するわけね
Avatar
そうそうそんな感じですね
Avatar
omochimetaru 4/3/2024 1:01 PM
なるほど だいたいわかったぞ
1:03 PM
dimalloc/include/wasi_api.h はどこからきたんだ・・・
1:03 PM
Code in Sources/dlmalloc directory is derived from wasi-libc: https://github.com/WebAssembly/wasi-libc
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
1:03 PM
書いてあった
Avatar
errno定数だけwasiのやつを使ってるのか
Avatar
omochimetaru 4/3/2024 1:05 PM
ややこしいな wasi-libcからdlmallocだけパクってきてるから
1:05 PM
いろんなものの関心の境界がわからんw
Avatar
  • WASIのシステムインターフェース自体は使ってない
  • アロケータはWasm自体のspecの範囲で書ける
Avatar
omochimetaru 4/3/2024 1:07 PM
wasi_api.h でめっちゃ色々書いてるけど、ほとんど使ってなさそうな
Avatar
Avatar
Yuta Saito
  • WASIのシステムインターフェース自体は使ってない
  • アロケータはWasm自体のspecの範囲で書ける
omochimetaru 4/3/2024 1:07 PM
WASI使ってないってこと?
Avatar
そうそう。だからJS側のエントリポイントでWASI実装差し込んでないんですよ
Avatar
omochimetaru 4/3/2024 1:07 PM
ややこしい〜!w
1:08 PM
ただwasi-libcのdlmallocがwasmサポートに改造されてるからパクっただけで
1:08 PM
wasiを使って動いているわけではないんだ
Avatar
そうそう。
1:08 PM
なのでこれは完全にwasi-lessなバイナリなんだけど一部wasi-libcの実装が入ってるw
Avatar
Avatar
omochimetaru
swift-for-wasm-examplesをやってみているが
だからターゲットトリプル(4つフィールドあるけど)にwasi入ってないんですよ
Avatar
omochimetaru 4/3/2024 1:09 PM
swift build --triple wasm32-unknown-none-wasm -c release --product swift-audio
1:09 PM
確かに!
Avatar
none OS
Avatar
omochimetaru 4/3/2024 1:10 PM
4つ目の -wasm なくても伝わりそう
1:10 PM
wasm32 って最初に言ってるし
Avatar
このケースの4つ目のObject Formatフィールドは無くても動くはず
Avatar
omochimetaru 4/3/2024 1:12 PM
[omochi@omochi-mbp swift-for-wasm-examples (main =)]$ swift build --triple wasm32-unknown-none -c release --product swift-audio Building for production... error: emit-module command failed with exit code 1 (use -v to see invocation) <unknown>:0: error: could not find module 'Swift' for target 'wasm32-unknown-none'; found: riscv32-none-none-eabi, riscv64-none-none-eabi, i686-unknown-none-elf, armv7-apple-none-macho, armv6m-none-none-eabi, aarch64-none-none-elf, wasm64-unknown-none-wasm, arm64-apple-macos, i686-unknown-windows-msvc, x86_64-unknown-none-elf, x86_64-unknown-windows-msvc, arm64-apple-none-macho, armv7-none-none-eabi, armv7em-none-none-eabi, arm64e-apple-macos, x86_64-apple-macos, armv6-apple-none-macho, armv6m-apple-none-macho, wasm32-unknown-none-wasm, armv7em-apple-none-macho, armv6-none-none-eabi, at: /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a.xctoolchain/usr/lib/swift/embedded/Swift.swiftmodule <unknown>:0: error: could not find module 'Swift' for target 'wasm32-unknown-none'; found: riscv32-none-none-eabi, riscv64-none-none-eabi, i686-unknown-none-elf, armv7-apple-none-macho, armv6m-none-none-eabi, aarch64-none-none-elf, wasm64-unknown-none-wasm, arm64-apple-macos, i686-unknown-windows-msvc, x86_64-unknown-none-elf, x86_64-unknown-windows-msvc, arm64-apple-none-macho, armv7-none-none-eabi, armv7em-none-none-eabi, arm64e-apple-macos, x86_64-apple-macos, armv6-apple-none-macho, armv6m-apple-none-macho, wasm32-unknown-none-wasm, armv7em-apple-none-macho, armv6-none-none-eabi, at: /Users/omochi/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a.xctoolchain/usr/lib/swift/embedded/Swift.swiftmodule
Avatar
ハハだめじゃんw
Avatar
omochimetaru 4/3/2024 1:12 PM
ツールチェーンにstdlibが無い、みたいなやつか?
1:13 PM
wasm64-unknown-none-wasm wasm32-unknown-none-wasm ↑foundの中にはこの2つがあるな (edited)
Avatar
3つ版にマッチするpre-builtされたswiftmoduleが無いってことですね
Avatar
omochimetaru 4/3/2024 1:13 PM
なるほどなるほど。
1:14 PM
4つ目はオブジェクトフォーマットなんですね
Avatar
オブジェクトフォーマットもしくはエンバイロメントです
Avatar
omochimetaru 4/3/2024 1:14 PM
確かに多くの場合はCPU, Vendor, OSが決まったら定まってそう (edited)
1:15 PM
いや、
1:15 PM
4つ組だらけだな?上のログ
Avatar
embedded向けには4つ版使ってるっぽい
Avatar
omochimetaru 4/3/2024 1:15 PM
riscv32-none-none-eabi riscv64-none-none-eabi i686-unknown-none-elf armv7-apple-none-macho armv6m-none-none-eabi aarch64-none-none-elf wasm64-unknown-none-wasm arm64-apple-macos i686-unknown-windows-msvc x86_64-unknown-none-elf x86_64-unknown-windows-msvc arm64-apple-none-macho armv7-none-none-eabi armv7em-none-none-eabi arm64e-apple-macos x86_64-apple-macos armv6-apple-none-macho armv6m-apple-none-macho wasm32-unknown-none-wasm armv7em-apple-none-macho armv6-none-none-eabi
Avatar
まあnone OSだと自明じゃないケースもあるんで
Avatar
Avatar
Yuta Saito
embedded向けには4つ版使ってるっぽい
omochimetaru 4/3/2024 1:16 PM
あーこれembedded modeの影響も受けているのか?
Avatar
none OSはEmbeddedモード強制ですね今のところ
Avatar
omochimetaru 4/3/2024 1:16 PM
ほんとだ、よくみたら emit-module が落ちている
Avatar
omochimetaru 4/3/2024 1:20 PM
Environmentとして読んでみて、だめならFormatとして読んでみる、なるほど
1:22 PM
WASI libc implementation for WebAssembly. Contribute to WebAssembly/wasi-libc development by creating an account on GitHub.
1:22 PM
dlmalloc/src の中身全然違って笑ってる
1:24 PM
/* Symbol marking the end of data, bss and explicit stack, provided by wasm-ld. */ extern char __heap_base; extern char __heap_end;
1:24 PM
wasmのリンカーが __heap_base__heap_end をリンクしてくれる、というのが、
1:25 PM
wasmのレベルのメモリAPIってこと?
Avatar
omochimetaru 4/3/2024 1:25 PM
dlmallocはその中を管理してチャンクを提供したりする
1:26 PM
ファイルリストが違いすぎるのが気になってる
1:26 PM
なんならmallocはCソースじゃなくてヘッダーだし・・・
Avatar
そうすね。リンカが静的な領域(スタック、rodata、data)をレイアウトしてその後ろはプログラム側が伸ばせる。リンカはその境界をシンボル注入して教えてくれる
1:27 PM
ディレクトリ構造が違うのはそうすね。でもパット見全部wasi-libcにあるソースだな。
Avatar
omochimetaru 4/3/2024 1:28 PM
あーそういうことか
1:28 PM
errno.c とかは別のディレクトリにおいてあるやつをかき集めてきたのか (edited)
1:31 PM
heap_end で全部あるわけじゃなくて、 /* Get memory from system using MORECORE or MMAP */ static void* sys_alloc(mstate m, size_t nb) {
1:31 PM
この中でMORECORE?やMMAPを呼んでセグメントをもらって、
1:31 PM
dlmallocの管理プールに足す感じだ
Avatar
memory.growという命令があるんでそれを使います
Avatar
omochimetaru 4/3/2024 1:33 PM
むむ!まだ潜れるのか
1:33 PM
uintptr_t old = __builtin_wasm_memory_grow(0, (uintptr_t)increment / PAGESIZE);
1:33 PM
これか
Avatar
それ
Avatar
omochimetaru 4/3/2024 1:34 PM
wasm_memory_growsbrk の実装になってて
1:35 PM
sbrkMORECORE の実装になってるっぽいな #define MORECORE_DEFAULT sbrk
Avatar
うむ
Avatar
omochimetaru 4/3/2024 1:35 PM
で、sys_allocmalloc って感じで libc らしくなるのか
Avatar
wasi-libcの歩き方完全理解
Avatar
omochimetaru 4/3/2024 1:39 PM
Linuxを見てきた sbrk のなかで sys_brk を呼んでいて、 それが return (void *)my_syscall1(__NR_brk, addr); している https://github.com/torvalds/linux/blob/3e92c1e6cd876754b64d1998ec0a01800ed954a6/tools/include/nolibc/sys.h#L87
1:40 PM
my_syscall はアセンブリを出すマクロになってる、これがシステムコールABIなのか
Avatar
そう、そこがシステムコールになってるか組み込みの命令になってるかが普通と違うんですよね (edited)
Avatar
omochimetaru 4/3/2024 1:41 PM
なるほどなるほど
1:41 PM
wasi-libc は(LinuxのようなOSと比べると)小さいからこういうのがわかっていいな (edited)
Avatar
Wasmはシステムプログラミングの勉強にも良い
Avatar
omochimetaru 4/3/2024 1:42 PM
ああそうか、 __builtin_wasm_memory_grow は関数としてリンクするんじゃなくて
1:42 PM
コンパイラがそういうWASM命令に変換するだけか
1:43 PM
そこでWASMバイナリとしてのボトム表現になるんだ
1:43 PM
あ〜そうかだから
1:43 PM
CPU命令とシステムコールの区別がないのか
1:43 PM
両方WASM命令として同じレイヤーにある
Avatar
ほとんどのシステムコールに対応するものはWASIの関数として提供されてます
Avatar
omochimetaru 4/3/2024 1:44 PM
面白いなあ
1:45 PM
JVMと比べると、あれはオブジェクトの生成とかが命令のレベルだけど、 確かにここまで命令のレベルを下げないと、いろんな言語のバイナリが乗らないんだ
1:45 PM
だいたい何でもlibc使ってるから、libcより下のところでインターフェースを切る必要がある
1:45 PM
libcじゃないGoバイナリとかもこれなら同じように実装できるし。
Avatar
memory.growを命令セットに含めたデザインはかなり好き
Avatar
omochimetaru 4/3/2024 1:47 PM
不思議な感じだ
1:47 PM
これまでの常識と結構違うのにうまくハマってるようにも見える
Avatar
これをWASIの一部にしなかったことでホストの提供する機能に依存せずにどこでも大体のバイナリが動く
Avatar
omochimetaru 4/3/2024 1:49 PM
あれ、そうだ、そうするとWASIって何だったっけ
Avatar
ファイルシステム、時計、乱数、コマンドライン引数、環境変数
Avatar
omochimetaru 4/3/2024 1:50 PM
あ〜〜
Avatar
これは組み込みにするとデカすぎるのであくまでユーザ側で制御するオプショナルな機能群。Webでどう表現するか議論の余地もあるし。 (edited)
Avatar
omochimetaru 4/3/2024 1:51 PM
そうかそうか、WASIはそのインターフェース規格で、実装は自由で、 実際には JS側からさっきのアレで注入したりとか色々あるのか
1:51 PM
でもメモリ確保はWASIじゃなくてWASMコア仕様の方に入れたわけか
Avatar
そうそう
Avatar
omochimetaru 4/3/2024 1:51 PM
何も考えなければfopenとかmallocと同じノリで
1:51 PM
WASIの方にメモリ領域確保を置く設計もあり得るわけだけど
1:52 PM
そうしてないところにセンスがあるな
Avatar
共感が得られた!
Avatar
omochimetaru 4/3/2024 1:53 PM
WASMがVMや実行環境の文脈で語られる気持ちがわかってきた
1:53 PM
これは深いな
1:53 PM
すごいねえ
Avatar
Avatar
Yuta Saito
共感が得られた!
omochimetaru 4/3/2024 1:54 PM
漠然としたイメージで認識は合ってたけど、ディテールを知ると味があるね。
1:56 PM
下側はだいたいわかったので次はcartonを見ておこうかな・・・ https://github.com/swiftwasm/carton
📦 Watcher, bundler, and test runner for your SwiftWasm apps - swiftwasm/carton
Avatar
cartonは最近超薄くなりました
Avatar
omochimetaru 4/3/2024 1:57 PM
1:58 PM
気になる(まだ、理解できる前提知識が足りるかわからんが
Avatar
SwiftPM Pluginになった
Avatar
omochimetaru 4/3/2024 1:58 PM
え!それはえらい
1:58 PM
謎の自前コマンド体系じゃないんですね
1:58 PM
swiftpmの枠の中に収まった
Avatar
コンパチのために若干枠をはみ出してるけど、SwiftPMの方をなおして枠に収める予定
Avatar
omochimetaru 4/3/2024 1:59 PM
なるほどw
2:00 PM
plugin commandってrunからキックできたんだっけ
2:00 PM
swift package cmd じゃなかったっけ?
Avatar
そこがはみ出てるポイントですな
Avatar
omochimetaru 4/3/2024 2:00 PM
README1段落目で草 (edited)
2:00 PM
ん?今はどうなってんだこれ
2:01 PM
.executableTarget( name: "carton", dependencies: [ "SwiftToolchain", "CartonHelpers", ] ),
2:01 PM
普通にこうなってるのか。
Avatar
ツールチェイン自体の自動インストールはSwiftPMのプラグインじゃ表現できないんすよ
Avatar
omochimetaru 4/3/2024 2:02 PM
swift compiler toolchainの管理もするの? (edited)
Avatar
うむ。自前で入れてたらピュアなSwiftPM Pluginとして使える
Avatar
omochimetaru 4/3/2024 2:03 PM
なるほどなるほど
2:04 PM
carton って命名の由来ってどっかに説明ある?
Avatar
わかんない…Maxにきいてみよ
Avatar
omochimetaru 4/3/2024 2:04 PM
単にwebpackとかbundlerとかcrateみたいな感じで箱って言ってるだけなんかな
2:04 PM
web assemblyにシャレが効いてたらよかったなって・・・思いました
Avatar
プラグインになったことでSwift SDKとの連携もシンプルにできるようになった https://github.com/swiftwasm/carton/pull/420
Breaking changes: carton CLI is now slimmed down to be a SwiftPM Plugin. This means that you can now use carton by just declaring it as a dependency in your Package.swift file. dependencies: [ ...
2:05 PM
たしかに
Avatar
omochimetaru 4/3/2024 2:06 PM
これが今の話か。図だ。
2:07 PM
If you already use carton before 0.x.x versions via Homebrew, you can remove it with brew uninstall carton and install the new version as a SwiftPM dependency.
昔はbrew installだったのがpackage pluginでよくなったのか いいねえ
2:08 PM
こういうブートストラップが一段標準化するだけでかなり違うんだよな こういう謎環境は
Avatar
brewメンテするの本当にダルくてリリースの腰が重かったんだけど、だいぶ気軽にできるようになったし、なんならリリースしなくてもコミット指定できるから超便利になった
Avatar
omochimetaru 4/3/2024 2:10 PM
あー提供側も楽になるんだね そっちの目線は全くなかったw
Avatar
win-win ✌️✌️
2:12 PM
ただプレビルドを提供しなくなったのでユーザ側でビルドしてもらう必要があるんですよね。プラグイン化にあたってかなり依存減らしてビルド時間に気をつけてるんですけど、それでも気になるかもしれない。 (edited)
Avatar
omochimetaru 4/3/2024 2:14 PM
マクロと同じでpluginもwasm runtime上で動くようにしてプレビルドを・・・
Avatar
道のり長いなw
2:15 PM
まずウェブサーバをWasm上で動かします
Avatar
omochimetaru 4/3/2024 2:15 PM
dev serverがあるからそうだ・・・
Avatar
でもじつはこれはそれなりに現実的に見えてきたんだよな
Avatar
omochimetaru 4/3/2024 2:16 PM
まじか
Avatar
もうちょっと頑張るといける
Avatar
omochimetaru 4/3/2024 2:17 PM
ちょっとの感覚が全然わからんけどw
Avatar
Dispatch is not supported on WASI, and only Unix domain sockets are supported, which means we have to exclude those APIs on this platform. There's work in progress to enable tests for this on C...
2:17 PM
第一弾
Avatar
omochimetaru 4/3/2024 2:17 PM
あ〜そういうところからか
Avatar
でも真面目な話Wasmで自立httpサーバはいろんな関係者にモチベがあるんで遠くないと思います (edited)
Avatar
omochimetaru 4/3/2024 2:19 PM
swift-nioってこれまではDispatchがいつも合ったのか
Avatar
なのであとちょっと🤏
2:19 PM
Dispatchがいつまでもあると思うなよ😤
Avatar
omochimetaru 4/3/2024 2:20 PM
Dispatchはなんかif canimportで潰してるだけであんまり大変なことにはなってなさそうだ
2:25 PM
2:25 PM
なんかXcode15.3が、ちゃんと6.0.0-devになってるsnapshotツールチェーンを設定していても、
2:25 PM
Package.swiftのswift-tools-version バージョンチェックで死ぬのが直らない? (edited)
2:26 PM
まあ5.9って書いておくか・・・
Avatar
そこの二つは別のSwiftPMなんで…
Avatar
omochimetaru 4/3/2024 2:27 PM
やっぱここ切り替わってない?w
2:28 PM
ほんとだ、なんか落ちてきた
Avatar
ざんねんながら
Avatar
omochimetaru 4/3/2024 2:28 PM
Xcodeならまあそうだろうなという感じのバグだ
2:32 PM
hot reloadが動いた
2:35 PM
そうなるのか!
Avatar
ヘッドレスブラウザモードもある
Avatar
omochimetaru 4/3/2024 2:36 PM
これはどうなってんだ、ブラウザ上でwebsocketをcarton cliに繋いで、xctestの出力を飛ばしてるのか
Avatar
そうそう
Avatar
omochimetaru 4/3/2024 2:37 PM
--headless When running browser tests, run the browser in headless mode おー
2:37 PM
Launch WebDriver executable: /System/Cryptexes/App/usr/bin/safaridriver Error: httpError("{\"value\":{\"error\":\"session not created\",\"message\":\"Could not create a session: You must enable the \'Allow Remote Automation\' option in Safari\'s Develop menu to control Safari via WebDriver.\",\"stacktrace\":\"\"}}") error: Plugin ended with exit code 1
2:38 PM
なんか惜しいな JSONの中に指示が書いてあるぞ
2:39 PM
これかな
Avatar
ですねSafariだとそれ必要
Avatar
omochimetaru 4/3/2024 2:40 PM
Error: bind(descriptor:ptr:bytes:): Address already in use (errno: 48) error: Plugin ended with exit code 1
2:40 PM
惜しい
Avatar
へーswift-nioのwasi対応進んでるんですね
2:41 PM
いつかのissueで出来たら嬉しいけど現状とても困難みたいなこと言われてた気がするけど、だいぶ進んだな
Avatar
Avatar
omochimetaru
Error: bind(descriptor:ptr:bytes:): Address already in use (errno: 48) error: Plugin ended with exit code 1
最近直したけどまだリリースしてなかったかも
Avatar
Avatar
Yuta Saito
最近直したけどまだリリースしてなかったかも
omochimetaru 4/3/2024 2:41 PM
他にサーバ立ってないか探してるけど、バグなの
Avatar
いったんkillall safaridriverで
Avatar
omochimetaru 4/3/2024 2:42 PM
ほうほう (edited)
2:42 PM
おお!できた!
2:43 PM
あれ、また壊れた - checking WebDriver endpoint: WEBDRIVER_REMOTE_URL - checking WebDriver executable: WEBDRIVER_PATH - checking WebDriver executable in PATH: chromedriver, geckodriver, safaridriver, msedgedriver Launch WebDriver executable: /System/Cryptexes/App/usr/bin/safaridriver Error: httpError("") error: Plugin ended with exit code 1
Avatar
できたー
2:44 PM
だめじゃん
Avatar
omochimetaru 4/3/2024 2:44 PM
3回ぐらいできたんだけど
2:44 PM
これになった
2:45 PM
むむ 色々殺したけど直らん
Avatar
なんかsafaridriver死にきらないことあるんですよね
Avatar
omochimetaru 4/3/2024 2:45 PM
- checking WebDriver executable in PATH: chromedriver, geckodriver, safaridriver, msedgedriver
2:45 PM
chromeとか書いてあるけどsafari以外もできるの? (edited)
Avatar
いろいろできる
Avatar
omochimetaru 4/3/2024 2:46 PM
へー これ標準化?されてるのか
Avatar
WebDriverってやつに準拠してるやつならドライバ指定したらいい感じに動くはず
Avatar
omochimetaru 4/3/2024 2:46 PM
知らなかった
2:47 PM
そして全然直らないw
2:47 PM
safariってついてるプロセス全部殺した
2:47 PM
mac再起動してみるか
Avatar
cartonってついてるプロセスも
Avatar
omochimetaru 4/3/2024 2:47 PM
2:47 PM
なるほど
2:47 PM
いないわ
Avatar
あらー
Avatar
omochimetaru 4/3/2024 2:51 PM
2:51 PM
macOS再起動したらまた動いた
Avatar
じゃあやっぱりなにかプロセス残ってるんだろうなぁ
Avatar
omochimetaru 4/3/2024 2:54 PM
2:55 PM
撮影してみた
Avatar
うーん手元で沢山走らせてみてるけど再現しないなぁ
Avatar
omochimetaru 4/3/2024 2:55 PM
ヘッドレスモードって書いてるけど普通に立ち上がって、 ただアドレスバーがオレンジ色になっていて、 そして閉じてるな
2:55 PM
これはそういうもん?
Avatar
WebDriverはそういうもんですね
naruhodo 1
Avatar
Avatar
Yuta Saito
うーん手元で沢山走らせてみてるけど再現しないなぁ
omochimetaru 4/3/2024 2:55 PM
QTで録画しようとしたことで何かが壊れたのかと思ったけどそうでもなかった
Avatar
あ、再現した
Avatar
omochimetaru 4/3/2024 2:56 PM
おお
Avatar
40回目でついに
Avatar
omochimetaru 4/3/2024 2:56 PM
よく数覚えてたね
Avatar
for i in $(seq 1 100); do echo "$i'th try...."; swift run carton test --environment browser --headless; done
Avatar
omochimetaru 4/3/2024 2:57 PM
賢かった
2:57 PM
じゃあ負荷とか運とかなのかこれ
2:57 PM
そこからの復活方法がわかると助かるが・・・ (edited)
Avatar
killall safaridriverとSafari.appのquiteで復活した
Avatar
omochimetaru 4/3/2024 2:59 PM
carton dev とか carton test が、 ツールチェインの選択とか、ビルドするときに走らせてるswiftのビルドコマンドがどうなってるかって、 どこでわかったり、コントロールできる?
Avatar
Avatar
Yuta Saito
killall safaridriverとSafari.appのquiteで復活した
omochimetaru 4/3/2024 2:59 PM
えーマジか 同じことやったつもりだった
Avatar
Running "..."で大まかなコマンドは表示されてて、
tashikani 1
Avatar
omochimetaru 4/3/2024 3:00 PM
何がコントロール可能で何がcarton managedなのかがまだよくわからない
Avatar
SwiftPM Plugin配下で実行されてる細かいやつはそこに出てるswift package コマンドを swift package --verboseに変えて実行すると詳細なログ出てきます
Avatar
omochimetaru 4/3/2024 3:02 PM
なるほど
3:02 PM
webpack.config.js とか vite.config.js tsconfig.json みたいなものはないの?
3:02 PM
a smooth zero-config experience
って書いてあるけど・・・
Avatar
ユーザに自由度をもたせると大変なのでcartonのレイヤでは提供してません
Avatar
omochimetaru 4/3/2024 3:03 PM
ワオー
Avatar
もっとコントロールが欲しいパワーユーザはSwiftPMを直接使いましょうという割り切り
3:04 PM
でもテストランナーとかは便利なんでビルドと切り離してスタンドアロンで使うオプションがある
3:04 PM
結局大して設定したいこと無いんで
Avatar
omochimetaru 4/3/2024 3:04 PM
$ swift run carton bundle After stripping debug info the main binary size is 20.80 MB Running... wasm-opt -Os --enable-bulk-memory /Users/omochi/work/swiftwasm/MyApp/Bundle/main.wasm -o /Users/omochi/work/swiftwasm/MyApp/Bundle/main.wasm Process failed and produced following output: Warning: wasm-opt failed to optimize the binary, falling back to the original binary. If you don't have wasm-opt installed, you can install wasm-opt by running `brew install binaryen`, `apt-get install binaryen` or `npm install -g binaryen` Copying resources to /Users/omochi/work/swiftwasm/MyApp/Bundle/JavaScriptKit_JavaScriptKit.resources Bundle generation finished successfully could not find executable for 'wasm-opt'
3:05 PM
あ、wasm-optがないだけか
Avatar
Avatar
Yuta Saito
結局大して設定したいこと無いんで
omochimetaru 4/3/2024 3:05 PM
とりあえずswift-5.9.2が勝手に選択されたところが一番気になった (edited)
3:05 PM
例えばsnapshotのswiftを使いたいなどがありそう
Avatar
そこは.swift-versionファイルで申し訳程度の制御はできる。
Avatar
omochimetaru 4/3/2024 3:06 PM
確かに、コンパイルオプションはPackage.swiftの方で書けるな
Avatar
だがそもそもツールチェインインストール部分を使わずにSwiftPMプラグインを直接叩く場合ツールチェインの選択二関しては完全なコントロールが手に入る
Avatar
omochimetaru 4/3/2024 3:07 PM
/** Infer `swift` binary path matching a given version if any is present, or infer the version from the `.swift-version` file. If neither version is installed, download it. */ public func inferSwiftPath( from versionSpec: String? = nil, _ terminal: InteractiveWriter ) async throws -> (AbsolutePath, String) { この辺だな
Avatar
Avatar
Yuta Saito
だがそもそもツールチェインインストール部分を使わずにSwiftPMプラグインを直接叩く場合ツールチェインの選択二関しては完全なコントロールが手に入る
omochimetaru 4/3/2024 3:07 PM
なるほどなるほど
3:07 PM
そのあたりのコマンドやプラグインの全容はどこ読めばわかるん
3:08 PM
今の所READMEの次に読むべきやつがわからないw (edited)
Avatar
さっきのプルリクが一番詳しいかもしれない
Avatar
omochimetaru 4/3/2024 3:08 PM
なるほどw
3:09 PM
じゃああとはcartonのソース読んだ方が早そうだな
Avatar
この辺はもうだいぶ分かってる人しか気にならないポイントなんで、そういう人は自分で調べられる
Avatar
omochimetaru 4/3/2024 3:10 PM
調べる前に「ドキュメントがない」ことが悪魔の証明なのがちょっとつまづいたかも
Avatar
なるほど、どこかにちゃんとしたドキュメントが存在するかもしれない可能性が捨てきれないのかw
Avatar
omochimetaru 4/3/2024 3:11 PM
そうそう。
3:12 PM
swiftwasm bookの方もあるから余計にね
3:14 PM
No longer directly depend on SwiftPM as a library. This means that carton no longer has to be updated when SwiftPM is updated (hopefully).
でけえw
3:14 PM
3:15 PM
swiftpmとvaporに依存してたのすごいなww
Avatar
Avatar
Yuta Saito
cartonは最近超薄くなりました
omochimetaru 4/3/2024 3:15 PM
cartonは最近超薄くなりました
思ったよりダイエットしてた
Avatar
Avatar
omochimetaru
そうそう。
足してみた
Avatar
omochimetaru 4/3/2024 3:16 PM
いいね!!
Avatar
tools-support-coreの依存を外すのが超大変だった
Avatar
omochimetaru 4/3/2024 3:17 PM
このへんか
Avatar
Vapor外すのはNIOちょろっと使えばいいだけだからそこまで難しくない
Avatar
omochimetaru 4/3/2024 3:18 PM
おーー
3:18 PM
Vapor.Application が消えて、生の channel が生えてる。 (edited)
3:19 PM
はいはいはい
3:20 PM
直nioいいね
3:22 PM
channelReadでHTTPRequest受け取るのこんな感じになるのかー
3:22 PM
NIOHTTP1モジュールでほんとに最低限はいけるんだね
3:23 PM
let response: StaticResponse do { switch head.uri { case "/": response = try respondIndexPage(context: context) case "/main.wasm": response = StaticResponse( contentType: "application/wasm", body: try context.channel.allocator.buffer( bytes: localFileSystem.readFileContents(configuration.mainWasmPath).contents ) ) default: guard let staticResponse = try self.respond(context: context, head: head) else { self.respond404(context: context) return } response = staticResponse } } catch { configuration.logger.error("Failed to respond to \(head.uri): \(error)") response = StaticResponse( contentType: "text/plain", body: context.channel.allocator.buffer(string: "Internal server error") ) } self.responseBody = response.body ルーティングw
Avatar
SSL不要にできるだけでもだいぶビルド時間減るんですよね
3:23 PM
魂の手書きルーティング
Avatar
omochimetaru 4/3/2024 3:23 PM
わかる! >SSL
3:23 PM
あれがだるいんよ
3:24 PM
HTTPSはELBで終端してるからそもそも要らないし・・・ 外向きには必要だけど
3:25 PM
Xcode15.3になる前は Internal Inconsistency 何たらが出るたびにCNIOBoringSSLをフルビルドしてて終わってた
Avatar
BoringSSL何回もビルドしないといけない問題とビルド信頼性の無さで爆発 🤯
Avatar
omochimetaru 4/3/2024 3:27 PM
うむ
3:27 PM
あ、carton bundleいけた
3:27 PM
binaryan入れるだけでした
Avatar
brew配布の1個良かった点はそういう外部依存を記述できたところですね
3:29 PM
まあ逆に必要になったときに入れてもらうというモデルが出来なかったので一長一短ではあるが
Avatar
omochimetaru 4/3/2024 3:31 PM
いやーホスト環境の大きめの2次依存物が管理しづらいんだよね
3:31 PM
俺はこの方が全然いい
3:31 PM
忘れた頃にこのbinaryanを入れたのは誰じゃってなる
Avatar
まーbrewはそこ弱いですよね〜
Avatar
omochimetaru 4/3/2024 3:32 PM
なんかその辺調べる機能もしょぼい気がしてる 知らんだけかもしれないけど
3:32 PM
バンドルされたJS見てるんだけど最低限のコメント除去とか結合とか
3:32 PM
これはWasmTransformerがやってる?
Avatar
esbuildで処理したやつをリポジトリに埋めちゃってます
3:34 PM
WasmTransformerはJSは処理しない
Avatar
omochimetaru 4/3/2024 3:34 PM
entrypoint/bundle.js を加工して埋めてるわけじゃない?
Avatar
bundle.jsをesbuildでバンドルして埋めてる
Avatar
omochimetaru 4/3/2024 3:36 PM
あー理解しました
3:36 PM
そもそも carton/package.json が居るのか
Avatar
そうそう。
Avatar
omochimetaru 4/3/2024 3:37 PM
npmは使ってないような気がしていたわ
3:37 PM
dev server自分で立てるぐらいだから。
3:38 PM
import ReconnectingWebSocket from "reconnecting-websocket";
3:38 PM
そうかーこういう js側のcarton runtime libの実装のために使うのか (edited)
Avatar
ユーザの環境では必要ないしnpmパッケージとして配布してるわけでもないけど、開発者はちょっと使う
Avatar
omochimetaru 4/3/2024 3:40 PM
3:40 PM
最後の行だけガビガビなのなんだ
Avatar
コンテンツ本体はバイトリテラルにするとビルド時間が洒落にならないんでbase64 (edited)
Avatar
omochimetaru 4/3/2024 3:42 PM
むむっ
3:42 PM
// Base64 is not an efficient way, but too long byte array literal breaks type-checker let hashesFileContent = """ import CartonHelpers \(hashes.map { """ public let \($0)EntrypointSHA256 = ByteString([ \(arrayString(from: $1)) ]) """ }.joined(separator: "\n\n")) public let staticArchiveContents = "\(staticArchiveContents.withData { $0.base64EncodedString() })" """
3:43 PM
これは・・・?WASMになるSwiftに埋め込まれてる?
Avatar
cartonに埋め込まれてる
3:44 PM
carton bundleするときにファイルに書き出してるだけ (edited)
3:45 PM
entrypoint/*.js に更新があったら開発者がコード生成してそのファイル更新するというとんでもない運用
Avatar
omochimetaru 4/3/2024 3:46 PM
誰をなんの変更から守ってるんだ?
3:46 PM
まだわかってない
Avatar
いやあこれ分かりにくいよなぁ
Avatar
omochimetaru 4/3/2024 3:48 PM
3:48 PM
わかったかも
3:48 PM
いやわからん
Avatar
エントリポイントの.jsファイルはいくつか依存パッケージがあるんで1枚のJSファイルにバンドルしておきたい。
🆗 1
3:49 PM
バンドルされたJSファイルはcartonといっしょに配布したい
🆗 1
3:51 PM
cartonコマンドのStaticArchive.swiftにはバンドルされたJSファイルを埋め込んでる
3:52 PM
carton bundleコマンドは埋め込まれたJSファイルを ./Bundle に書き出す
Avatar
omochimetaru 4/3/2024 3:53 PM
あーー
3:53 PM
あーごちゃごちゃになってた場所がわかった
3:54 PM
npm経由でesbuildを叩くのは
3:54 PM
carton自体の開発環境で
3:54 PM
cartonを使うwasm appユーザの環境じゃないのか
Avatar
そのとおり
Avatar
omochimetaru 4/3/2024 3:55 PM
cartonを使う時は、carton bundleコマンドが、このbase64になってるWASIとかがくっついたbundle.jsを吐き出してるだけなのかw
3:56 PM
それって普通にcartonのswiftpm packageのresourceとして置いといてファイルとしてとって来れないんか? (edited)
Avatar
バイナリ配布時代の名残ですね
Avatar
omochimetaru 4/3/2024 3:56 PM
brewとかで配布するやつを、ディレクトリパッケージじゃなくて、ワンバイナリにしたかった?
Avatar
シングルバイナリで配ってたんでresourceはおけなかった
Avatar
omochimetaru 4/3/2024 3:56 PM
理解〜〜〜
Avatar
いまならembedなんちゃらが使えるかもしれないけどあんまりあれの品質を信頼できてない
Avatar
omochimetaru 4/3/2024 3:57 PM
githubからダウンロードとかでもよかったような気がする
3:58 PM
コミットハッシュ指定+パス指定で落とす
Avatar
昔それやってたんですけどリリースフローがクソめんどくさくなるんですよ
Avatar
omochimetaru 4/3/2024 3:58 PM
なるほど。
3:58 PM
確かに順序の問題が出ちゃうな
Avatar
まあ今ならもう少しシンプルな方法があるはず
Avatar
omochimetaru 4/3/2024 3:59 PM
GitHub Actionで生成してGitHub の release Artifactとして配布する?
Avatar
Avatar
omochimetaru
GitHub Actionで生成してGitHub の release Artifactとして配布する?
ああ、実際にやってたのはこれだな
Avatar
omochimetaru 4/3/2024 3:59 PM
それでも大変なもんか なるほど
3:59 PM
とりあえず staticArchiveContents はわかったぞ (edited)
3:59 PM
devEntrypointSHA256 は・・・?
4:00 PM
let staticArchiveContents = try localFileSystem.readFileContents( AbsolutePath( validating: "static.zip", relativeTo: localFileSystem.currentWorkingDirectory! ))
4:00 PM
これzipなのか
Avatar
それもうzipである必要ないんだよなー
Avatar
omochimetaru 4/3/2024 4:01 PM
zipが丸ごとbase64で staticArchiveContents に入ってて解凍して出てくる dev.js のハッシュをチェックする? (edited)
Avatar
あとそれを ~/.carton/staticに展開するんだけど今となってはそれも必要ない気がする
Avatar
omochimetaru 4/3/2024 4:01 PM
あ、これは解凍すればわかるじゃん
Avatar
shaはインターネット経由でダウンロードしてた時代にマックスが一応チェックしとくかと入れたやつ
4:03 PM
それもいらないと思う
Avatar
omochimetaru 4/3/2024 4:03 PM
でけた
Avatar
Avatar
Yuta Saito
それもいらないと思う
omochimetaru 4/3/2024 4:03 PM
zip解凍時にダイナミックに壊れる可能性はなかなか無いよね
4:03 PM
ダウンロード時代の名残な訳か (edited)
Avatar
so (stack overflow) sanitizer.wasmももうwasi-libcにちゃんとしたサポート入れたからいらないな
4:04 PM
まだまだいらないものが沢山あるなーw
Avatar
omochimetaru 4/3/2024 4:05 PM
$ shasum -a 256 dev.js a8967c30e28b7a862c3548beedd9c62ee742a564bc373893154c45d98bafe4c9 dev.js public let devEntrypointSHA256 = ByteString([ 0xA8, 0x96, 0x7C, 0x30, 0xE2, 0x8B, 0x7A, 0x86, 0x2C, 0x35, 0x48, 0xBE, 0xED, 0xD9, 0xC6, 0x2E, 0xE7, 0x42, 0xA5, 0x64, 0xBC, 0x37, 0x38, 0x93, 0x15, 0x4C, 0x45, 0xD9, 0x8B, 0xAF, 0xE4, 0xC9 ])
4:05 PM
一致してた 理解したぞ
4:05 PM
ああそういうことか
4:06 PM
HashArchiveのロジックは、で、これを用意するためのユーティリティで、cartonの開発者が叩いてからコミットすると。
4:06 PM
これが carton-release パッケージに入ってることに気付くのが遅かった。。
Avatar
なるほどー
Avatar
omochimetaru 4/3/2024 4:09 PM
名前的に carton bundle の実行中に起きる何かかと思って見てた
Avatar
名前重要
Avatar
omochimetaru 4/3/2024 4:10 PM
いや〜だいたい色々わかったぞ ありがとうございます
4:10 PM
速習コースだった
4:11 PM
これを踏まえてライブラリの開発をどうやったらいいか考えるけど考えることがめちゃくちゃ多そう (edited)
4:11 PM
諸々のツールチェーンとかコマンドはあんまりつまづかなくて安定してると感じたし、swiftwasm布教ハンズオンとかがやれそうだと思った
Avatar
おー、よかったよかった
Avatar
Avatar
omochimetaru
これを踏まえてライブラリの開発をどうやったらいいか考えるけど考えることがめちゃくちゃ多そう (edited)
どのへんが難しそうすか?JS側から機能を注入する部分?
Avatar
Avatar
Yuta Saito
どのへんが難しそうすか?JS側から機能を注入する部分?
omochimetaru 4/3/2024 4:16 PM
まず考えてるのは、エンドユーザーがcarton以外の構成を選択する場合とかの考慮っすね
4:16 PM
carton提供の index.html を置き換える、ぐらいしか多分カスタムがないから (edited)
4:16 PM
例えばうちの業務でフロントをswiftwasmで書くとしたら色々ハマらなくて
4:17 PM
で、そういう様々なアプリケーションからswift-reactを依存して使うときに何がユーザ側の責任になるかなあとか
Avatar
難しいな、どこまでをcartonに任せるかだなぁ
Avatar
omochimetaru 4/3/2024 4:18 PM
cartonやらないってなった瞬間に自分でやることが結構多いから (edited)
4:19 PM
あとaudio-exampleのexpose/externの方式とかもあるし・・・ (edited)
4:19 PM
あとは単純に、swift-reactの自動テストとかサンプルデモ実装とかは
4:19 PM
index.html自体がたくさん欲しいよね
4:19 PM
これもcartonにはまらなそうだけどcarton testは使いたい
4:20 PM
一個のindex.html+一個のbundle.wasmだと、ビルドとしては1つしかないけど、 ライブラリとしてはいろんなビルドをたくさんexampleとして用意したい
Avatar
真面目なアプリケーションを書こうと思うと大抵既存のJSエコシステムの上でSwiftの.wasmバイナリを消費する形になるんだけど、現状のcartonだと消費する方法が固定なのでフィットしない。
Avatar
omochimetaru 4/3/2024 4:21 PM
そうそう。Tokamakみたいなアプローチだったらシンプルなんだけど
4:21 PM
俺がやりたいのは逆で
4:21 PM
JS/HTMLの基盤の上で追加的にswiftwasmを入れていくような状況を考えたい
Avatar
Rustのwasm-packみたいに./Bundleをnpm packageとして出力してJS側からimportできるようになると良いのでは
4:22 PM
あれはそれなりに上手く行ってるモデルなので真似するのは悪くないと思う
Avatar
omochimetaru 4/3/2024 4:23 PM
なるほど そういうのがあるのか
4:23 PM
Avatar
前者はだいたいTokamakとcartonで達成できてる
4:24 PM
後者は可能だけどとたんに難易度が上がる
4:24 PM
このギャップを埋めたい
Avatar
omochimetaru 4/3/2024 4:25 PM
あと、JavaScriptKitを組み込むところも考え中
Avatar
うちは僕が居るから後者が可能だけど、スケールしないからやはり後者の難易度を下げるのは普及にあたって必須だな
Avatar
omochimetaru 4/3/2024 4:26 PM
cartonベースのプロジェクトで使うライブラリだったらJSKがもう使える状態が前提になってシンプルそうだ
Avatar
Avatar
Yuta Saito
うちは僕が居るから後者が可能だけど、スケールしないからやはり後者の難易度を下げるのは普及にあたって必須だな
omochimetaru 4/3/2024 4:27 PM
この辺りの標準化難しそうだ
4:28 PM
なまじ初期状態が何もない自由な世界だから
4:28 PM
便利なツールが出てくると、今度は逆にみんながそれに乗ってないと困るみたいなロックインが起きそう (edited)
4:29 PM
Rust のコードがあれば、それを WebAssembly (Wasm) にコンパイルすることができます。このチュートリアルでは、Rust プロジェクトを WebAssembly にコンパイルし、既存のウェブアプリケーションで使用する方法を示します。
Avatar
./Bundle/index.mjsがこんな感じになってると良いのかな import { SwiftRuntime } from "./JavaScriptKit_resource/index.mjs" export function init() { const importObject = { javascriptkit: SwiftRuntime.importObjects } const { instance } = await WebAssembly.instantiate(..., importObject) return instance.exports }
Avatar
omochimetaru 4/3/2024 4:30 PM
wasm-packでRustパッケージがnpmパッケージになる方向はわかりやすいけど
4:30 PM
ここはどうなってるんだ?
4:30 PM
Rustコードがexternでリンクを要求しているシンボルを
4:30 PM
wasm instanceをロードするときに渡してあげる人が必要だよね
Avatar
#[wasm-bindgen]はマクロになっていて
4:31 PM
展開すると @_extern(wasm) てきなものになる
4:32 PM
ついでにマクロ展開中に特別なメタデータをオブジェクトファイルに含めるようにしてて
Avatar
omochimetaru 4/3/2024 4:32 PM
このパッケージされた init() が、jsのネームスペースからシンボルを集める?
Avatar
Avatar
Yuta Saito
ついでにマクロ展開中に特別なメタデータをオブジェクトファイルに含めるようにしてて
omochimetaru 4/3/2024 4:32 PM
ほうほう
Avatar
cargoがビルドプロセスを終えたあとに成果物の.wasmからメタデータを取り出してそれを元に JS側から WebAssembly.instantiatealert を渡すJSグルーコードを生成する (edited)
Avatar
omochimetaru 4/3/2024 4:33 PM
alert とかは JSのグローバルネームスペースが前提になってる?
Avatar
そのはずですね
4:34 PM
なのでグローバルから辿れるものしか直接 extern 宣言できない
4:34 PM
のではないかな?
Avatar
omochimetaru 4/3/2024 4:34 PM
なるほどなあ
Avatar
そのinit関数の引数として取ってユーザに注入させるというのもできると思う
Avatar
Avatar
Yuta Saito
cargoがビルドプロセスを終えたあとに成果物の.wasmからメタデータを取り出してそれを元に JS側から WebAssembly.instantiatealert を渡すJSグルーコードを生成する (edited)
omochimetaru 4/3/2024 4:35 PM
.wasm からメタデータを取り出すのちょっと面白いな
4:35 PM
あ、でもそうしておくとDCEとかと連動するのか
Avatar
そうそう。既存のビルドパイプラインに乗ってて賢いなと思った
Avatar
omochimetaru 4/3/2024 4:36 PM
そうかも・・・
Avatar
まだまだ改善スペースはたくさん!
Avatar
Avatar
Yuta Saito
./Bundle/index.mjsがこんな感じになってると良いのかな import { SwiftRuntime } from "./JavaScriptKit_resource/index.mjs" export function init() { const importObject = { javascriptkit: SwiftRuntime.importObjects } const { instance } = await WebAssembly.instantiate(..., importObject) return instance.exports }
omochimetaru 4/3/2024 4:39 PM
これは良さそうね。 今はJSKitとWASIの注入と実行が一塊に実装されてるから、ユーザがカスタム介入する余地がない まあcartonがそうだからそうだけど
4:40 PM
あ、あとまだよくわかってないところで
4:40 PM
4:40 PM
これが
4:40 PM
やったらできるよみたいな追加的な話?なのが気になっていて
4:41 PM
このセットアップも誰がどう責任を持つ体系になるんだろう
Avatar
デフォルトではSwiftのプロセスで完結したイベントループになってるんだけど、それやるとJavaScriptのイベントループと協調するようになる
Avatar
omochimetaru 4/3/2024 4:42 PM
デフォルトではSwiftのプロセスで完結したイベントループ
それって誰が回すんだ?
Avatar
JavaScriptの環境で動かすことを前提にするのであればオンにして不利益はあんまりないと思う
4:42 PM
main()関数が全てのjobを処理し終わるまで返ってこない
Avatar
omochimetaru 4/3/2024 4:42 PM
main で dispatchMain に自分で突入する?
Avatar
そんなかんじです
Avatar
omochimetaru 4/3/2024 4:48 PM
cartonのentrypointのjsを細切れに再利用できると便利そうだなあ と思って見てた 一応 common.js がライブラリっぽくなっているね
4:51 PM
よし寝ます、どうもありがとう
Avatar
cartonなくてもビルドはそんなに難しくないけど、謎のおまじない的なオプションをちょっと追加するのがネックだし、js側のブートストラップをしてくれるのが便利で、しかしこれだと
JS/HTMLの基盤の上で追加的にswiftwasmを入れていくような状況を考えたい
という場面で使いづらいので、やっぱりライブラリモードは欲しいですね
Avatar
omochimetaru 4/4/2024 12:27 AM
絶妙なそんなに難しくないけどちょっとめんどくさい感
Avatar
wasm-optとwasm-stripはSwiftPMで出荷されてる版のパッケージがあってもいいかもしれない?
Avatar
omochimetaru 4/4/2024 12:33 AM
確かに
12:34 AM
swift tool -p wasm-opt // パスが出る swift tool wasm-opt wasm-opt コマンドの代わり
12:34 AM
こういう感じで、システムインストールと共存してほしい
12:34 AM
xcrun とかでもうそういう仕組みがあるか
Avatar
あーそこまでは考えてなくて、単にartifactbundleでexecutable落としてくるパッケージ作るくらいで考えてました
Avatar
omochimetaru 4/4/2024 12:40 AM
そういうのやると $ swift package wasm-opt で使えるんだっけか
Avatar
そうですね。あるいは、既存プラグインの中からwasm-optを呼び出せる
Avatar
omochimetaru 4/4/2024 12:42 AM
それでよさそうだ
Avatar
Avatar
Iceman
wasm-optとwasm-stripはSwiftPMで出荷されてる版のパッケージがあってもいいかもしれない?
wasm-stripはWasmTransformerが同じことできるので置き換えられるかも。wasm-opt、というかbinaryenはそれなりに大きいんだよなぁ
Avatar
omochimetaru 4/4/2024 5:05 AM
どのくらい大きいの?
5:05 AM
現代ではプロジェクトごとにtypescript compilerをインストールしたりするし、割と許されそうなイメージだ
Avatar
artifactbundleのビルドをメンテするのが大変そうだなと思うレベルのおおきさ (edited)
Avatar
binaryenの中でwasm-optのbinだけを取り出して再パッケージのイメージでいました
5:07 AM
成果物は配布されてるので、binをartifactbundleの形式にディレクトリ構造を入れ替えるだけのイメージ
5:08 AM
1つ1MBくらいなので、全環境分でも4MBくらい?
Avatar
そもそもartifactbundleはホストプラットフォームサポートが限定されちゃうんであんまりやりたくないんですよねぇ
5:08 AM
あれはサポートされてるプラットフォームだけプレビルドみたいなことできるんだっけ
Avatar
限定されちゃうのはそうですね。されてないやつは別途ソースからビルドする方法を提供するとかは(凝ったPackage.swiftを書くとかでない限り)ないです
5:09 AM
binaryenをソースからビルドする方法を提供するのは厳しそうですね
Avatar
omochimetaru 4/4/2024 5:10 AM
ふーむ
Avatar
https://github.com/WebAssembly/binaryen/releases ここに書いてあるプラットフォームしかサポートされない
Avatar
そこのバイナリはあんまり使いたくないなぁ
Avatar
omochimetaru 4/4/2024 5:11 AM
binaryenをswiftpmでコンパイルできないか?
Avatar
頑張るとできるとおもう
Avatar
omochimetaru 4/4/2024 5:12 AM
wasmバイナリ用のツールだからそんなにホストOSに依存した機能無さそう
Avatar
毎回ビルドするのはちょっと躊躇われるくらいのビルド時間ですね
Avatar
omochimetaru 4/4/2024 5:12 AM
ウーム
Avatar
そうですね。ユーザが毎回ビルドするのはつらいし、SwiftPMのビルド構成をメンテナンスするのも大変そうです (edited)
Avatar
Emscripten経由のnpmパッケージが配布されてて、今のところそれが一番ポータブル
Avatar
Toolchains using Binaryen as a component (typically running wasm-opt) include: Emscripten (C/C++) wasm-pack (Rust) J2CL (Java; J2Wasm) Kotlin (Kotlin/Wasm) Dart (Flutter)
Avatar
omochimetaru 4/4/2024 5:14 AM
ややこしw
Avatar
って書かれてるけど、これらはどうやってwasm-optをひっぱってきてるんでしょうね
Avatar
Emscriptenは自分でビルド、wasm-packはGitHub Releasesからダウンロード、ほかはわからない
5:18 AM
うーんサポートされてるプラットフォームならcartonが外からダウンロードしてくるのが良いのかなぁ
5:20 AM
でもそもそもwasm-optは必ず適用しないといけないわけじゃないので、cartonがwasm-opt見つからないときに失敗するのがよくないな。
Avatar
まあ確かに、サポートされないプラットフォームならスキップでもいいですね
5:21 AM
結構サイズ変わるので目立たせてはあげたいので、warning出すくらいで良さそう
Avatar
サイズなぁ
5:23 AM
SwiftPMのオブジェクトリンクを辞めさせてアーカイブリンクにすればwasm-optが削ってる大半の部分はリンク時に削れるはずなんだけど、手が足りない
5:24 AM
ワーニング出してあげるのは現状だと正しいと思います
Avatar
Avatar
Yuta Saito
SwiftPMのオブジェクトリンクを辞めさせてアーカイブリンクにすればwasm-optが削ってる大半の部分はリンク時に削れるはずなんだけど、手が足りない
omochimetaru 4/4/2024 5:25 AM
それはめっちゃシンプルでいいね
5:26 AM
逆にbinaryenにはないリンク事最適化があったりしうる?
Avatar
いっぱいある
Avatar
omochimetaru 4/4/2024 5:28 AM
LLVMベースだからそうだよね
Avatar
omochimetaru 4/4/2024 12:44 PM
[omochi@omochi-mbp Toolchains]$ ls -al total 0 drwxr-xr-x 5 omochi staff 160 4 3 23:28 . drwxr-xr-x 8 omochi staff 256 4 3 20:52 .. drwxr-xr-x 7 omochi staff 224 4 3 20:52 swift-DEVELOPMENT-SNAPSHOT-2024-04-02-a.xctoolchain lrwxr-xr-x 1 omochi staff 79 4 3 23:28 swift-latest.xctoolchain -> /Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain drwxr-xr-x 7 omochi staff 224 4 3 23:28 swift-wasm-5.9.2-RELEASE.xctoolchain
12:45 PM
cartonがtoolchainをインストールしたときに
12:45 PM
マシンの swift-latest の向き先を変更された気がする
Avatar
そうそう、それあんまり望んだ動きじゃない気がするんだけど、swift.org/download のツールチェインがやってるんでそのままにしてる
Avatar
omochimetaru 4/4/2024 12:48 PM
ああ、あのインストーラみたいなやつか
Avatar
cartonが、というより.pkg インストーラがやるんですよね
Avatar
omochimetaru 4/4/2024 12:48 PM
そうそう、それ。よくわかってない
12:48 PM
確かに・・・cartonは余計なことを、むしろしていないだけか
Avatar
素朴にインストーラを実行してるだけである
Avatar
Avatar
Yuta Saito
でもそもそもwasm-optは必ず適用しないといけないわけじゃないので、cartonがwasm-opt見つからないときに失敗するのがよくないな。
(ひょっとしたらツールチェーンとコードと Wasm ランタイムの組み合わせ次第のバグだったかもしれなくてちゃんと検証していないんですが) 以前は swift-format.wasm をビルドして実行していた時に wasm-opt を適用しておかないと実行できないこととかがありました. (edited)
Avatar
omochimetaru 4/4/2024 1:51 PM
動的なPackage.swiftでめっちゃハマってた
1:51 PM
condition: .when(platforms: []) は、SwiftPMレベルでは、 条件なし と 空の条件が区別されるようになっているので、 空の条件 => いかなるOSでも false と設定できるような雰囲気があるが (edited)
Avatar
Avatar
kebo
(ひょっとしたらツールチェーンとコードと Wasm ランタイムの組み合わせ次第のバグだったかもしれなくてちゃんと検証していないんですが) 以前は swift-format.wasm をビルドして実行していた時に wasm-opt を適用しておかないと実行できないこととかがありました. (edited)
localsの数の制限とかですかねー?
Avatar
Avatar
Yuta Saito
localsの数の制限とかですかねー?
確かにその辺のエラーだった記憶があります (曖昧)
Avatar
Avatar
omochimetaru
condition: .when(platforms: []) は、SwiftPMレベルでは、 条件なし と 空の条件が区別されるようになっているので、 空の条件 => いかなるOSでも false と設定できるような雰囲気があるが (edited)
nilと[]が区別されます (edited)
Avatar
Avatar
Yuta Saito
nilと[]が区別されます (edited)
omochimetaru 4/4/2024 1:53 PM
されてなくない?
1:53 PM
assignment.conditions = self.buildConditions(from: setting.condition) この左辺の型は non optional で区別できてなさそうなんだよね
1:54 PM
なので 「いかなるOSでもfalse」のつもりが、「無条件つまりどんなOSでもtrue」に反転する (edited)
Avatar
あれ、そっちに倒れるのか
Avatar
omochimetaru 4/4/2024 1:55 PM
そうとしか思えない現象が起きてるけど
1:55 PM
xcodeくんがリフレッシュしてない可能性と戦いながらだからちょっと不安
Avatar
omochimetaru 4/4/2024 2:03 PM
あれ、このレベルでもう潰れてたのか
2:04 PM
その先のシリアライズで空のplatformsとnilのplatformsを区別してそうだったけど名残で
2:04 PM
whenの呼び出し時点でcondition自体が消えるのか
Avatar
現状「いかなる OS でも false」をしたい時は custom で絶対に来ないであろう String を指定するなど...? .when(platforms: [.custom("")])
Avatar
omochimetaru 4/4/2024 2:15 PM
conditionを設定しようとしてる .target ごと消すのが良いと思います
2:15 PM
でも .custom("xxx") もいけそうですね
Avatar
condition自体にnilを渡すことが出来ます
2:17 PM
.define("FOO", nil)
Avatar
omochimetaru 4/4/2024 2:17 PM
それは常に FOO が定義されるんじゃ?
Avatar
Avatar
Yuta Saito
condition自体にnilを渡すことが出来ます
ん?それってデフォルト値が nil なんで指定してないのと同じになりますよ
Avatar
ああ、逆をやりたいのか
Avatar
omochimetaru 4/4/2024 2:18 PM
そう。動的に「有効になるOS」の配列を構築しようとすると、空の時壊れる (edited)
Avatar
その場合そのアイテムを消すべきなのでは
2:19 PM
動的にやるべきではない
Avatar
omochimetaru 4/4/2024 2:19 PM
動的といっても let を読んでるだけなんだけどね
2:20 PM
Package.swiftソースとしては静的
2:20 PM
2:20 PM
この6行目をtrueにしたりfalseにしてリビルドしたい
Avatar
それって Package.swift では real target に [.wasi] と mock target に allPlatforms.except([.wasi]) を指定しておけば Bool のフラグなしで解決する話だったりはしないですか?(ビルド時のターゲット triple で切り替わる感じで) https://github.com/apple/swift-package-manager/issues/4479
Previous ID SR-13813 Radar rdar://problem/70999132 Original Reporter broadway_lamb (JIRA User) Type Improvement Status Resolved Resolution Done Additional Detail from JIRA Votes 1 Component/s Packa...
Avatar
Avatar
kebo
それって Package.swift では real target に [.wasi] と mock target に allPlatforms.except([.wasi]) を指定しておけば Bool のフラグなしで解決する話だったりはしないですか?(ビルド時のターゲット triple で切り替わる感じで) https://github.com/apple/swift-package-manager/issues/4479
omochimetaru 4/4/2024 2:28 PM
基本はそうなんですが、開発中において「あえて」macでも JavaScriptKit(real) を繋げたい時があります。
Avatar
あ,なるほど
Avatar
omochimetaru 4/4/2024 2:28 PM
理由は Xcode上で JavaScriptKitMock が real とAPI互換性があるかなどをチェックしたいから
Avatar
うむープラットフォーム条件だけでグラフが決まらないパターンかー
Avatar
omochimetaru 4/4/2024 2:33 PM
あと関係ないけどXcodeのcanImportは全然動かないことがわかった
2:33 PM
グラフとしてdependency (target.dependencies)を入れてなくても (edited)
2:34 PM
ターゲット (Package.targets)が定義されている からなのか、他の経路でビルドしたバイナリが中間場所に転がっているからなのか (edited)
2:34 PM
canImportがtrueになってしまってダメだった (edited)
2:34 PM
でもdependencyが入ってないからリンクエラー
2:34 PM
という状態になったりした
Avatar
canImportをそういう用途で使うためにはグラフをずっと固定しておく必要がある
Avatar
omochimetaru 4/4/2024 2:35 PM
そのようだね
2:35 PM
.define でフラグ定義して #if FLAG で制御するようにしたらうまくいった。
Avatar
omochimetaru 4/4/2024 2:57 PM
むむむ・・・
2:57 PM
cartonをプラグインとしては依存定義せずに
2:57 PM
別のところでチェックアウトしてbuildして、 .build/release にパスを通して 手元の場所で $ carton test してみたら
2:58 PM
[omochi@omochi-mbp swift-react (main *=)]$ carton test - checking Swift compiler path: /Users/omochi/.carton/sdk/wasm-5.9.2-RELEASE/usr/bin/swift - checking Swift compiler path: /Users/omochi/.swiftenv/versions/wasm-5.9.2-RELEASE/usr/bin/swift - checking Swift compiler path: /Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift Inferring basic settings... - swift executable: /Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift SwiftWasm Swift version 5.9.2 (swift-5.9.2-RELEASE) Target: arm64-apple-darwin23.1.0 Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" "plugin" "carton-test" "internal-get-build-command" "--output" "/var/folders/qw/myjd_8ld5lg9qg057bhm467c0000gn/T/carton-DfdnYH" error: Unknown subcommand or plugin name ‘carton-test’ Usage: swift package <options> <subcommand> See 'package -help' for more information.
2:58 PM
手元の場所で package carton-test を叩こうとして見つからないよとなってしまった
Avatar
CartonFrontendコマンド
Avatar
omochimetaru 4/4/2024 3:01 PM
3:04 PM
$ CartonFrontend test Error: Missing expected argument '--prebuilt-test-bundle-path <prebuilt-test-bundle-path>' Help: --prebuilt-test-bundle-path <prebuilt-test-bundle-path> Use the given bundle instead of building the test target Usage: carton test [--release] [--list] [<test-cases> ...] [--environment <environment>] [--headless] [--sanitize <sanitize>] [--port <port>] [--host <host>] --prebuilt-test-bundle-path <prebuilt-test-bundle-path> See 'carton test --help' for more information. このエラーは、わかるぞ
Avatar
cartonコマンドがツールチェインをインストールするところまでやって、CartonTestプラグインがビルドのトリガーとかビルド情報をかき集めてCartonFrontendを起動すると言う流れ
3:05 PM
なので、自分でビルドして必要な情報をCartonFrontendに渡せばスタンドアロンに一応動く
3:05 PM
devサーバだけはIPCしてるからスタンドアロンに動かすのはちょっと大変
Avatar
omochimetaru 4/4/2024 3:06 PM
ビルド方法がわかんなかったのでMyAppくんのログを見て盗む
Avatar
swift buildに対応するビルドコマンドはSwiftPMが出力しないからむずかしいな
Avatar
omochimetaru 4/4/2024 3:07 PM
Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "build" "--product" "MyAppPackageTests" "-Xswiftc" "-static-stdlib" "-Xswiftc" "-Xclang-linker" "-Xswiftc" "-mexec-model=reactor" "-Xlinker" "--export-if-defined=main" "--disable-build-manifest-caching" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/work/swiftwasm/MyApp/.build/carton"
3:07 PM
これじゃない?
Avatar
あれ出てるんだ
Avatar
omochimetaru 4/4/2024 3:08 PM
出てた
3:08 PM
"--scratch-path" "/Users/omochi/work/swiftwasm/MyApp/.build/carton" これは何?要る?
Avatar
ツールチェインのインストーラを動かさないならいらない
Avatar
omochimetaru 4/4/2024 3:09 PM
ほい
3:10 PM
-Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor
3:10 PM
これXフラグが2段奥に行くやつか?
Avatar
うむ
Avatar
omochimetaru 4/4/2024 3:13 PM
[omochi@omochi-mbp swift-react (main *=)]$ swift build --triple wasm32-unknown-wasi --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... In file included from /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [0/26] Write swift-version-37CF2ABA3CB73B3C.txt
3:13 PM
いけそうでいけないな --build-tests はダメかな
Avatar
which swift
Avatar
omochimetaru 4/4/2024 3:14 PM
[omochi@omochi-mbp swift-react (main *=)]$ which swift /usr/bin/swift [omochi@omochi-mbp swift-react (main *=)]$ swift --version Apple Swift version 6.0-dev (LLVM 3dd3bce1adb5b65, Swift 1f09be97a890c3e) Target: arm64-apple-macosx14.0 [omochi@omochi-mbp swift-react (main *=)]$ env | grep TOOLCHAINS TOOLCHAINS=org.swift.59202404021a
3:14 PM
4/2 snapshotでやろうとしてる
Avatar
それだとWASI向けstdlibが入ってないんで
Avatar
omochimetaru 4/4/2024 3:15 PM
なるほど・・・
Avatar
omochimetaru 4/4/2024 3:15 PM
cartonが用意した592wasmを使うべきか
Avatar
swift experimental-sdk install https://github.com/swiftwasm/swift/releases/download/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a-macos_arm64.artifactbundle.zip
Avatar
omochimetaru 4/4/2024 3:15 PM
おお
Avatar
か、cartonが入れた5.9.2を使うか
Avatar
omochimetaru 4/4/2024 3:16 PM
swift sdkだけ入れるのオシャレでいいな
3:16 PM
それをやってみよう
Avatar
最近配布し始めたやつだからまだ世界で数人しか使ってないとおもうw
Avatar
omochimetaru 4/4/2024 3:20 PM
これ(貼ってくれたGitHub URL)って一見swift(compiler)を配布してそうだけど (edited)
3:20 PM
swiftsdkを配布しているの?
Avatar
最新のartifactbundleにはコンパイラ入ってないです
Avatar
omochimetaru 4/4/2024 3:21 PM
あ 容量が全然違う
Avatar
stdlibだけ
Avatar
omochimetaru 4/4/2024 3:21 PM
artifactbundleがsdkで、pkgがtoolchain?
Avatar
超コンパクト
3:21 PM
そんなかんじです
Avatar
omochimetaru 4/4/2024 3:22 PM
[omochi@omochi-mbp swift-react (main *=)]$ swift experimental-sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm [omochi@omochi-mbp swift-react (main *=)]$ swift build --triple wasm32-unknown-wasi --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... In file included from /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [0/26] Write swift-version-37CF2ABA3CB73B3C.txt
3:22 PM
sdkは入ったっぽいけどダメだな 何か操作が足りないか (edited)
Avatar
--triple の代わりに --experimental-swift-sdk wasm32-unknown-wasi
Avatar
omochimetaru 4/4/2024 3:23 PM
なるほど。
3:24 PM
そのコマンド、swift build --help に出てこないな 裏技だ
Avatar
エクスペリメンタルなんで 😏
Avatar
omochimetaru 4/4/2024 3:25 PM
うおー いったー
3:25 PM
10.47 KB
Avatar
Avatar
omochimetaru
[omochi@omochi-mbp swift-react (main *=)]$ swift experimental-sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm [omochi@omochi-mbp swift-react (main *=)]$ swift build --triple wasm32-unknown-wasi --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... In file included from /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/omochi/swift-react/.build/checkouts/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [0/26] Write swift-version-37CF2ABA3CB73B3C.txt
このエラーは色んな人に聞かれた覚えがあるからFAQに載せておこう
Avatar
omochimetaru 4/4/2024 3:30 PM
あれえ
3:30 PM
[omochi@omochi-mbp debug (main *=)]$ CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser No prebuilt binary found at /Users/omochi/github/omochi/swift-react/.build/wasm32-unknown-wasi/debug/.build/debug/swift-reactPackageTests.wasm
3:31 PM
a
3:31 PM
いや、ミスった
3:31 PM
ブラウザ開いた
3:32 PM
何も起きない
3:33 PM
[omochi@omochi-mbp swift-react (main *=)]$ CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-05T00:31:29+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs 2024-04-05T00:32:20+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /apple-touch-icon.png 2024-04-05T00:32:20+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /favicon.ico 2024-04-05T00:32:20+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /apple-touch-icon-precomposed.png
3:33 PM
リソースは取りに行ったっぽい・・・
Avatar
あるぇー
3:34 PM
コマンドはあってそうなんだけど
Avatar
omochimetaru 4/4/2024 3:34 PM
ブラウザにもjsとかwasmとかロードされてるけど何も起きない感じだ
3:34 PM
ブレークしてみるか
3:36 PM
ここまでいってる
3:37 PM
MyAppと同じで --product を指定してやり直してみる
3:40 PM
MyAppPackageTests ってなんだ?そんなproductないのに通るな <name>PackageTests なのかな
Avatar
SwiftPMが勝手に定義するやつ
Avatar
omochimetaru 4/4/2024 3:40 PM
ああ、さっき俺が指定したのも swift-reactPackageTests.wasm だ。
3:41 PM
--build-tests の代わりに --product swift-reactPackageTests にしてみよう
Avatar
Avatar
Yuta Saito
SwiftPMが勝手に定義するやつ
omochimetaru 4/4/2024 3:41 PM
そういう仕組みなんすねえ
3:43 PM
同じ結果だ
3:43 PM
ブラウザは開いたし、wasmRunner.runまでは行くけど反応がない
Avatar
うーん、これ以上は多分それなりにデバッグが必要かなぁ
Avatar
omochimetaru 4/4/2024 3:46 PM
3:46 PM
wasi.startまで行ってた
3:46 PM
いったんcartonをプラグインで入れる方法でうまく行くか確認するか
3:46 PM
うまく行った回と差分がちょいちょいあるからな (edited)
Avatar
.wasmバイナリここに貼れます?
3:48 PM
貼れるけど、流石にこれだけで何かわかるもんですか
Avatar
どもども
3:49 PM
ああ、JavaScriptKitのjs側ランタイムが無いんだ
3:49 PM
えーと、
Avatar
omochimetaru 4/4/2024 3:49 PM
[CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs
落とせてそうだったけど
Avatar
それ落とせてますか?
3:50 PM
ブラウザ側のネットワークタブの方だとどうですか
3:50 PM
content-lengthあるし中身もあるよ
3:50 PM
これか!?
Avatar
うむー、.wasmの相対でみつけるようにしたんだったか
Avatar
omochimetaru 4/4/2024 3:50 PM
あ、違うか、これはCLI止めたからか
3:52 PM
$ swift run carton test --environment browser だといけた
3:52 PM
Build complete! (1.38s) 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs 2024-04-05T00:52:04+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm An error occurred: NotFoundError: The object can not be found here. error: Plugin ended with exit code 1
3:52 PM
テストはなんか落ちたけど
3:53 PM
NotFoundErrorってなんだ
Avatar
おー、じゃあCartonFrontendコマンドの差分を診てもらうのがいいかな
3:53 PM
JS側のエラーじゃないですか?
Avatar
omochimetaru 4/4/2024 3:53 PM
お、ほんとだ
3:54 PM
おーなんかDOMレンダリング成功してそう
3:54 PM
大文字小文字でエラーになってるけど
Avatar
Avatar
Yuta Saito
おー、じゃあCartonFrontendコマンドの差分を診てもらうのがいいかな
omochimetaru 4/4/2024 3:55 PM
OK
3:56 PM
スタックトレースのwasm-function、普通にシンボル読めていいな (edited)
3:56 PM
目demangleできてよかった
Avatar
Running "/Users/katei/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/katei/ghq/github.com/swiftwasm/carton/Tests/Fixtures/TestApp/.build/carton" "--disable-sandbox" "plugin" "carton-test" こういう出力があると思うんで
3:57 PM
このコマンドの swift package の直後に --verbose つけると最後の方に CartonFrontend のコマンドが出てきます
Avatar
omochimetaru 4/4/2024 3:57 PM
Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" "plugin" "carton-test" "internal-get-build-command" "--environment" "browser" "--output" "/var/folders/qw/myjd_8ld5lg9qg057bhm467c0000gn/T/carton-F2kqX9" Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "build" "--product" "swift-reactPackageTests" "-Xswiftc" "-static-stdlib" "-Xswiftc" "-Xclang-linker" "-Xswiftc" "-mexec-model=reactor" "-Xlinker" "--export-if-defined=main" "--disable-build-manifest-caching" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" Running "/Users/omochi/Library/Developer/Toolchains/swift-wasm-5.9.2-RELEASE.xctoolchain/usr/bin/swift" "package" "--triple" "wasm32-unknown-wasi" "--scratch-path" "/Users/omochi/github/omochi/swift-react/.build/carton" "--disable-sandbox" "plugin" "carton-test" "--environment" "browser"
3:57 PM
Runningは3つあった
3:58 PM
最後のやつか
Avatar
最後のやつ
Avatar
omochimetaru 4/4/2024 4:00 PM
info: Running "/Users/omochi/github/omochi/swift-react/.build/carton/arm64-apple-macosx/debug/CartonFrontend" "test" "--prebuilt-test-bundle-path" "/Users/omochi/github/omochi/swift-react/.build/carton/wasm32-unknown-wasi/debug/swift-reactPackageTests.wasm" "--environment" "browser"
4:00 PM
同じだけどwasmのおいてある場所が違うな
4:01 PM
これはbuildディレクトリが根元で区切ってあるだけか
Avatar
なにか変な状態になってたのかな
Avatar
omochimetaru 4/4/2024 4:04 PM
コンパイラとstdlibのバージョンが違うせいかなあ
4:04 PM
cartonがとってきた5.9.2でやってみよう
Avatar
コンパイラとstdlibのバージョンが違ったらそもそも全然ビルドとおらないですねw
Avatar
omochimetaru 4/4/2024 4:05 PM
コンパイラは4/2 snapshotで
4:05 PM
swift sdk (stdlibじゃなかった)はswiftwasm配布の4/3 snapshot
Avatar
そこはじつは一致してるのだ
4:06 PM
全部アップストリームしたから名前も揃えられるんだけどまだやってなかったな (edited)
Avatar
omochimetaru 4/4/2024 4:06 PM
ふむふむ
Avatar
なのでとりあえずビルドの環境は正しそう。
4:08 PM
.buildを消して、一度も swift run cartonを実行しない状態でもう一回CartonFrontend直でやってみるとどうでしょう
Avatar
omochimetaru 4/4/2024 4:08 PM
export TOOLCHAINS=org.swiftwasm.202439 swift build --triple wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser これでテスト実行された
4:09 PM
これで、 CartonFrontend がバージョン違う可能性があったけどそれは無くなった
4:09 PM
もっかい消して、4/2版でやってみる
4:11 PM
動かない!!
4:11 PM
export TOOLCHAINS=org.swift.59202404021a swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=main \ --disable-build-manifest-caching CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser
4:11 PM
違いは、TOOLCHAINSと、 --triple を使うか --experimental-swift-sdk を使うか、だけ。
Avatar
お、じゃあmainブランチでなんか壊れてるんだな
4:12 PM
あ、わかったぞ
Avatar
omochimetaru 4/4/2024 4:13 PM
まじ
Avatar
4/2のほうで --export-if-defined=__main_argc_argv にしてみて
Avatar
omochimetaru 4/4/2024 4:13 PM
ok
4:14 PM
動いた〜〜
4:15 PM
いや
4:15 PM
An error occurred: RuntimeError: Unreachable code should not be executed (evaluating 'instance.exports.__main_argc_argv(0, 0)')
4:15 PM
Avatar
テストに失敗してるから?
Avatar
omochimetaru 4/4/2024 4:15 PM
ブラウザは真っ白ではないという意味では動いたけど
4:15 PM
テストケースが開始してない
Avatar
あ、ちがうな。XCTestアップストリームしたときにバンドルアクセスを強制にしたんだ
4:16 PM
えーとこれはどうしたものかな
4:16 PM
cartonのテストハーネスを直さないといけないな
Avatar
omochimetaru 4/4/2024 4:16 PM
cartonも壊れてるってこと?
Avatar
cartonが最新のmainのツールチェインに追いついてなかった
Avatar
omochimetaru 4/4/2024 4:16 PM
リンカオプションの変更はcarton内には実装されてたね
4:17 PM
(これって #if compiler だと cartonのbuild time分岐だけどいいのか?選択してるツールチェインのバージョンではないのか (edited)
Avatar
2,3週間前に変わった
Avatar
Avatar
Yuta Saito
あ、ちがうな。XCTestアップストリームしたときにバンドルアクセスを強制にしたんだ
ってことは一旦 main-snapshot-2024-03-13 & DEVELOPMENT-SNAPSHOT-2024-03-20-a-wasm まで巻き戻せばそれがない時の状態のはずです (edited)
Avatar
cartonをビルドするコンパイラとwasmをビルドするコンパイラバージョンが一致してるという前提
Avatar
omochimetaru 4/4/2024 4:18 PM
今俺一致してないな
4:18 PM
cartonを外に置いてるから
Avatar
わはは
Avatar
omochimetaru 4/4/2024 4:18 PM
あ、でも、あーいやどうだったっけ?
Avatar
Avatar
kebo
ってことは一旦 main-snapshot-2024-03-13 & DEVELOPMENT-SNAPSHOT-2024-03-20-a-wasm まで巻き戻せばそれがない時の状態のはずです (edited)
ですねー、コンパイラの方も戻さないといけないけど
Avatar
omochimetaru 4/4/2024 4:19 PM
まあここの分岐は今carton使わないで手で書いてるんだからとりあえずいいか
Avatar
手元で再現環境作るのめんどうなのでよかったらリポジトリアクセスください
Avatar
Avatar
Yuta Saito
あ、ちがうな。XCTestアップストリームしたときにバンドルアクセスを強制にしたんだ
omochimetaru 4/4/2024 4:19 PM
これがさっぱりわからんけどなんか方式が変わったんすね
Avatar
Avatar
Yuta Saito
手元で再現環境作るのめんどうなのでよかったらリポジトリアクセスください
omochimetaru 4/4/2024 4:20 PM
招待したよ
4:21 PM
mainと手元の違いは今は diff --git a/Package.swift b/Package.swift index a57f2f3..5557ef3 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.10 +// swift-tools-version: 5.9 import PackageDescription @@ -41,6 +41,7 @@ let package = Package( dependencies: [ .package(url: "https://github.com/apple/swift-algorithms", from: "1.2.0"), .package(url: "https://github.com/swiftwasm/JavaScriptKit", from: "0.19.1"), + .package(url: "https://github.com/swiftwasm/carton", from: "1.0.0"), ], targets: [ .target( これだけ
Avatar
どもども
Avatar
Avatar
kebo
ってことは一旦 main-snapshot-2024-03-13 & DEVELOPMENT-SNAPSHOT-2024-03-20-a-wasm まで巻き戻せばそれがない時の状態のはずです (edited)
omochimetaru 4/4/2024 4:23 PM
keboさんはなぜその3/20というタイミングを知ってるんですか?
Avatar
wasm 向けのテストを走らせてるリポジトリで挙動の変化があったからですね. https://github.com/swiftwasm/swift/issues/5574
Avatar
めちゃくちゃこまめに更新していただいてる 🙏
Avatar
Avatar
kebo
wasm 向けのテストを走らせてるリポジトリで挙動の変化があったからですね. https://github.com/swiftwasm/swift/issues/5574
omochimetaru 4/4/2024 4:27 PM
おお〜なるほど wasmtimeでBundle関連だから同じ話っぽいのか
Avatar
よし再現できた
Avatar
omochimetaru 4/4/2024 4:29 PM
4:30 PM
keboさんのアカウント swift_os が流れてきてみたことあったな
4:30 PM
Discordとアイコンと名前が違くて全く気づかなかった
Avatar
Avatar
omochimetaru
Discordとアイコンと名前が違くて全く気づかなかった
私の GitHub username は Apple Developer Forums で伏字にされてしまうというのもあってこっちに合わせて変えようかなと思ったりしつつ URL が変わっちゃうので腰が重く...
Avatar
kkkなるほど!
Avatar
omochimetaru 4/4/2024 4:33 PM
kkkw
Avatar
Apple にバグレポ送ったら GitHub URL がぶっ壊されてアクセスできないって言われて困ったことがありますw
Avatar
omochimetaru 4/4/2024 4:33 PM
氏名からつけただけなのに・・・
t_desudesu 1
4:43 PM
ここで落ちるって話なのかな
4:43 PM
2: wasm trap: wasm `unreachable` instruction executed これがwasmtimeで、ブラウザのやつも同じことか
Avatar
あっれーなおらんなー
👀 1
Avatar
わかったー
👀 1
Avatar
omochimetaru 4/4/2024 5:18 PM
直った〜
5:20 PM
insertBefore がコケるのとかも5.9.2wasmの時と同じ
Avatar
omochimetaru 4/4/2024 5:22 PM
爆速
5:22 PM
読んで学ぼう
Avatar
omochimetaru 4/4/2024 5:33 PM
argv配列を渡すようにしたことと、 path モジュールをバインドしたことと、 /sandbox を作ってpreopenしたことはなんとなくわかる
5:33 PM
@wasmer/wasi のAPIを調べようとして迷った
Avatar
@wasmer/wasiは本当に今すぐにでも辞めたい依存物で次のリリースで消すつもりなので調べなくてもよい
Avatar
omochimetaru 4/4/2024 5:34 PM
Isomorphic Javascript library for interacting with WASI Modules in Node.js and the Browser.. Latest version: 1.2.2, last published: a year ago. Start using @wasmer/wasi in your project by running npm i @wasmer/wasi. There are 47 other projects in the npm registry using @wasmer/wasi.
5:34 PM
5:34 PM
ほとんどRustで、意味がわからない・・・
5:34 PM
JavaScriptのライブラリじゃないのか
Avatar
いちおう。。今使ってるやつからは完全に書き換わってしまったけど
Avatar
omochimetaru 4/4/2024 5:35 PM
"@wasmer/wasi": "^0.12.0", バージョン?
Avatar
https://github.com/bjorn3/browser_wasi_shim/ に置き換える予定です
👀 1
5:36 PM
1.x系で全てが変わってしまった
Avatar
omochimetaru 4/4/2024 5:36 PM
なるほど
5:36 PM
ほんとだ タグ変えたら普通にTypeScriptになった
5:36 PM
なんなんだ???
5:38 PM
あった
5:39 PM
path: any だけど Path モジュールを要求してるんやな
5:39 PM
疑問が一手先送りにされただけだった まあとにかくwasm binary側から見てファイルシステムのWASI機能を使うために必要なことをしたという感じかな
Avatar
そんなかんじ
Avatar
omochimetaru 4/4/2024 5:41 PM
Rustになって何が起こってるのかがめっちゃ気になってきた
5:44 PM
今日はもう寝ます、パッチで直るかは後日やってみます ありがとうございました
Avatar
はーい。連日どうも
Avatar
Wasmer.js が 1.0 で急に変わって 0.x にあったバグが修正されてるけれども 1.0 はそっちはそっちで雲行きが怪しいみたいな話,前も kateinoigakukun さんに聞いたことがあるなと思ったらこれでした. https://x.com/kateinoigakukun/status/1591026496277458945?s=20
Avatar
wasmer/wasi捨てれそうなのめでたい
Avatar
omochimetaru 4/5/2024 1:15 AM
wasmerちょっと調べた 0系→nodeとブラウザにwasiインターフェースを提供する そのためにwasm側のwasi関数からjs側を呼び出して機能を提供する 1系→rust実装されたwasi付きのwasm処理系があり、それをwasmにコンパイルして、ブラウザのwasmランタイム上で動かす??
Avatar
omochimetaru 4/5/2024 1:40 PM
パッチされたcarton(現main)でテスト動いた (edited)
Avatar
おーよかった
Avatar
omochimetaru 4/5/2024 1:43 PM
ありがとう これでsnapshotでやれる
Avatar
omochimetaru 4/5/2024 1:51 PM
なるほど JS側で例外が発生すると、WASM側を抜けて?迂回して? wasmRunner.runから例外が飛んでしまうから
1:51 PM
wasmとしてのxctestの実行がぶったぎられて止まってしまうのか
1:56 PM
JavaScriptKitのJSFunctionは使わない方が良い・・・? JSThrowingFunctionならwasmにエラーが入ってきそうだ
Avatar
omochimetaru 4/5/2024 1:56 PM
あちこちで .throws で変換するのめんどくさいなと思って無視したけど (edited)
1:57 PM
基本こっちのほうが良いか・・・?
Avatar
意図的にちゃんと例外をケアしたいところだけで使えば良いんじゃないですかね
Avatar
omochimetaru 4/5/2024 2:00 PM
JSだから意図せず飛んでくる場面がありそうな気もした
Avatar
そういうのは心配しても結局できることは無いかなぁと思ってました。
Avatar
omochimetaru 4/5/2024 2:02 PM
それも一理ある
Avatar
Wasmを呼び出す側が最終的に例外キャッチできるから
2:02 PM
それで良い気がする
Avatar
逆にして、常にthrowsにしておいて.nothrowにするのは?
Avatar
omochimetaru 4/5/2024 2:02 PM
全部WASM内のReactで動かせるから、Reactの層で常に全部捕まえれば、
Avatar
えー、面倒くさくなるだけじゃないかなぁ
Avatar
omochimetaru 4/5/2024 2:03 PM
破滅は避けられるけど、まあ復旧しない場合が多そうではある
2:03 PM
本物のReactもそういう感じの動作はする。
2:03 PM
effectの中で例外が飛んでもメインの更新系は生きてる アプリケーションの状態は破綻するけど
Avatar
そういう感じなんだ
Avatar
Avatar
Iceman
逆にして、常にthrowsにしておいて.nothrowにするのは?
omochimetaru 4/5/2024 2:04 PM
俺もベースがthrowsで、高速化したいプロが .unsafeUncatching みたいなやつを特別な場所で使う、みたいなほうが自然な気もした
Avatar
Avatar
Yuta Saito
そういう感じなんだ
omochimetaru 4/5/2024 2:05 PM
UIButtonのonTapで例外とんでも今出てるViewControllerまで吹き飛んでアプリ全てが真っ白になったりはしない、みたいな。 (edited)
2:06 PM
あちこち throws な事自体はあまり違和感はないかな サーバサイドで普段から大量の async throws にまみれているから・・・ (edited)
t_wakaru 1
Avatar
なるほど、Wasm内のフレームワークがユーザコードを呼んでユーザコードがJS例外をキャッチせずにフレームワークのフレームを飛び越えてフレームワークの状態が壊れる
Avatar
omochimetaru 4/5/2024 2:07 PM
そう!w
Avatar
これは一理あるな
Avatar
Avatar
Yuta Saito
Wasmを呼び出す側が最終的に例外キャッチできるから
omochimetaru 4/5/2024 2:08 PM
これはわかるけど俺がやろうとしてるアーキテクチャだとそこまで飛んだら外側すぎるって話だね (edited)
2:08 PM
JSで全体的に組んで、局所的な高速関数をWASM実装にする、みたいなパターンだと、それで良いよね。
Avatar
なるほどなー新たな視点だ
Avatar
omochimetaru 4/5/2024 2:09 PM
まあJSKの設計は置いといて、話しててやっぱり全部catchしたくなってきたので
2:09 PM
JSKMockにJSThrowingFunctionを作ってこよう。
2:10 PM
ユーザーコードがJSをnoncatchで呼ぶケースはswift-reactからはどうしようもないね。
Avatar
一応1枚JSのフレームを挟むという手があるんだけど
2:11 PM
とてもハッキー
2:12 PM
たしかEmscriptenがやってる手法
Avatar
omochimetaru 4/5/2024 2:12 PM
あー、JSで1フレーム後で、トップレベルでcatchして、その中でもっかいwasm instanceに投入すれば
2:12 PM
トップレベルのjsで掴めるのか。
2:13 PM
あ、描画フレームを遅らせる必要はないのか
2:13 PM
WASMからJSに出てそこでWASMに入るだけか
Avatar
ここでのフレームはコールフレームのつもりだったw
Avatar
omochimetaru 4/5/2024 2:13 PM
そっちのフレームか
2:14 PM
アイデアとしては覚えておこう・・・
Avatar
なんか前教えてもらったProxy使うやつかな
Avatar
Proxyってなんだったかな
2:17 PM
こんなイメージ function catchCall(body) { try { return { type: "success", value: body() } } catch(error) { return { type: "failure", value: error } } } let result = JSObject.global.catchCall(JSOneshotClosure { // do something })
Avatar
JSKが触るオブジェクトに全部Proxyを噛ませて、そのcatchCallを被せて呼び出すみたいなのをイメージしてました
Avatar
よさそう
Avatar
omochimetaru 4/5/2024 2:39 PM
あ〜
2:39 PM
jsValue.createElement(tagName) これトリッキーに動いてるから
2:39 PM
jsValue.createElement.throws(tagName) こうするとうまくいかないんだ・・・
2:40 PM
DMLの .createElement() が直結してないと callable type に返り値の推論がされない
Avatar
普通のプロパティになっちゃってJSValue扱いされる?
Avatar
omochimetaru 4/5/2024 2:43 PM
それがややこしくて
2:43 PM
jsValue.createElement.aaaa(tagName) これなら、createElementは普通のオブジェクトアクセス扱いなんだけど
2:43 PM
2:43 PM
続いてるのが throws だと Ambiguous になる
2:44 PM
JSFunctionだったらthrowsプロパティを持っているって話と絡んでややこしい
Avatar
あーなるほど。そもそもJSFunctionが持ってるプロパティ全部と曖昧になっちゃうんですね
Avatar
jsValue.object!.throwing.createElementが書ける
Avatar
callable typeならthrowsのオーバーロードつければtryつけたら勝手にそっちになりませんかね?
Avatar
Avatar
Yuta Saito
jsValue.object!.throwing.createElementが書ける
omochimetaru 4/5/2024 2:48 PM
あ〜先に変換するのか
Avatar
Avatar
omochimetaru
jsValue.createElement.aaaa(tagName) これなら、createElementは普通のオブジェクトアクセス扱いなんだけど
これだとレシーバがthisとして伝播されないので
Avatar
Avatar
Iceman
callable typeならthrowsのオーバーロードつければtryつけたら勝手にそっちになりませんかね?
omochimetaru 4/5/2024 2:48 PM
それはできるかもしれないけど、うっかりtryつけ忘れるバグが出そうだ
Avatar
Avatar
Yuta Saito
これだとレシーバがthisとして伝播されないので
omochimetaru 4/5/2024 2:48 PM
あ〜そうだ、それもあった
2:49 PM
呼び出し予定で引っ張り出す時にthis bindしてたんだった
Avatar
Avatar
Yuta Saito
jsValue.object!.throwing.createElementが書ける
omochimetaru 4/5/2024 2:49 PM
ちなみにここってなんで throwingthrows で API揃ってないん
Avatar
分かれてたほうが違うものに対する変換であることがわかりやすいかなと
Avatar
omochimetaru 4/5/2024 2:55 PM
なるほど 見分けるためか
Avatar
omochimetaru 4/5/2024 4:57 PM
@Yuta Saito https://github.com/swiftwasm/JavaScriptKit/pull/238 これみてもらえますか
Avatar
なんかNode.jsがセグフォしてCIコケてる…
Avatar
記念すべき初日本語プルリク
Avatar
omochimetaru 4/5/2024 5:11 PM
マージありがとう
5:11 PM
JS例外全部catchに加えてこの修正によってテストケースがクラッシュせずに完走できるようになった
Avatar
yay 🎊
Avatar
omochimetaru 4/5/2024 5:13 PM
まだ通らないテストケースがあって、その直前に NotFoundError が出ているから
5:13 PM
何が起きてるか調べようとしてるけど調べ方から考えているところw
5:13 PM
今日は終わり
Avatar
例外発生したタイミングでブレークするデバッガの機能でなんとか
Avatar
omochimetaru 4/5/2024 5:16 PM
おーそれ正解だ
5:17 PM
最初に関係ない?無害な例外が6個ぐらい出るけど
5:17 PM
その後こいつが捕まった
Avatar
犯人確保
Avatar
omochimetaru 4/5/2024 5:26 PM
その状況をフックするコードを書いてXcode側で実行して状況が捕捉できた
5:27 PM
自作のとブラウザのinsertBeforeの微妙な動作の違いを踏んでいるっぽい
5:27 PM
JavaScriptKitMock作る作戦正解だ
Avatar
omochimetaru 4/6/2024 4:01 AM
モック環境でJS環境と同じように壊れるようにできた。
Avatar
omochimetaru 4/6/2024 11:01 PM
@Yuta Saito JavaScriptKitのJSClosure型なんですけど、 is JSObjectだけど、is JSFunctionではないのが変な感じがします 1. 「呼び出せる型で共通化して受け取って呼び出す」コードが書けない 2. JSClosure.jsValueをJSObject.constructに渡すとJSObject型になり、JSFunction.constructに渡すと失敗する 3. JSClosureを一度JSに渡してから取り出して作ったJSValueではJSFunctionになっている。これは2と矛盾する。 まだ実行してないけどこうなってるようにみえる (edited)
Avatar
Avatar
Yuta Saito
分かれてたほうが違うものに対する変換であることがわかりやすいかなと
omochimetaru 4/7/2024 1:42 AM
そういえばこれだけど、もし同じにすると、 JSFunction.throws と JSObject.throws が衝突するからoverrideになって、そうすると返り値の型が分けられないね
Avatar
Avatar
omochimetaru
@Yuta Saito JavaScriptKitのJSClosure型なんですけど、 is JSObjectだけど、is JSFunctionではないのが変な感じがします 1. 「呼び出せる型で共通化して受け取って呼び出す」コードが書けない 2. JSClosure.jsValueをJSObject.constructに渡すとJSObject型になり、JSFunction.constructに渡すと失敗する 3. JSClosureを一度JSに渡してから取り出して作ったJSValueではJSFunctionになっている。これは2と矛盾する。 まだ実行してないけどこうなってるようにみえる (edited)
omochimetaru 4/7/2024 1:58 AM
自動テストで確認した。 final class JavaScriptKitTests: XCTestCase { func testClosureAsFunction() throws { let clo = JSClosure { (_) in return 7.jsValue } let obj = try JSObject.mustConstruct(from: clo.jsValue) XCTAssertFalse(obj is JSFunction) let fn = clo.asFunction() let ret = try Int.mustConstruct(from: try fn()) XCTAssertEqual(ret, 7) } } extension JSClosure { #if USES_JAVASCRIPT_KIT_MOCK public func asFunction() -> JSThrowingFunction { let fn = native as! JSNativeFunction return JSFunction(native: fn).throws } #else public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws } #endif }
Avatar
そう、やっぱり継承関係がおかしい
2:08 AM
Motivation While integrating async/await feature, I found JSPromise has too complex API. (e.g. too many overloads, unsafe generic parameters, and lifetime management) So I want to refine the API be...
2:08 AM
で変えてるんだけど、レビューで突っ込まれてない上にこの人全然説明してない
2:09 AM
Now that JSClosure and JSOneshotClosure are no longer subclasses of JSFunction, how are they supposed to be converted to JSValue? Should the object case be used?
Avatar
Avatar
Yuta Saito
そう、やっぱり継承関係がおかしい
omochimetaru 4/7/2024 2:11 AM
ほんとだ。元々は is JSFunction だったのか。
Avatar
Avatar
Yuta Saito
omochimetaru 4/7/2024 2:12 AM
これは無理でしょう、JSValue(RawJSValue) から復元できないから
Avatar
やはりJSValueで値を区別するのをやめたい
Avatar
omochimetaru 4/7/2024 2:17 AM
JSClosureは deinit で release したいなどのニーズがあったからややこしくなってそう
Avatar
そうなんですよ、ライフタイムが他とは違う
2:18 AM
NonCopyableにできるとシンプルになるかな
2:19 AM
今となってはFinalizationRegistry前提にしても良い気がする
Avatar
omochimetaru 4/7/2024 2:20 AM
これ前提で話がシンプルになる気がするけど
2:20 AM
ちょっと現在の実装もまだバグってる気がするな
2:21 AM
JSClosureをSwift側で作ってから、 JS側に渡さないまま保持してGCが発動するとsharedClosuresから消えて、 その後でJS側に渡すと壊れそう
2:23 AM
あーでもこれSwift側が生きてる間はJS側をretainするようにすると、 今度はJS側で不死になるからfinalizationが動かないな クロスバウンダリーサイクルだ
Avatar
作ったクロージャはretainしてるから死なない
Avatar
omochimetaru 4/7/2024 2:24 AM
あれ、してるのか
2:25 AM
JS側関数から JSClosureへのretainがないのか。
2:25 AM
hostFuncRef = JavaScriptHostFuncRef(bitPattern: ObjectIdentifier(self)) これがただのIDだから。
Avatar
うむ
2:26 AM
なのでFR無しだとSwift側のJSClosureが先にデアロケートされるとダメ
Avatar
omochimetaru 4/7/2024 2:27 AM
なるほど。3段階なのか。SwiftのJSClosure →JSのオブジェクト → Swiftの関数の実装 (edited)
2:27 AM
えーってことは、ダメなパターンは
2:27 AM
SwiftでJSClosureを作ってから、JSのオブジェクトに代入した後、
2:27 AM
それを取り出してJSFunctionとして復元して、JS側の参照を消して、 (edited)
2:27 AM
それをSwiftで持ち続けても
2:28 AM
関数の実装が消える場合があるかな。
Avatar
JSClosure自体も持ち続けてないとダメっすね
Avatar
omochimetaru 4/7/2024 2:28 AM
button.onclick を書いたり読んだりすると起きえそうだ
2:29 AM
JavaScriptHostFuncRef(bitPattern: ObjectIdentifier(self)) あとこれだけど、
2:29 AM
JSClosureが消えて、新しいJSClosureを作って
2:29 AM
同じアドレスにアロケートされると
2:29 AM
関数実装が上書きされそう (edited)
Avatar
JSClosureが消えたらそのエントリがdeinitで消えるので
Avatar
omochimetaru 4/7/2024 2:30 AM
#if JAVASCRIPTKIT_WITHOUT_WEAKREFS deinit { guard isReleased else { fatalError("release() must be called on JSClosure objects manually before they are deallocated") } } #endif } deinitは何もしてないから消えないんじゃ?
Avatar
releaseか
2:32 AM
これFRモードだとまずい気がするなぁ
Avatar
omochimetaru 4/7/2024 2:32 AM
#if JAVASCRIPTKIT_WITHOUT_WEAKREFS // MARK: - Legacy Closure Types extension JSClosure { public func release() { isReleased = true Self.sharedClosures[hostFuncRef] = nil } } @_cdecl("_free_host_function_impl") func _free_host_function_impl(_ hostFuncRef: JavaScriptHostFuncRef) {} #else extension JSClosure { @available(*, deprecated, message: "JSClosure.release() is no longer necessary") public func release() {} } @_cdecl("_free_host_function_impl") func _free_host_function_impl(_ hostFuncRef: JavaScriptHostFuncRef) { JSClosure.sharedClosures[hostFuncRef] = nil } #endif
Avatar
上書きが起こる気がする
Avatar
omochimetaru 4/7/2024 2:32 AM
FRモードだとreleaseは何もしないから
2:33 AM
swjs_create_function: (host_func_id, line, file) => { var _a; const fileString = this.memory.getObject(file); const func = (...args) => this.callHostFunction(host_func_id, line, fileString, args); const func_ref = this.memory.retain(func); (_a = this.closureDeallocator) === null || _a === void 0 ? void 0 : _a.track(func, func_ref); return func_ref; },
2:33 AM
この memory.retain を消せない気がしてきた
Avatar
FR無しだとSwift側のオブジェクトが消える時にエントリがreleaseで消えてないと明示的にクラッシュするようになってるけど
2:34 AM
FR有りだとJS側のクロージャオブジェクトが死ぬまでエントリが保持されるから上書きが起きるな
Avatar
Avatar
Yuta Saito
FR有りだとJS側のクロージャオブジェクトが死ぬまでエントリが保持されるから上書きが起きるな
omochimetaru 4/7/2024 2:35 AM
JS側のクロージャオブジェクトが死ぬまで
ここなんですけど
Avatar
Avatar
omochimetaru
この memory.retain を消せない気がしてきた
それはJSObjectのdeinitで消えそう
Avatar
omochimetaru 4/7/2024 2:36 AM
おお、ここにもあったのか
2:36 AM
これはどうなっているんだ・・・
Avatar
むずかしい
Avatar
omochimetaru 4/7/2024 2:36 AM
JS側の任意の値を取り出しながらJSObjectに包んだときは
2:37 AM
retainしないと数が合わなくなる
2:38 AM
swjs_call_newswjs_create_function では retain してるけど
2:39 AM
// swiftで func inSwift() { // no retain let body = JSObject.construct(from: JSObject.global.document.body)! consume body // swjs_release } (edited)
2:39 AM
↑これでover releaseしない?
Avatar
それだとretainは一個なんじゃないか?
Avatar
omochimetaru 4/7/2024 2:41 AM
どこでretainされてる?
Avatar
bodyをとってくる時に
2:42 AM
writeAndReturnKindBitsがretainしてるはず
Avatar
omochimetaru 4/7/2024 2:42 AM
const writeRef = (kind) => { memory.writeUint32(payload1_ptr, memory.retain(value)); return exceptionBit | kind; }; あ、ほんとだ
2:43 AM
JS側からSwift側に戻すときにretainする規約なのか
Avatar
JSK Calling Convention
Avatar
omochimetaru 4/7/2024 2:44 AM
で、RawJSValueがJSValueに戻す時にJSObjectに包むからこれでreleaseが予約されてバランスするのね
Avatar
そうそう
Avatar
omochimetaru 4/7/2024 2:45 AM
理解した、じゃあJSClosureが死ぬ時にJSObjectが死んでreleaseするね
2:45 AM
それでJSClosureが死んでるが、JS関数が生きてる、という状態に遷移し得て
2:46 AM
そのままJS側も参照が消えればFRが起動して、最後にSwift側の実装が消えるが
2:46 AM
そこでJS側が生き続けて、新しいJSClosureができた時に
2:46 AM
同じアドレスになってしまって実装の上書きが生じうるのが
2:46 AM
唯一のバグかな
Avatar
そうですねぇこれはどうしたもんかなー
Avatar
omochimetaru 4/7/2024 2:48 AM
そっちは根が深そうだから一旦おいておいて、 僕が早急に欲しいのは
2:48 AM
JSClosureをJSFunctionとして扱うインターフェースなんだけど
2:48 AM
Swift側で is じゃなくても、明示的な変換でもいいし
Avatar
どこで欲しくなるんだろう
Avatar
omochimetaru 4/7/2024 2:49 AM
さっき書いたように実装は可能なんだけど公式にあった方がいいなと思う public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws }
Avatar
Avatar
Yuta Saito
どこで欲しくなるんだろう
omochimetaru 4/7/2024 2:50 AM
WebMock を実装してて困った。 public class WebEventTarget: JSNativeObject { public init() { } private var listeners: [String: [JSFunction]] = [:] public func addEventListener(_ type: String, _ listener: JSFunction) { var lns = self.listeners[type] ?? [] if lns.contains(listener) { return } lns.append(listener) self.listeners[type] = lns } public func removeEventListener(_ type: String, _ listener: JSFunction) { guard var lns = self.listeners[type] else { return } lns.removeAll { $0 == listener } self.listeners[type] = lns } public func dispatchEvent(_ event: WebEvent) -> Bool { guard let lns = self.listeners[event.type] else { return true } for ln in lns { ln(event) } return true }
2:50 AM
Web側のモックだから本物のJavaScriptKitと連動することはないのでそういう意味では実際には不要ですけど・・・
2:51 AM
一般的にいうと、Swift上で、Rxみたいな関数を登録しておいて後で使う仕組みを JSFunction に対して作ろうとすると困ると思う
2:52 AM
JSClosureも渡せるようにしたいだろうから。
Avatar
JSClosureじゃなくてJSFunctionで受けたいのは本物のJS関数も渡したいから?
Avatar
omochimetaru 4/7/2024 2:52 AM
そうですね。それをJSのオブジェクトから取り出すかもしれないし。
2:53 AM
stream.subscribe(on: button.onclick) とか。
Avatar
そろそろ起きてパソコンでちゃんと見るか…
Avatar
omochimetaru 4/7/2024 2:55 AM
子供がお昼寝から起きたからしばらく落ちますw
Avatar
入れ替わった🫥
Avatar
omochimetaru 4/7/2024 4:00 AM
アドレス再利用問題については 関数の実装と一緒にselfへの弱参照を貼っておけば解決しないかな 弱retainがあるとdeinitされてもdeallocはされないので
Avatar
あー、そうか
4:02 AM
しかもコメント付き。やるな // Note: Retain the closure object itself also to avoid funcRef conflicts fileprivate static var sharedClosures: [JavaScriptHostFuncRef: (object: JSObject, body: ([JSValue]) -> JSValue)] = [:]
4:04 AM
普通のretainだけどJS側のクロージャからはこのオブジェクト自体は直接参照されず JavaScriptHostFuncRef を持ってるだけだから問題ないはず
Avatar
omochimetaru 4/7/2024 4:06 AM
普通のretainだとサイクルしてリークしないの?
4:07 AM
JSObject→jsの関数→ID→実装テーブル→JSObject (edited)
4:08 AM
(このテーブルの型のObject、thisだと思い込んでて見逃してたわ
Avatar
JSObject→jsの関数があったか
Avatar
omochimetaru 4/7/2024 4:11 AM
そう、create_functionでretainしてdeinitでreleaseする強参照があることをさっき教わった (edited)
Avatar
Avatar
omochimetaru
さっき書いたように実装は可能なんだけど公式にあった方がいいなと思う public func asFunction() -> JSThrowingFunction { var buffer: JSValue = Array<Int>([0]).jsValue buffer[0] = self.jsValue let fn = JSFunction.unsafeConstruct(from: buffer[0]) return fn.throws }
これはこれでどうですかねー https://github.com/swiftwasm/JavaScriptKit/pull/239
Avatar
Avatar
Yuta Saito
これはこれでどうですかねー https://github.com/swiftwasm/JavaScriptKit/pull/239
omochimetaru 4/7/2024 4:28 AM
これでもいい気がする JSClosureはJSFunctionに静的な色を付けてるだけ、という位置付けで 動的には消えるけど問題ないし
Avatar
Avatar
Yuta Saito
これはこれでどうですかねー https://github.com/swiftwasm/JavaScriptKit/pull/239
omochimetaru 4/7/2024 4:54 AM
No FRモードの場合に大丈夫か気になったけど問題ないな JSFunctionは何もしてないし (edited)
Avatar
問題ないかな…?この辺変更するの怖いんだよなぁ
4:59 AM
まあ入れてみよう
Avatar
omochimetaru 4/7/2024 5:00 AM
こわいねえ
Avatar
リークも直してみたけど自信ないなー https://github.com/swiftwasm/JavaScriptKit/pull/240
let c1 = JSClosure { _ in .undefined } consume c1 did not release the JSClosure itself and it leaked the underlying JavaScript closure too because JSClosure -> JS closure thunk -> Closure reg...
Avatar
omochimetaru 4/7/2024 6:20 AM
スマホでよくわからんけど意図した感じにはなっとる
6:21 AM
WeakBoxつかわんでもClosureEntryにweak varもたせたら?
Avatar
JSOneshotClosureの方はユーザが保持しておく約束ではない+一回呼ばれたタイミングで自分でサイクルを切るので強参照にしたいので
6:37 AM
見直すとヒープオブジェクトが二段になるのは微妙だな
Avatar
omochimetaru 4/7/2024 6:37 AM
なるほど。Oneshotの方では強参照で使い回してるのか。
6:38 AM
あともう一点 ClosureEntryをstructにする選択肢があるけど、コレクションの操作のオーバーヘッドが増えるからどっちが得かわからん
6:40 AM
WeakBoxをstructにする選択肢もあるな・・・
Avatar
ClosureEntryをstructにするのが良さそう。ポインタ3つくらいなら。
6:41 AM
WeakBoxはweak varを持つためにstructにはできない
Avatar
omochimetaru 4/7/2024 6:41 AM
structのメンバーもweak varにできるでしょ?
Avatar
あれ、そうか。勘違いしてた
Avatar
omochimetaru 4/7/2024 6:43 AM
弱参照ポインタは弱retain countを操作するだけで強参照ポインタと表現は同じ
Avatar
ClosureEntry.object: AnyObject だからどちらにしても WeakBoxはclassにできないけど
Avatar
omochimetaru 4/7/2024 6:44 AM
そこの持ち方はそうですね enumにしたら強弱の両方いける
Avatar
それが最適な持ち方かな
Avatar
omochimetaru 4/7/2024 6:45 AM
enum Obj{case strong(AnyObj); case weak(WeakBox)
6:45 AM
これでも値的で8バイトのはず
Avatar
omochimetaru 4/7/2024 6:54 AM
妻帰ったからパソコンちょっとできる
6:56 AM
いいねこれ
Avatar
月曜にこのブランチで大きなテストを走らせてみて問題なければマージします
7:00 AM
テストコードもリークに依存しててマズかった
7:01 AM
しかし数年越しのバグをバンバン見つけるの本当にすごい
Avatar
omochimetaru 4/7/2024 7:02 AM
このへんは家庭君がJavaScriptKit作り始めた頃から話題としては振ってたわけでトピックとしては似たようなことをやったり考えたことがずっと前にあるんだよね
7:03 AM
自分が使うんだったら中身知っとかないとバグりそうだから見たら気になっただけ
Avatar
Avatar
Yuta Saito
テストコードもリークに依存しててマズかった
omochimetaru 4/7/2024 7:03 AM
リークしたおかげで逆に通ってたテストがあるってこと?
7:05 AM
一番のハードユーザーであろうトカマクはこの上に乗ってて壊れてなかったのが気になるわ・・・ (edited)
Avatar
そうそう。リークしてる分には壊れることは無いから通ってた
naruhodo 1
7:07 AM
どうせJSオブジェクトが回収されるタイミングはコントロールできないから、回収されることに依存したコードがなかったと言うか
Avatar
omochimetaru 4/7/2024 7:08 AM
あ〜まあそうか。具体的な問題が起きるのは限界までリークが溜まった場合だけか。 (edited)
7:08 AM
Tokamakみたいなアーキテクチャの場合、renderのたびにちょっとずつリークしていく、みたいな状態になると怖いけどまあ2GBは遠いか
Avatar
テストが落ちるようになったように、リークが治るとTokamakが壊れる可能性がありそうですね…
Avatar
ありそうですねぇ。
Avatar
omochimetaru 4/7/2024 7:09 AM
あっ、そうか。
Avatar
なのでこれマージするの怖い
Avatar
omochimetaru 4/7/2024 7:10 AM
😗
7:10 AM
strong を使う互換モードが要る?
Avatar
FRナシモードを使ってなければ壊れることは無いんだけど
7:11 AM
FRナシモードでは保守的(?)にリークさせる?
Avatar
omochimetaru 4/7/2024 7:12 AM
そういえばFRのモードはどこで決まるんでしたっけ
Avatar
ビルド中に -DJAVASCRIPTKIT_WITHOUT_WEAKREFS を渡すかどうかで決まります
Avatar
omochimetaru 4/7/2024 7:14 AM
アプリケーションをビルドするときに $ swift build -swiftc -DJAVASC...
Avatar
そうそう
Avatar
omochimetaru 4/7/2024 7:15 AM
なるほど。じゃあビルドツリーにおいて複数のライブラリがそれぞれJSKに依存していても、一斉に同じモードになるので、分断してリンクできなくなる心配はしなくて良いのか。 (edited)
7:20 AM
@Yuta Saito 一昨日?話した、この修正も今投げました https://github.com/swiftwasm/JavaScriptKit/pull/241
7:20 AM
これでいったん既知のバグはなくなると思う
Avatar
Optional.construct の変更がもう一回入ってそう?
Avatar
omochimetaru 4/7/2024 7:24 AM
あら
7:25 AM
ほんとだ 直します
7:27 AM
直しました
Avatar
どもども
Avatar
omochimetaru 4/7/2024 7:27 AM
ああ、テストがないと思ったら Tests じゃなくて
7:28 AM
IntegrationTests とかなのか
Avatar
そうそう。XCTestが移植される前からあったので
Avatar
omochimetaru 4/7/2024 7:29 AM
XCTestが移植される前
なるほど、そういう理由
Avatar
テスト足していただけるとありがたし 🙏
Avatar
omochimetaru 4/7/2024 7:29 AM
うおおお
7:30 AM
Xcodeからは見えない!w
Avatar
w
Avatar
TestSuitesパッケージを開くとJSKもテストパッケージも見えます
Avatar
omochimetaru 4/7/2024 7:33 AM
[omochi@omochi-mbp IntegrationTests (fix-object-decode *=)]$ make test npm ci added 27 packages, and audited 31 packages in 313ms 1 package is looking for funding run `npm fund` for details found 0 vulnerabilities cd .. && npm run build > javascript-kit-swift@0.19.1 build > npm run build:clean && npm run build:ts > javascript-kit-swift@0.19.1 build:clean > rm -rf Runtime/lib > javascript-kit-swift@0.19.1 build:ts > cd Runtime; rollup -c sh: rollup: command not found make: *** [build_rt] Error 127
Avatar
npm install?
Avatar
omochimetaru 4/7/2024 7:33 AM
rollup ってなんだっけ npm install はしたけど
7:33 AM
Avatar
プロジェクトトップでやらないとダメかも?
Avatar
omochimetaru 4/7/2024 7:34 AM
ああ〜
Avatar
rollupはバンドラー
Avatar
omochimetaru 4/7/2024 7:34 AM
ほんとだ。ここにもMakeあった
7:35 AM
created lib/index.mjs, lib in 345ms swift build --package-path TestSuites \ --product ConcurrencyTests \ --triple wasm32-unknown-wasi \ --configuration debug \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export=main \ warning: 'testsuites': 'PrimaryTests' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' warning: 'testsuites': 'ConcurrencyTests' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' warning: 'testsuites': 'BenchmarkTests' was identified as an executable target given the presence of a 'main.swift' file. Starting with tools version 5.4.0 executable targets should be declared as 'executableTarget()' Building for debugging... In file included from /Users/omochi/github/swiftwasm/JavaScriptKit/Sources/_CJavaScriptKit/_CJavaScriptKit.c:1: /Users/omochi/github/swiftwasm/JavaScriptKit/Sources/_CJavaScriptKit/include/_CJavaScriptKit.h:4:10: fatal error: 'stdlib.h' file not found 4 | #include <stdlib.h> | ^~~~~~~~~~ 1 error generated. [4/12] Write swift-version-37CF2ABA3CB73B3C.txt make[1]: *** [TestSuites/.build/debug/ConcurrencyTests.wasm] Error 1 make: *** [test] Error 2
7:35 AM
triple指定だからか
7:35 AM
swift-sdk指定じゃないから・・・あっちを使うしかないな
Avatar
PATHにswiftwasmツールチェインをいれるかTOOLCHAINS指定すると
Avatar
omochimetaru 4/7/2024 7:39 AM
テスト完走できた テスト追加します
👍 1
Avatar
omochimetaru 4/7/2024 8:04 AM
テスト足しました
8:05 AM
CIめちゃくちゃバリエーションあってウケる
8:06 AM
8:06 AM
macとubuntuとswiftとxcodeとWASI実装のバリエーションがあるのww
Avatar
超手厚いCI
Avatar
omochimetaru 4/7/2024 8:10 AM
swift 6 からは swift-sdk を使ったビルドもテストしなければならんな・・・ (edited)
Avatar
大変だ
Avatar
omochimetaru 4/7/2024 8:11 AM
Makefileの調整がめんどくさそうだ
Avatar
omochimetaru 4/9/2024 12:55 AM
wasmで動くSwiftライブラリは、せっかくユーザーのブラウザで動くのだから、デモサイトでplayground的に使えるようにしたいけど
12:55 AM
Swiftのソースをwasm binaryにコンパイルするところは
12:55 AM
サーバー側でコンテナ建ててコンパイルさせないといけないよねえ
Avatar
omochimetaru 4/9/2024 12:56 AM
そうするとGitHub Pagesだけじゃできないし、お金がかかりそう
12:56 AM
おお
12:56 AM
もうブラウザで全部動いていたのか
12:56 AM
Run押してから表示するまでめっちゃおせえw
Avatar
CloudRunが裏にいる
Avatar
omochimetaru 4/9/2024 12:57 AM
あ、コンパイラはブラウザじゃないのね (edited)
Avatar
https://syzf23805k.execute-api.ap-northeast-1.amazonaws.com/prod/CompileSwiftWasm
12:57 AM
コンパイルはサーバがやってそうですね
Avatar
omochimetaru 4/9/2024 12:58 AM
2回目の方が早いな、でも遅いな
Avatar
AWSだからApp Runner?
12:58 AM
App Runnerのデフォルトドメインではなさそうだ
Avatar
omochimetaru 4/9/2024 12:59 AM
share buttonにソース全部入ってるな (edited)
12:59 AM
ここにライブラリを入れてもらう作戦は、ありえるな。
Avatar
これってリンカーはブラウザで動かしてるんですよね?
Avatar
あれ、LambdaだとなんかコンテナがクラッシュしたからGCPに移したはずなんだけどデプロイしてなかったっけ
Avatar
Avatar
Iceman
これってリンカーはブラウザで動かしてるんですよね?
そうっすね、サーバはオブジェクトファイル返すだけ
1:01 AM
これがブラウザで動いてる https://github.com/kateinoigakukun/chibi-link
A toy linker for WebAssembly object files. Contribute to kateinoigakukun/chibi-link development by creating an account on GitHub.
Avatar
omochimetaru 4/9/2024 1:02 AM
リンカー自作しとる
Avatar
omochimetaru 4/9/2024 3:15 AM
おお!stdlibを使い回していたのか おもしれー
3:15 AM
ブラウザがiPhoneでサーバーがappstoreみたいな感じだ
Avatar
pad.swiftwasm.orgまだSwift 5.6のツールチェインつかってる笑
3:27 AM
古代で止まってる…
Avatar
omochimetaru 4/9/2024 3:37 AM
ビルドするときはTokamakなどのライブラリを含めたフルビルドになっていて、インクリメンタルではないのかな?
3:37 AM
stdlibだけがプレビルド?
Avatar
昔過ぎてあんまり覚えてないんですけど、依存ライブラリ全てのswiftmoduleをデプロイ前にビルドしておいて、Lambdaのコンテナに全部突っ込んでた気がする (edited)
Avatar
omochimetaru 4/9/2024 3:38 AM
なるほど。じゃあコンパイルしてるのはエディタ部分だけか。アーキテクチャは全体的にかなり速そうだ
3:40 AM
体感が遅かった理由が気になるな〜、全て終わったころに調べてみたい
Avatar
うむー、体感昔より遅いんですよね。
3:43 AM
Lambdaの実行時間が7秒とかかかってるんでボトルネックがここなのは明らかなんですけど
3:43 AM
これ1年以上前のメトリクス見れないんだな
Avatar
omochimetaru 4/9/2024 3:44 AM
ふむふむ
Avatar
ぼくのAWS力ではこの辺が限界
3:46 AM
Lambdaの下請けマシンスペックが下がったのかな
Avatar
omochimetaru 4/9/2024 3:47 AM
自分のAWSにデプロイしていろいろやってみます、あとあとで
Avatar
デモの準備が整ったあたりで追々
👉 1
Avatar
omochimetaru 4/9/2024 4:34 PM
func testState() throws { struct Content: Component { @State var count = 0 func render() -> Node { return div { "\(count)" button( listeners: [ "click": Function { (ev) in count += 1 } ] ) } } } let body = try document.createElement("body") let root = ReactRoot(element: body) root.render( node: Content() ) XCTAssertPrint(body, """ <body> <div> 0 <button /> </div> </body> """) let btn: JSHTMLElement = try XCTUnwrap( root.root? .find { $0.tagElement?.tagName == "button" }? .dom?.asHTMLElement() ) try btn.click() XCTAssertPrint(body, """ <body> <div> 1 <button /> </div> </body> """) } ちょっとそれっぽくなってきた(↑このテストが通った) (edited)
🎉 3
Avatar
omochimetaru 4/13/2024 1:19 PM
うーん?
1:20 PM
[omochi@omochi-mbp ReactTests (main =)]$ ls -1 CallbackHookTests.swift ContextHookTests.swift RefHookTests.swift RenderPlanTests.swift RenderTests.swift StateHookTests.swift VNodeTests.swift
1:20 PM
ブラウザでテストする時、このディレクトリには本来7つのXCTestCaseがあるんだけど
1:20 PM
VNodeTests RenderTests RenderPlanTests が含まれる時
1:20 PM
ブラウザがフリーズしてCPU100%になってハングする
1:21 PM
だけど、このディレクトリの中身を、 この3つのテストのうちの2つだけにしたら、ハングしない
1:21 PM
例えば、 VNodeTestsRenderTests だけとか RenderTestsRenderPlanTests だけ、みたいな時は大丈夫なのに (edited)
1:21 PM
VNodeTests RenderTests RenderPlanTests の3つがあるとフリーズする (edited)
1:22 PM
全部JavaScript側にアクセスするから、状態空間は共有してるけど、なんでそんなことが起きるのか想像がつかない
1:22 PM
@Yuta Saito という感じなんですが、何かわかりますか? どうアプローチしたらいいか思いつかなくて困り中
1:24 PM
WASM実行レイヤ(ブラウザ)、WASMコード(コンパイラ)、XCTestの実装、Carton、俺の書いたコード が容疑者なんだけど絞り込みが難しい
1:27 PM
「3つ含めるとフリーズする」こと自体の再現性は100%だな
1:28 PM
いや、それも嘘だ・・・今回は通った
Avatar
なんだろう。asyncなテストはありますか?
Avatar
omochimetaru 4/13/2024 1:29 PM
今の所async awaitはいっさい使ってない
Avatar
であれば本当にブラウザがハングしてるだろうからハングしてるところを捕まえてもらうのが良いかな
1:29 PM
デバッガ繋がります?
Avatar
omochimetaru 4/13/2024 1:30 PM
ブラウザが死ぬから右クリックが効かなくてデバッガタブが出せない
1:30 PM
SafariでもChromeでも同じ
Avatar
なるほど厳しい
Avatar
omochimetaru 4/13/2024 1:30 PM
Avatar
ブランチプッシュしてもらえれば見れますー
Avatar
omochimetaru 4/13/2024 1:31 PM
今mainブランチでその状態です
1:31 PM
7個フルで入ってる状態だとほぼ100%死ぬ
1:31 PM
4個でも100%
1:31 PM
3個だと90%ぐらい?でも一度安定すると安定する
Avatar
謎だなー。コールスタックが深かったりしますか?
Avatar
omochimetaru 4/13/2024 1:32 PM
Safariでも同じ感じ 100%
Avatar
Avatar
Yuta Saito
謎だなー。コールスタックが深かったりしますか?
omochimetaru 4/13/2024 1:32 PM
ツリー構造に対して再帰的な処理は色々あるから深い可能性はある Xcodeの方で見てみる
1:33 PM
-Xlinker -z -Xlinker stack-size=131072
Avatar
omochimetaru 4/13/2024 1:34 PM
1:34 PM
一番深いところを見つけるのが難しいね?とりあえず適当に狙ったら108
Avatar
Avatar
Yuta Saito
-Xlinker -z -Xlinker stack-size=131072
omochimetaru 4/13/2024 1:36 PM
お。通った。
1:36 PM
スタックオーバーフローなの・・・?(こういう症状に、なるか・・・? (edited)
Avatar
ですね
Avatar
omochimetaru 4/13/2024 1:37 PM
The default stack size is 64KB: 65536
1:37 PM
試しに stack-size=65536 にしてみるね
Avatar
Wasmのスタック領域、デフォルトだとめっちゃ小さくてしかもガードページの概念が無いので超えちゃっても書き込めちゃうんですよね
Avatar
omochimetaru 4/13/2024 1:38 PM
おー死んだ > 65536
1:38 PM
超えるんだ・・・
1:38 PM
じゃあメチャクチャにメモリ破壊されてるのか
Avatar
で、さらに都合の悪いことにwasm-ldのデフォルトのメモリレイアウトがスタック領域をデータ領域の直後に置くんで、超えたときにデータを破壊し続けるんですよ
Avatar
omochimetaru 4/13/2024 1:39 PM
その結果ツリー構造とかがイカれてたまたまロジックが無限ループになったりしてる可能性があるか
1:39 PM
じゃあこれはブラウザでなくても同じか
1:39 PM
carton testerのenvironmentを変えたら詳しく調べられるのかな (edited)
Avatar
なのでcartonはデフォルトで -Xlinker --stack-first を付けて、スタック領域をメモリ空間の最初に置いて、超えたときに負のアドレスをデリファレンスさせるようにして暗黙の破壊を防いでるんですけど
Avatar
omochimetaru 4/13/2024 1:40 PM
なるほど。
Avatar
今回はcartonなしでビルドしたのでその保護機構が動いてなかった
Avatar
omochimetaru 4/13/2024 1:40 PM
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ --disable-build-manifest-caching \ -Xlinker -z -Xlinker stack-size=65536 CartonFrontend test \ --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm \ --environment browser
1:40 PM
stack-firstの指定はないンゴね
Avatar
stack-first付けといたほうが安全
1:41 PM
ちょっとサイズ増えるけど
Avatar
omochimetaru 4/13/2024 1:41 PM
このコマンドってでもcartonからパクって作ったはずだけどな
Avatar
あれ、じゃあデフォルトで付けてるのが嘘かも
Avatar
omochimetaru 4/13/2024 1:42 PM
error: link command failed with exit code 1 (use -v to see invocation) wasm-ld: error: --global-base cannot be less than stack size when --stack-first is used clang: error: linker command failed with exit code 1 (use -v to see invocation) [230/231] Linking swift-reactPackageTests.wasm ビルドできなくなった
1:43 PM
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ --disable-build-manifest-caching \ -Xlinker --stack-first \ -Xlinker -z -Xlinker stack-size=65536
Avatar
-Xlinker --global-base=65536 も一緒に付けると
Avatar
omochimetaru 4/13/2024 1:43 PM
hmhm
Avatar
最近変わったんだった
Avatar
omochimetaru 4/13/2024 1:44 PM
1:44 PM
フリーズする代わりにこの画面が出るようになった。
Avatar
Chromeだとどうです?
Avatar
omochimetaru 4/13/2024 1:45 PM
2024-04-13T22:44:40+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs An error occurred: RuntimeError: memory access out of bounds お、なんか出た
Avatar
お、出てる
Avatar
omochimetaru 4/13/2024 1:45 PM
最初からchromeを立ち上げるにはどうするんだっけ
1:45 PM
今はsafariが自動起動して、↑の表示になった後、手でchromeを繋げた
Avatar
WEBDRIVER_PATHにchromedriverコマンドを指定すると
1:46 PM
chromedriverはここから持ってくる https://chromedriver.chromium.org/downloads
Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading. For older versions of Chrome, please see below for the version of ChromeDriver
Avatar
omochimetaru 4/13/2024 1:47 PM
If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading.
1:47 PM
123だからこの注意書きが該当しそうだ
Avatar
omochimetaru 4/13/2024 1:51 PM
Safariが起動しちゃった コマンド直うちでもOSにブロックされる
Avatar
xattr -d com.apple.quarantine path/to/chromedriver
👀 1
Avatar
omochimetaru 4/13/2024 1:54 PM
chromedriverは起動できるようになったけどまだSafariが開くな
Avatar
webdriver使うのは--headlessのときだけだ
Avatar
omochimetaru 4/13/2024 1:55 PM
なるほど
1:55 PM
そういえば話に出てきた時はヘッドレスだった (edited)
1:55 PM
OSの標準ブラウザを切り替えればいいのかな
1:55 PM
どこだ・・・?
Avatar
普通に開かれるのはOS標準ブラウザ
Avatar
omochimetaru 4/13/2024 1:55 PM
画面の左上にある Apple メニュー  から「システム設定」を選択します。 サイドバーで「デスクトップと Dock」をクリックします。 右側で下にスクロールして、「デフォルトの Web ブラウザ」メニューから、使いたい Web ブラウザを選択します。
1:56 PM
「デスクトップとDock」←わかるわけないわ
Avatar
w
Avatar
omochimetaru 4/13/2024 1:56 PM
きた
1:56 PM
chromeだと、ブラウザは
Test run finished. Check the output of carton test for details.
1:56 PM
ターミナルは + swift build --experimental-swift-sdk wasm32-unknown-wasi --build-tests -Xswiftc -static-stdlib -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor -Xlinker --export-if-defined=__main_argc_argv --disable-build-manifest-caching -Xlinker --stack-first -Xlinker --global-base=65536 -Xlinker -z -Xlinker stack-size=65536 warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... warning: Could not read SDKSettings.json for SDK at: /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a-macos_arm64.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable warning: Could not read SDKSettings.json for SDK at: /Users/omochi/Library/org.swift.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-04-03-a-macos_arm64.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm/wasm32-unknown-wasi/WASI.sdk <unknown>:0: warning: libc not found for 'wasm32-unknown-wasi'; C stdlib may be unavailable [5/5] Emitting module swift_reactPackageTests Build complete! (0.64s) + CartonFrontend test --prebuilt-test-bundle-path .build/debug/swift-reactPackageTests.wasm --environment browser 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET / 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /favicon.ico 2024-04-13T22:56:33+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs An error occurred: RuntimeError: memory access out of bounds
1:57 PM
若干、意味不明だな。
Avatar
どちらにせよOOBで死んでるからスタック足りてない
Avatar
omochimetaru 4/13/2024 1:58 PM
Safariだと「問題が起きました」で、コンソールは 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /test.js 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /main.wasm 2024-04-13T22:58:03+0900 info org.swiftwasm.carton.dev-server : [CartonKit] GET /JavaScriptKit_JavaScriptKit.resources/Runtime/index.mjs これでサーバー継続してる
1:58 PM
不思議だ・・・
Avatar
ページから結果送る前にページが死んじゃってるんだろうな
Avatar
omochimetaru 4/13/2024 1:59 PM
あー、ブラウザのエンジンとGUIの噛み合わせみたいなところで実装の違いが出ているのか
Avatar
Avatar
Yuta Saito
どちらにせよOOBで死んでるからスタック足りてない
omochimetaru 4/13/2024 2:00 PM
これは、スタック領域を超えた結果、負のアドレスにアクセスしようとしたってこと?
Avatar
ですね。
Avatar
omochimetaru 4/13/2024 2:00 PM
負のアドレスだからout of bounds
2:00 PM
その時どうなるかは、SafariやChromeの実装次第、ということね。
Avatar
いやぁ流石にページクラッシュは何かがおかしなことになってると思うけど…
2:01 PM
普通は例外が投げられます
Avatar
omochimetaru 4/13/2024 2:01 PM
外形的な情報しかないからモヤっとするけどスタックオーバーフローが起きてるのは確定診断でいいのかな (edited)
Avatar
そうですね
Avatar
omochimetaru 4/13/2024 2:01 PM
わかった。ありがとう
Avatar
むかーしTokamakでも同じ問題にあたった事がある https://github.com/TokamakUI/Tokamak/issues/367
Describe the bug There's a certain snippet of code, which when rendererd in the browser triggers an infinite loop after clicking on a NavigationLink. To Reproduce Build and run this snippet wit...
Avatar
omochimetaru 4/13/2024 2:03 PM
テストケースを3つ入れた時に問題が起きるのはなんでだ?
2:03 PM
そうなってくると決定論的な症状に思えるが
2:04 PM
どれもテストケース(XCTestCase)1個だけならオーバーフローしないし
Avatar
コメントアウトしてフィルタしてました?
Avatar
omochimetaru 4/13/2024 2:04 PM
いや、ディレクトリから RenderTests.swift ファイルを取り除いてリビルドしてた
2:04 PM
Finderを2つ開いて、マウスで行ったり来たりさせて
2:04 PM
追加したり減らしたりしてた
Avatar
ソースが変わってるならバイナリ上のメモリレイアウトが変わるんで
Avatar
omochimetaru 4/13/2024 2:05 PM
あ〜!
2:05 PM
はみ出た場所に何があるかが違うのか・・・
Avatar
そうそう。なので再現むずい
Avatar
omochimetaru 4/13/2024 2:06 PM
初代ポケモンのバグみたいだ、しんどすぎるw
2:06 PM
macOSとかではスタックオーバーフローでちゃんと止まるのはどうなってるの?
Avatar
ガードページがあるんじゃないかな
Avatar
omochimetaru 4/13/2024 2:07 PM
なるほど
2:07 PM
うーんそうするとstack-firstで0番地を使うのは良い考えに思えるな
2:08 PM
というかそれしかないやん
2:08 PM
処理系に不正メモリアクセスとして気づいてもらう必要があるわけよね
Avatar
現状そうですね。
2:09 PM
昔.wasmに対してバイナリ変換をして関数のプロローグでスタックポインタの値をチェックするようなコードを挿入したり試してたんですけど
Avatar
omochimetaru 4/13/2024 2:10 PM
なるほど。オーバーヘッド凄そう。
2:10 PM
最適化阻害も起きるか・・・?
Avatar
そう。オーバーヘッドすごいしDWARFのオフセットも合わせて変えないといけないから超大変。
Avatar
Avatar
Yuta Saito
むかーしTokamakでも同じ問題にあたった事がある https://github.com/TokamakUI/Tokamak/issues/367
omochimetaru 4/13/2024 2:11 PM
@Yuta Saito please help, my debugging skills are not good enough for this. My only hypothesis is that something's weird with the metadata (maybe the Runtime library misreads some fields?) and this somehow messes everything up.
maxに共感しかないな
2:11 PM
そうすると第一安全弁はstack-firstを原則として
2:11 PM
第二は、スタックのサイズ幾つにすればいいんだ?
2:12 PM
全然考え方がわからない。
Avatar
たくさん
Avatar
omochimetaru 4/13/2024 2:12 PM
あれ?最初の状態だと
2:12 PM
ヒープの後ろ(大きい番地)にスタックがあるんですよね
2:12 PM
memory.growした時は
Avatar
逆ですね
2:13 PM
0, data, stack, heap (edited)
2:13 PM
--stack-firstだと 0, stack, data, heap
Avatar
omochimetaru 4/13/2024 2:13 PM
ああーなるほど スタックが小さいアドレスから大きいアドレスに育っていくのか
2:13 PM
stack-firstの時は伸びる方向が逆になる・・・?
2:14 PM
ああ、違うか、data領域に向かって伸びていく?
Avatar
いや、どちらも大きいアドレスから小さいアドレスに伸びてく
Avatar
omochimetaru 4/13/2024 2:14 PM
破壊されてるのはdataだったのか
Avatar
そうそう。ヒープは破壊されない
Avatar
omochimetaru 4/13/2024 2:14 PM
じゃあメタデータや実行命令が壊れんの?
Avatar
とか文字列リテラルとかグローバル変数とか
Avatar
omochimetaru 4/13/2024 2:14 PM
すごいな・・・
2:15 PM
それって安全なのか・・・?
2:15 PM
それを利用して攻撃できたりしないか?
Avatar
良いポイントですね。
Avatar
omochimetaru 4/13/2024 2:15 PM
狙って何かするのありえん難しそうだが
2:15 PM
でもwasmって逆に状態の再現性が高いからありえそう
Avatar
omochimetaru 4/13/2024 2:16 PM
Moreover, WebAssembly enables unique attacks, such as overwriting supposedly constant data or manipulating the heap using a stack overflow.
2:16 PM
わあw
2:17 PM
Everything Old is New Again: Binary Security of WebAssembly
2:17 PM
タイトルがいいね。
2:18 PM
default: 0, data, stack, heap --stack-first: 0, stack, data, heap レイアウトによらず、スタックサイズの決め方は同じだね
2:19 PM
でかいと溢れにくくなるけど、その代わり .wasm をロードした時に消費する初期メモリサイズがデカくなる、であってる? (edited)
Avatar
初期メモリサイズがデカくなったとしても汚れてないページなので大したペナルティにはならないはずで
Avatar
omochimetaru 4/13/2024 2:21 PM
なるほどなるほど
2:21 PM
macOSは8MBあるらしい。デフォルトの64KBの128倍か
Avatar
むしろdata領域へのアドレスが大きな値になるので、LEB128にエンコードされたアドレスを即値にもつ命令サイズが大きくなっちゃって
Avatar
omochimetaru 4/13/2024 2:21 PM
Avatar
バイナリサイズ自体が増えるのが痛いですね
Avatar
omochimetaru 4/13/2024 2:22 PM
むず!
2:22 PM
WASMの命令はそういうコーデックなのか
Avatar
LEB128はdwarfでも使われてる可変長フォーマットで
2:23 PM
値自体が大きくなればなるほどサイズが伸びてく
Avatar
omochimetaru 4/13/2024 2:23 PM
あれ、命令セットじゃなくてオブジェクトフォーマットの話?
Avatar
命令セット中の数値エンコーディング
🆗 1
Avatar
omochimetaru 4/13/2024 2:24 PM
data領域後ろに置きたくないンゴね・・・
2:25 PM
気持ちが生まれてしまった
Avatar
まああとは実測してバランス取るしか無いですねぇ
Avatar
omochimetaru 4/13/2024 2:25 PM
まあそうか
2:25 PM
その初期全体メモリサイズはどうしたらわかるん (edited)
Avatar
むずいな
2:28 PM
簡単な方法は思いつかなかった。。 wasm-objdumpでDataセグメントをダンプして、セグメントが要求するページサイズを64kbで掛けて、指定されてるベースアドレスと足し合わせるとわかる (edited)
Avatar
omochimetaru 4/13/2024 2:29 PM
結構難しかった
2:29 PM
当然処理系はfoo.wasm をロードした時点で数字がわかってるんだよね?
Avatar
もしくはブラウザ上でinstantiateしたinstanceからinstance.exports.memoryでメモリインスタンスをインスペクトすれば
👀 1
2:30 PM
処理系は知ってるけどそれを教えてくれる口が無い
Avatar
omochimetaru 4/13/2024 2:30 PM
家庭くんの作ったwasminspectではわからん?
Avatar
そういう機能を作れば分かるけど、それ作るならwasm-objdumpの出力を勉強するほうが早そう
Avatar
omochimetaru 4/13/2024 2:33 PM
なるほど
2:35 PM
2:35 PM
こういうことか
Avatar
それそれ
Avatar
omochimetaru 4/13/2024 2:37 PM
stack-firstを外しても全く変わらなかった 何かミスってるかな
Avatar
おー?じゃあサイズのペナルティ分がページサイズのアライメントで足されるパディング分で収まってるってことかな
Avatar
omochimetaru 4/13/2024 2:38 PM
stack-sizeを128KBから8MBにしてみた
2:38 PM
これはちゃんと増えたな
Avatar
じゃあその規模だとstack-firstのサイズオーバーヘッドは大した事ないということで
Avatar
omochimetaru 4/13/2024 2:39 PM
5,111,808 13,369,344 ちゃんと8MBぐらい増えている
Avatar
Avatar
Yuta Saito
おー?じゃあサイズのペナルティ分がページサイズのアライメントで足されるパディング分で収まってるってことかな
omochimetaru 4/13/2024 2:39 PM
なるほど・・・そういうこともあるのか
2:40 PM
そもそも初期状態で5MB使ってるならスタック1MBぐらいにしとこ
2:40 PM
exportsからArrayBufferとしてメモリ見えてるの面白いですね
Avatar
よさそう
2:40 PM
JavaScriptからいじり放題
Avatar
omochimetaru 4/13/2024 2:41 PM
今めちゃくちゃローレベルな気持ちになってたのに
2:41 PM
急にハイレベルになって脳がバグった
Avatar
たしかにw
2:44 PM
Tokamakで初めてスタックオーバーフローの問題をデバッグしたときにデバッガ拡張したの思い出した https://twitter.com/kateinoigakukun/status/1378858885801340929?s=20 (edited)
My WebAssembly debugger started interacting with JavaScript host-environment!
Avatar
omochimetaru 4/13/2024 2:45 PM
あ、wasminspectって実行環境は持ってなくて、ブラウザのそれと通信してデバッグするツールなのか
Avatar
いや、これはJavaScript上のWebAssemblyクラスとメソッドを全てフックして、ブラウザからホストのwasminspectとRPCして、wasminspect上で実行してる
Avatar
omochimetaru 4/13/2024 2:46 PM
えぐ
Avatar
エクストリームデバッグ環境
Avatar
omochimetaru 4/13/2024 2:46 PM
なるほど JavaScriptっぽい世界
Avatar
でもこれっきり使う機会は無かったな…
2:47 PM
A debugger agent of wasminspect for JavaScript host environment. - kateinoigakukun/wasminspect-agent.js
Avatar
omochimetaru 4/13/2024 2:47 PM
WASMがJS側をみるところも抑えられるから
2:47 PM
ブラウザからWASMの箱だけ抜き出したような状態なのか
Avatar
そうそう。リポジトリに絵がある
Avatar
omochimetaru 4/13/2024 2:48 PM
えぐいなこれw
2:48 PM
心臓手術で使う人工心肺みたいだ
Avatar
人工心肺w 完全にそれだ
Avatar
omochimetaru 4/13/2024 2:48 PM
血は回ってるので体は手術されてることに気づかない・・・ (edited)
2:49 PM
いやーありがとう テストも通ってたし、設定変えたからしばらく心配なさそうだ 家庭くん居なかったらマジでこれ無理すぎた
2:50 PM
swift-wasmが思ったよりエクストリームだ
Avatar
もうちょっと「普通」の環境にしたい
Avatar
omochimetaru 4/13/2024 2:51 PM
てかブラウザってJSが無限ループしてもフリーズしないよね
2:51 PM
WASMが暴走しててもGUIは生きててほしいね
Avatar
フリーズするんじゃないですか?
Avatar
omochimetaru 4/13/2024 2:51 PM
そうだっけ・・・?
Avatar
そのはず。メインスレッドをフリーズさせない一番確実な方法はWorkerで走らせることですね (edited)
naruhodo 1
Avatar
omochimetaru 4/13/2024 2:53 PM
あーほんとだ
2:53 PM
同じ状態になった
Avatar
そうなんすよ
Avatar
omochimetaru 4/13/2024 2:55 PM
Safariだと右クリックできないけどSafari全体は生きてて、タブを閉じるバツボタンは生きてて
2:55 PM
そこでタブを閉じて脱出する感じだわ
2:56 PM
なるほどなー
Avatar
スタック使いすぎて破壊しちゃうの、https://github.com/WebAssembly/multi-memory 使えると嬉しいのかな (実装大変そうだけど…
Multiple per-module memories for Wasm. Contribute to WebAssembly/multi-memory development by creating an account on GitHub.
Avatar
嬉しいのかな?そこが絡んでくるのは知らなかった
Avatar
omochimetaru 4/15/2024 5:09 PM
CIでheadless chromeでWASM + JSの実行がテストできた。
5:11 PM
Cartonをビルドするところが一番重たい
Avatar
まだそんなにかかるかー
5:16 PM
NIOすらやめる?
5:17 PM
別にノンブロッキングである必要は全く無いんだよな
Avatar
omochimetaru 4/15/2024 5:19 PM
勝手にprebuildしようかなと考えてた
Avatar
みんな困るならcarton側でartifactbundle用意するか依存減らすかしたいなぁ
Avatar
omochimetaru 4/16/2024 2:10 PM
prebuild早くて最高や
Avatar
omochimetaru 4/16/2024 2:34 PM
GitHubのこれって時刻順じゃなくて名前順なの・・・?
Avatar
swift-format とか見るとわかりやすいですけど,時間順でも名前順でもなくてコミットが進んでる順だったと思います
Avatar
gitのコミットってどうやって順序付けるんだろう
Avatar
Avatar
kebo
swift-format とか見るとわかりやすいですけど,時間順でも名前順でもなくてコミットが進んでる順だったと思います
omochimetaru 4/16/2024 2:59 PM
いや〜そう思って試したんですが、04-17は1.0.2から1コミット伸びてるんですよ
2:59 PM
また、04-16と1.0.2は同じコミットです。(↑のSSでも写り込んでます)
Avatar
Avatar
Yuta Saito
gitのコミットってどうやって順序付けるんだろう
omochimetaru 4/16/2024 3:02 PM
有向グラフは半順序で順序付けできるので順序付けできない組があるね
Avatar
Avatar
kebo
swift-format とか見るとわかりやすいですけど,時間順でも名前順でもなくてコミットが進んでる順だったと思います
omochimetaru 4/16/2024 3:03 PM
swift-formatは望ましい状態ですね、どうやってるか見てみます
3:07 PM
リリースプロセスが不明だ・・・
Avatar
Avatar
omochimetaru
swift-formatは望ましい状態ですね、どうやってるか見てみます
望ましい状況ではないですよ. swift-syntax が Swift 実装になって以降は,509.0.0 までは swift-syntax のバージョンに合わせたバージョン番号になっていたんですが,Swift 6.0 からツールチェーンに同梱されるようになったので,5.10 向けのバージョンではツールチェーンのリリースタイミングで release/5.10 branch から swift-5.10-RELEASE のタグが打たれたんですが,それが初めてなので release/5.10 branch の準備ができていなくて 509.0.0 では含まれていたいろんな変更を cherry-pick し忘れられていて,それを解決するためにそのあと打たれた 510.0.0 でも関係者間の連携が取れていなくてまだ cherry-pick し忘れられていて,ようやく方針が定まって打たれたのが 510.1.0 という感じです.なので main から cherry-pick されている分コミットが進んでいる 509.0.0 の方が 510.0.0 より前に作られたのに上にあるという面白い状況になってます. (edited)
3:15 PM
(そしてよく見たらタグを打ったコミットの日時で並んでいました)
Avatar
omochimetaru 4/16/2024 3:18 PM
本当だ。バージョンとRELEASEが混ざって並んでいるので、名前順を避けられていると思ったけど、その中の順番は変ですね。
Avatar
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --build-tests \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ --disable-build-manifest-caching \ -Xlinker --stack-first \ -Xlinker --global-base=1048576 \ -Xlinker -z -Xlinker stack-size=1048576 この辺のパラメータ、 -Xswiftc とか -XlinkerPackage.swift に書くことができるけど、 --experimental-swift-sdk wasm32-unknown-wasi は書けないですよね?
12:55 AM
適切なsdkを選ぶのは $ swift build を使う人の責任、という設計は正しいんだろうか? これwasmというよりswiftpm cliの設計の話かな
12:57 AM
例えばSwiftPM Packageとして iOSアプリを作るとして(できないけど)
12:57 AM
パッケージが対象とするプラットフォームはもう決まってるから、 Package.swift で宣言できるのが正しい気がする
Avatar
iOSでもsimulator向けかどうか、armかx86かみたいな択がありませんか?
1:21 AM
いまってその指定はPackage.swiftにはなくてビルド時にフラグ渡してるので、それと同じ指定に感じてました
Avatar
omochimetaru 4/17/2024 1:38 AM
たしかにXcodeだとdestinationを選ぶUIになってますね その部分と似てますね
1:40 AM
Xcodeならguiから選択肢を選ぶから簡単だし、前回の値が残ってるから作業も再開しやすいが、
1:40 AM
cuiでこのwasmのやつを選ぶ(というか覚えてないといけない)のが難しいのが嫌だな (edited)
Avatar
ラップしたスクリプトに埋め込んでるなぁ
Avatar
Avatar
omochimetaru
cuiでこのwasmのやつを選ぶ(というか覚えてないといけない)のが難しいのが嫌だな (edited)
stabilize されれば -swift-sdk で短くなりますがそれでもだめですかね?
2:59 AM
CLI ツールを作ってるとホスト環境向けにも Wasm 向けにもビルドするのでむしろ固定しないほうが便利だったりします
👀 1
Avatar
Avatar
kebo
stabilize されれば -swift-sdk で短くなりますがそれでもだめですかね?
omochimetaru 4/17/2024 2:59 AM
そこは嬉しいけどどっちかというとその後ろに書くトリプルがつらいですね、覚えられません
3:00 AM
たしかにそもそもクロスプラットフォームなプロジェクトの場合は自然か
Avatar
クロスプラットフォームに対応しないプロジェクトが大半なのは分かる。分かるが、、
Avatar
omochimetaru 4/17/2024 3:02 AM
PackageにdefaultSDK: “wasm32-unknown-wasi”が書ける、ぐらいだとどうかなー (edited)
Avatar
んー、パッケージの設定では無いと思うんだよなぁ。依存パッケージにそれが書かれてても無視されて欲しいのとかを考えると。 (edited)
Avatar
omochimetaru 4/17/2024 3:04 AM
ターゲットの設定?
Avatar
いや、プロジェクトの設定かな
3:05 AM
ユーザがswiftpmコマンドを叩く単位
Avatar
omochimetaru 4/17/2024 3:06 AM
.swift-versionみたいな?
Avatar
みたいな
Avatar
omochimetaru 4/17/2024 3:06 AM
.swift-sdk
3:06 AM
なんかもっと色々書きたいよな。
Avatar
例えばEmbeddedターゲットビルドで成果物のダイナミックライブラリの拡張子をコントロールをしたい、とか細々した話もあって
3:08 AM
そういうプロジェクト固有の設定を記述できる機能があってもいいなと思ってます
Avatar
omochimetaru 4/17/2024 3:08 AM
なるほど。 でもそれはsdkを選んだら決まるとちょうど良さそう?
Avatar
Swift SDKじゃなくてターゲットトリプルなんですよね
3:10 AM
で、ターゲットトリプルだけでも正確には足りなくて
Avatar
omochimetaru 4/17/2024 3:10 AM
ふむふむ
Avatar
none OSに対してどの拡張子を使うべきかって一意に決まらないんですよ
Avatar
omochimetaru 4/17/2024 3:10 AM
sdkを選ぶときにトリプルを指定してるけど違う概念なのか
3:11 AM
noneOSなるほど
Avatar
ああそこは正確には違う概念ですね
Avatar
omochimetaru 4/17/2024 3:11 AM
マジで難しい
Avatar
--experimental-swift-sdkにはArtifact IDが指定できて
Avatar
omochimetaru 4/17/2024 3:11 AM
object formatはしらんけど標準ライブラリは提供できる、という状態があるのか。。
Avatar
ターゲットトリプルを指定できるのはあくまでショートハンド
naruhodo 1
Avatar
omochimetaru 4/17/2024 3:13 AM
(長いショートハンドだなあ…
Avatar
複数のSwift SDKがそのトリプルをサポートしてる場合曖昧になって警告出る
Avatar
omochimetaru 4/17/2024 3:13 AM
なるほど、それはよく出来てるな
3:13 AM
そうするとインストール環境によってはトリプルでは不適切だったりするわけか
3:14 AM
この設定はマシン依存なのか・・・
Avatar
しかも一つのSwift SDK自体は複数のトリプルをサポートできるので、本当に一意に決めるにはトリプルとArtifact IDが指定できるべきなんだけど実装が追いついてない
Avatar
omochimetaru 4/17/2024 3:15 AM
いや難しいな 曖昧な場合にデフォルトではこっち、みたいな概念があった方が良さそうな気もする そうするとプロジェクト設定として共有してうまくいきそう
Avatar
Avatar
Yuta Saito
しかも一つのSwift SDK自体は複数のトリプルをサポートできるので、本当に一意に決めるにはトリプルとArtifact IDが指定できるべきなんだけど実装が追いついてない
omochimetaru 4/17/2024 3:15 AM
www
3:16 AM
トリプルかぶりのsdkを2つ入れたら詰むのか?指定できない
3:17 AM
トリプル複数持ってて被ってるSDKが複数あると詰む
👀 1
3:18 AM
なのでwasm32-known-wasiとwasm32-unknown-wasip1-threadsのSDKは分けて配布することにした
naruhodo 1
3:19 AM
しかしこの設定ファイル、targetとtarget-dirでtargetの意味が変わるの難しいな。
Avatar
omochimetaru 4/17/2024 3:19 AM
(歯医者にきた
🦷 1
Avatar
SwiftPMもモジュール単位にtargetを使っちゃったからややこしいことになってるけど。
Avatar
Avatar
omochimetaru
トリプルかぶりのsdkを2つ入れたら詰むのか?指定できない
swift experimental-sdk list で出てくる文字列をコピペすれば衝突しないですよ.私は大体複数入れてるのでいつもそれで回避してます.そう言う意味では実は出てきたものをそのまま入力すればよくてトリプルを覚える必要は必ずしもないですね.
naruhodo 1
4:28 AM
ショートハンドとして指定できるトリプルも実は —triple と微妙に仕様が違うのが厄介で例えば wasm32-wasi とかの省略した指定が —experimental-swift-sdk の方だとできないみたいな違いがあったような記憶があります
Avatar
(上の例は省略できるのが none と unknown を勘違いして書いてたかもしれないですが,wasm32-unknown-wasip1-threads が使える使えないとか他のところでも違いがあった記憶が)
Avatar
omochimetaru 4/17/2024 4:23 PM
https://github.com/swiftwasm/carton/pull/428 cartonのJSをTSにするパッチを投げた 根回し全くしてないけど 手元で勝手にTS化したのでそのついで
entrypointのスクリプトはcartonのために作られていますが、 cartonを使わない構成においても再利用しやすいと便利です。 例えば、僕が作っているライブラリの開発においては、 cartonを使わないユーザと使うユーザの両方に対応するために、 それぞれの構成をテストしています。 前者において、cartonのentrypointと重複した作業が生じるので、 スクリプトを再利用したく...
4:24 PM
ここ1年ぐらい家庭くんしかメジャーなコミットしてなさそうだったから日本語
Avatar
マージしました
Avatar
omochimetaru 4/17/2024 4:37 PM
はや
4:38 PM
取り回しやすいからJSにしておきたいとかもあんのかなと思った
Avatar
すでにバンドラーでバンドルしないといけないんでまあ取りまわしやすさは変わらないかなと
4:42 PM
他で使うのであればパッケージとして切り出した方が良いのだろうか
Avatar
omochimetaru 4/17/2024 4:42 PM
// @ts-ignore 外したいんだけどしばらく色々やったけどダメだったんだよなあ .mjs 周りとかはめんどくさい事になっとるなと思った (edited)
Avatar
結局ダイナミックにロードしてる時点でその辺は気持ち程度の安全性しか無いんでw
Avatar
Avatar
Yuta Saito
他で使うのであればパッケージとして切り出した方が良いのだろうか
omochimetaru 4/17/2024 4:43 PM
パッケージになってたら嬉しいけどJavaScriptKitもパッケージになってて欲しいんだよね
4:44 PM
でもそうするとSwift側のJavaScriptKitと、JS側のJavaScriptKitのバージョンを同期させる機構がないのが微妙だなと思っている (edited)
4:44 PM
JavaScriptKitのSwiftPMのリソースバンドルを配布させる現状のアプローチだとそこが同期取れるメリットがあるよね (edited)
Avatar
うむ。昔はnpmにもpublishしてたけどリソース含められるようになってからやめた。
Avatar
omochimetaru 4/17/2024 4:45 PM
Avatar
やはりcartonにSwiftPM packageからnpmパッケージを作る機能があると良いのではないか
Avatar
omochimetaru 4/17/2024 4:45 PM
今手元のcarton無し構成だとこうなってて
4:46 PM
JavaScriptKitとcartonのWasmRunnerを全部いっぺんに型チェック&バンドルしてる
4:46 PM
load.tsentrypoint/bundle.js だったもので
4:47 PM
WasmRunner.tsentrypoint/common.js だったものね
4:47 PM
エントリポイントのHTMLが load.ts 経由で .wasm を渡して起動する
4:47 PM
(元のbundle.js とかは .wasm の名前がコードに焼かれてるけど、そこをパラメータ化している) (edited)
4:51 PM
JavaScriptKitのバージョンがズレうる問題はあるけど、JavaScript側のスタックとしてはこれが綺麗だと思う
4:52 PM
4:53 PM
こうするとvitejsが HTMLの script タグでインラインに書いてあったスクリプトをもう一回巻き上げてくれる。(src参照にすり替わってる) (edited)
Avatar
これはJavaScriptKitのRuntimeはTypeScriptでないとだめ?
4:57 PM
ESM + .d.tsでもいい?
Avatar
omochimetaru 4/17/2024 4:59 PM
編集しないから .js (sourcemap付き) と .d.ts だったら本質的に同じはず (edited)
5:00 PM
C言語で言うと foo.tsfoo.c + foo.h で、 foo.jslibfoo.a で、 foo.d.tsfoo.h という認識 (edited)
5:03 PM
Swiftでいうと libfoo.dyliblibfoo.swiftinterface もあった
Avatar
omochimetaru 4/17/2024 5:29 PM
お。よかった
Avatar
Avatar
Yuta Saito
まずSwiftPMのビルドシステムがクロスコンパイル+マクロに対応しきれてないのでそれを直す必要があって、、 (edited)
これは直せたという理解で合ってますかね…? https://github.com/apple/swift-package-manager/pull/7353 (edited)
Reverts #7352. Modified to build tests for the host triple when any macros are added to test modules directly as dependencies.
Avatar
なおってるはず…!
t_yatta 1
Avatar
vitejsが賢くてなんかwasmをリビルドしたらホットリロードできてウケる
Avatar
omochimetaru 4/18/2024 1:01 PM
うーん謎だ
1:01 PM
wasmでビルドした後に、同じ場所でmacでビルドすると
1:01 PM
このようになって壊れるが
1:01 PM
必ず壊れるわけでもない
Avatar
何日のSwiftPMですか?
Avatar
omochimetaru 4/18/2024 1:13 PM
[omochi@omochi-mbp BrowserTests (add-brtest =)]$ echo $TOOLCHAINS org.swift.59202404021a 4/2
1:15 PM
てか、かなりおかしくて、
1:15 PM
sleepの後の swift build は、mac対象のはずなのに、 .build/wasm32-unknown-wasi がどうのこうのと出る (edited)
Avatar
2番目のswift buildに --disable-build-manifest-caching つけるとどうですか
1:18 PM
disableしないといけない状況は明らかにおかしいんだけど。
1:18 PM
ターゲットトリプルが変わってるのにビルドプランが組み直されてないんですよね。
Avatar
omochimetaru 4/18/2024 1:19 PM
お、今、 WASM build 成功 mac build 成功 WASM build 成功 mac build このエラーで死亡 となった
Avatar
必ず壊れるわけでないのが意味わからないんだよな
Avatar
Avatar
Yuta Saito
2番目のswift buildに --disable-build-manifest-caching つけるとどうですか
omochimetaru 4/18/2024 1:19 PM
ちょい待ってね 壊れ方を確定させないと、効果が測定できない
1:19 PM
rm .build から
1:20 PM
wasm ok, mac ok, wasm ok, mac ok, wasm ok, mac -> ERROR
1:20 PM
今回は3週目で壊れたな
1:21 PM
もう一回やってみよう
1:21 PM
あ、同じだ
1:21 PM
rm -rf, wasm, mac, wasm, mac, wasm, mac -> ERROR
1:22 PM
一度壊れたらもうmacは毎回死ぬから
1:22 PM
ここでオプションをつけてみる
1:22 PM
お〜直った!!
1:23 PM
あ、よく見たら、wasm側のコマンドには最初から --disable-build-manifest-caching \ がついていた
1:23 PM
家庭くんが教えてくれたやつ
1:23 PM
だから必ずmacの方だけ壊れるのか
Avatar
おそらくそれが無いと2回目のwasmで死ぬのでは
Avatar
omochimetaru 4/18/2024 1:23 PM
両方から外して最初からやってみるか
1:24 PM
rm -rf, wasm ok, mac ok, wasm ok, mac ok, wasm ERROR!
1:25 PM
3回目のwasmで死ぬ、wasmもmacも2回は通る
1:25 PM
これ、1回目はコンパイルが発生していて
1:25 PM
2回目は変更チェックが効いてすぐ終わるから
1:25 PM
変更チェックが効いた時の挙動で壊れた状態になって
1:25 PM
3回目で発症してる気がする
Avatar
2回目と3回目の差がわからないなぁ
Avatar
omochimetaru 4/18/2024 1:26 PM
[omochi@omochi-mbp BrowserTests (add-brtest *=)]$ bin/build + swift build --experimental-swift-sdk wasm32-unknown-wasi -Xswiftc -static-stdlib -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor -Xlinker --export-if-defined=__main_argc_argv -Xlinker --stack-first -Xlinker --global-base=1048576 -Xlinker -z -Xlinker stack-size=1048576 warning: 'browsertests': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/Sources/QSDisplayingData/styles.css warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... [1/1] Write swift-version-37CF2ABA3CB73B3C.txt Build complete! (0.18s) + swift build warning: 'browsertests': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/Sources/QSDisplayingData/styles.css warning: 'swift-algorithms': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target /Users/omochi/github/omochi/swift-react/BrowserTests/.build/checkouts/swift-algorithms/Sources/Algorithms/Documentation.docc Building for debugging... [1/1] Write swift-version-37CF2ABA3CB73B3C.txt Build complete! (0.19s)
1:26 PM
2回目で出てくるこの Write swift-version-37CF2ABA3CB73B3C.txt
1:26 PM
wasmとmacで同じ番号なのが怪しい
1:27 PM
1回目は Write swift-version-37CF2ABA3CB73B3C.txt ってメッセージがない
Avatar
--jobs 1 --verbose でログ取って比較してみてください
Avatar
omochimetaru 4/18/2024 1:27 PM
なるほど
Avatar
swift-version-XXXXはコンパイラ実行ファイルパスのハッシュ値なので同じで大丈夫
😀 1
Avatar
omochimetaru 4/18/2024 1:34 PM
??
Avatar
Avatar
Yuta Saito
--jobs 1 --verbose でログ取って比較してみてください
omochimetaru 4/18/2024 1:35 PM
これつけると一発目のwasmが通らなくなる
Avatar
???????
Avatar
omochimetaru 4/18/2024 1:35 PM
swift build --experimental-swift-sdk wasm32-unknown-wasi \ --jobs 1 --verbose \ -Xswiftc -static-stdlib \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ -Xlinker --stack-first \ -Xlinker --global-base=1048576 \ -Xlinker -z -Xlinker stack-size=1048576
1:35 PM
jobs と verboseってこの場所でもいい?
Avatar
いいはず
Avatar
omochimetaru 4/18/2024 1:36 PM
1.44 MB
1:37 PM
このように、wasm-ldが大量のundefined symbolを吐いて死ぬ
1:38 PM
1:38 PM
jobs 2 にしたら通った
Avatar
それも発症情報もらってるんだけどよく分かってない https://github.com/swiftwasm/swift/issues/5580
Steps to reproduce: Create a new package with swift package init --type executable Add JavaScriptKit as a dependency. My Package.swift file is as follows: // swift-tools-version: 5.9 // The swift-t...
Avatar
omochimetaru 4/18/2024 1:38 PM
並列だと壊れるならわかるんだけど
1:38 PM
1列にすると壊れるってなんだw
Avatar
autolink情報がなぜか足りてない
1:39 PM
多分依存エッジが足りてないんだろう (edited)
Avatar
omochimetaru 4/18/2024 1:39 PM
並列の時とそうでない時でちょっと動作が違うんかな?
1:40 PM
並列でも動くように何かが緩いロジックに変わるみたいな
1:40 PM
それで本来不適切な構成になってるんだけど許されてしまう
Avatar
とりあえずワークアラウンド Workaround: Add import _RegexParser in a Swift file.
Avatar
omochimetaru 4/18/2024 1:40 PM
1:40 PM
やってみる
1:41 PM
import文からmoduleのautolink情報が焼かれるのか
1:42 PM
1:42 PM
なんかやる必要あるんだっけ?
1:42 PM
お、CLI (wasm) は通った (edited)
Avatar
Xcodeはしらない
Avatar
omochimetaru 4/18/2024 1:43 PM
Xcodeは謎の状態だ
1:44 PM
まずjobs1の状態で
1:44 PM
問題の再現を確認します
Avatar
omochimetaru 4/18/2024 1:45 PM
あ〜なんか、同じになっちゃいそうだね
Avatar
ターゲットトリプルを変えたとき、llbuild上のコマンドのシグネチャをチェックするんですがおそらく最初の1/3くらいのバイト列だけが変わってて、後半完全に同じになりそうで
Avatar
omochimetaru 4/18/2024 1:47 PM
(エラー出力がリダイレクト取れてねえ・・・やり直す)
Avatar
llbuildの実装によっては衝突しかねないなと (edited)
Avatar
omochimetaru 4/18/2024 1:51 PM
取れたぞ
1:51 PM
ビルドコマンド
417 bytes
1:51 PM
rm -rf .build した後の1週目
2.08 MB
1:51 PM
2週目 (キャッシュが効いてすぐ終わる)
1.66 KB
1:52 PM
3週目 (エラーでてすぐ止まる)
3.88 KB
1:53 PM
2週目が --verbose なのにほぼ何も出ないんだよな でも3週目で必ず死ぬから2週目で起きた副作用が問題っぽいけど
1:54 PM
あー1週目にも Write auxiliary file /Users/omochi/github/omochi/swift-react/BrowserTests/.build/arm64-apple-macosx/debug/swift-version-37CF2ABA3CB73B3C.txt こいつはいた
1:54 PM
[omochi@omochi-mbp BrowserTests (add-brtest *%=)]$ cat .build/debug/swift-version-37CF2ABA3CB73B3C.txt Apple Swift version 6.0-dev (LLVM 3dd3bce1adb5b65, Swift 1f09be97a890c3e) Target: arm64-apple-macosx14.0 中身ただのバージョンだった
1:56 PM
Xcodeはtoolchainを切り替えて4/2版にすれば import _RegexBuilder が書いてあっても大丈夫になった
Avatar
ああXcodeのツールチェイン選んでたのか
Avatar
omochimetaru 4/18/2024 1:57 PM
はい Xcodeのツールチェイン切り替えモードはなんか不安定だからギリギリまで避けてた
1:57 PM
どうせXcodeからWASM向けビルドはしないからそれでよかった。 (edited)
Avatar
正しい判断だ
Avatar
omochimetaru 4/18/2024 1:57 PM
あと import _RegexBuilder って普通にできてたと思う・・・
Avatar
Avatar
Yuta Saito
--jobs 1 --verbose でログ取って比較してみてください
omochimetaru 4/18/2024 1:59 PM
結局2週目と1週目の差分で怪しい部分は見つけられなかった。
1:59 PM
というか2週目の内容が少なすぎて探すまでもない。
Avatar
ビルドディレクトリ以下を全部アーカイブしておくと色んな情報が残ってるはず (edited)
Avatar
omochimetaru 4/18/2024 2:00 PM
確かに
2:00 PM
全部複製してdiffしたらいいのか
2:00 PM
2回目の犯罪行為がわかる
Avatar
とくに .build/debug.ymlの差分が気になる
Avatar
omochimetaru 4/18/2024 2:01 PM
やってみる
2:04 PM
[omochi@omochi-mbp BrowserTests (add-brtest *%=)]$ diff -r .build .build1 Binary files .build/arm64-apple-macosx/build.db and .build1/arm64-apple-macosx/build.db differ Binary files .build/wasm32-unknown-wasi/build.db and .build1/wasm32-unknown-wasi/build.db differ
2:05 PM
@Yuta Saito 謎のバイナリだけ違うって
Avatar
sqliteっすね
Avatar
omochimetaru 4/18/2024 2:05 PM
・・・
2:05 PM
見に行くか・・・
Avatar
お、Linuxでも再現した
Avatar
omochimetaru 4/18/2024 2:06 PM
Avatar
手元のSonomaだと最新のスナップショット壊れてて再現難しかった
2:08 PM
ここまで再現できればプリントデバッグできるな
Avatar
omochimetaru 4/18/2024 2:10 PM
5.48 KB
2:10 PM
WASMの方の1週目と2週目のSQLiteの中身をCSVでダンプしたもののdiffを撮った
2:11 PM
なんもわからんな あーこれカラムがbinaryあるのか
2:11 PM
CSVにしたら壊れちゃった
Avatar
おそらくそれがシグネチャかな
Avatar
omochimetaru 4/18/2024 2:12 PM
2:12 PM
valueとdependenciesがBLOB
Avatar
あれsignatureってintegerなんだ
Avatar
omochimetaru 4/18/2024 2:13 PM
2:13 PM
同じ値が多い
2:13 PM
全部同じってわけではない
Avatar
1回目のビルドで PackageStructureCommand.getSignatureが呼ばれてない
Avatar
omochimetaru 4/18/2024 2:24 PM
2:24 PM
signature = 0 のこと?
Avatar
おそらく呼ばれない場合0にすらならず PackageStructureターゲットのレコードが残らないはず
Avatar
omochimetaru 4/18/2024 2:28 PM
なるほど
2:29 PM
それだいぶやばそう
Avatar
一回目のビルドログ
678.69 KB
809.09 KB
2:29 PM
PackageStructureCommand signature: XXX bytes という行があればシグネチャが計算されてる
2:29 PM
2回目のビルド
502 bytes
497 bytes
2:30 PM
3回目
Avatar
omochimetaru 4/18/2024 2:31 PM
僕のログそれ出たことないな
Avatar
3回目でgetSignatureが返すシグネチャは変わってるけど "Planning build"が出ないのがおかしいな
Avatar
omochimetaru 4/18/2024 2:32 PM
あ、違う、これprintdebugかw
Avatar
プリント仕込み始めたw
Avatar
omochimetaru 4/18/2024 2:33 PM
2回目のwasmのシグネチャと、3回目のlinuxのシグネチャが同じ9237 bytesなのが気になるね
Avatar
3回目はwasmなので同じでOK
Avatar
omochimetaru 4/18/2024 2:34 PM
ああ、エラーログが何故かlinuxのパスなだけか
Avatar
シグネチャをbase64でエンコードした
Avatar
Avatar
Yuta Saito
シグネチャをbase64でエンコードした
omochimetaru 4/18/2024 2:36 PM
これ普通にデコードしたら結構テキスト出てくるね
2:37 PM
Avatar
BuildParameterをJSONにしただけかな
Avatar
omochimetaru 4/18/2024 2:37 PM
final class PackageStructureCommand: CustomLLBuildCommand { override func getSignature(_: SPMLLBuild.Command) -> [UInt8] { let encoder = JSONEncoder.makeWithDefaults() // Include build parameters and process env in the signature. var hash = Data() hash += try! encoder.encode(self.context.productsBuildParameters) hash += try! encoder.encode(self.context.toolsBuildParameters) hash += try! encoder.encode(ProcessEnv.vars) return [UInt8](hash) }
2:37 PM
これみる限りJSONが3個入ってるだけやな
2:38 PM
キーの順番もソートされてるっぽいから、diff取れそうだ
Avatar
llbuildレベルでもシグネチャは変わってることが確認できた
Avatar
omochimetaru 4/18/2024 2:55 PM
あれ
2:55 PM
じゃあ違うはずのシグネチャが同じになって混ざる説はハズレ?
Avatar
ハズレっぽい
2:58 PM
あー分かった気がする
Avatar
omochimetaru 4/18/2024 2:59 PM
Avatar
1回目のビルドではhost/wasm共に PackageStructure ターゲットのビルドがトリガーされないのでシグネチャがbuild.dbに記録されない。 (edited)
3:00 PM
2回目のビルドでは .build/debug.yml ファイルが存在するので PackageStructure ターゲットのビルドをトリガーしてビルドパラメータに更新があるかチェックする。ただし1回目でこのターゲットをビルドしてないので常に更新がある判定になるので .build/debug.ymlを作り直す。 (edited)
3:02 PM
ここでhost/wasm共に build.db にシグネチャが記録される。
3:05 PM
3回目のwasmビルドでも .build/debug.yml ファイルが存在するのでPackageStructure ターゲットのビルドをトリガーして更新チェックする。 直前にhostビルドをしているので debug.ymlはhostの状態。ただしbuild.dbにはシグネチャが記録されておりビルド済み判定になり、debug.ymlを作り直さずにビルドを開始する。(本来は2回目のwasmビルドの時点のdebug.ymlに書き戻すべき。)
3:06 PM
これなら3回目で失敗する説明が付く (edited)
3:08 PM
書き戻すと言うか2回目のwasm, hostのhostの時点でwasmのシグネチャをinvalidateするべきでは
Avatar
omochimetaru 4/18/2024 3:08 PM
シグネチャの一致はターゲットごとのDBの中身と比べてるけど
3:08 PM
シグネチャが一致した時に再利用するパラメータは、ターゲット関係ないところに置いてある .build/debug.yml を参照するってこと?? (edited)
Avatar
はい
Avatar
omochimetaru 4/18/2024 3:08 PM
設計
3:09 PM
破綻しとる
3:09 PM
1回目云々の話は別のバグで
3:09 PM
仮にそれがなおっても単に問題が3回目じゃなくて2回目に起きるようになるだけってことかな (edited)
Avatar
そうですね
3:10 PM
はあ
Avatar
omochimetaru 4/18/2024 3:10 PM
2つの壊れがあったのか
3:11 PM
.build/debug.yml なんてものが存在しているのがおかしくて
3:11 PM
.build/arm64-apple-macosx/debug.yml.build/wasm32-unknown-wasi/debug.yml
3:11 PM
別々に管理するべきってことか?
Avatar
いや、.build/debug.ymlがあるのは良い
3:12 PM
ターゲットトリプルでディレクトリ切ったところで同じトリプルの中でのバリエーションがあるので意味ない
naruhodo 1
3:13 PM
間違ってるのは1度でもシグネチャAでビルドが成功しており前回のシグネチャがBだった場合に、コマンドシグネチャAが来てもリビルドしないことか (edited)
3:17 PM
えー、本当にそんな事あるか?
Avatar
omochimetaru 4/18/2024 3:17 PM
設計がおかしすぎるようにしか見えん・・・ (edited)
Avatar
このターゲットは若干特殊で
3:18 PM
普通のファイルタイムスタンプベースなら単調に値が増えていくので、2つ以上前の状態に戻ることはないんだけど
3:19 PM
この ExternalCommand というやつは自分でシグネチャを決めるのでそういうことが起きる
Avatar
omochimetaru 4/18/2024 3:21 PM
.build/debug.yml を再利用していいかどうかの問合せロジックにおいて、 問い合わせる先のデータベースがパラメータによって変わって、 データベースは自分が使われた時の知識しか持ってないから、 再利用できるっていう結果を返すけど、 実際には別の構成のために書き換わった状態になってるので壊れる・・・?
3:21 PM
.build/debug.yml が書き換わるタイミングのシグネチャを常に記録してるシングルトンなデータベースがいないとやりたいことがやれないように思う
3:22 PM
llbuildのtaskとして色々組み立てたらいつの間にかそういうロジック構造になってしまっていたみたいな感じで
3:22 PM
局所的な実装してる時にはおかしな全体像が見えにくい話なのかな (edited)
Avatar
あ、そうかデータベースが分かれてるのか
3:23 PM
だめじゃん -rw-r--r-- 1 katei katei 204800 Apr 18 14:53 .build/wasm32-unknown-wasi/build.db -rw-r--r-- 1 katei katei 172032 Apr 18 14:54 .build/x86_64-unknown-linux-gnu/build.db (edited)
Avatar
omochimetaru 4/18/2024 3:24 PM
そうそう。
3:24 PM
そういう話だよね?w
3:24 PM
ここだけ切り取るとおかしすぎて何がどうミスったのかよくわかんないな・・・
3:25 PM
このDBが別れてることにはきっと本来的な設計意図が別にあるんだろうな
Avatar
データベースはシングルトンだけどなぜか前回の状態を無視してキャッシュヒットしてるんだと思ってた
3:25 PM
データベースが分かれてるなら"なぜか"の部分が解消されるな
Avatar
omochimetaru 4/18/2024 3:26 PM
このデータベースがさ、別れてるのが仮に正しいとしても、 分け方がトリプルごとなのはいいのかね?
ターゲットトリプルでディレクトリ切ったところで同じトリプルの中でのバリエーションがあるので意味ない
↑これになりそう
Avatar
分けるべきではない
Avatar
omochimetaru 4/18/2024 3:27 PM
シングルトンなデータベースにして、トリプルやバリエーション違いの情報もちゃんとDBの中で混ざらないようにテーブル設計して全部集約するのが
3:27 PM
自然な設計の話に見えますね
Avatar
昔からデータベース分かれてましたっけ
Avatar
omochimetaru 4/18/2024 3:29 PM
僕はこのsqliteの存在をさっき知ったので何もわからん
Avatar
5.8見てみよう
Avatar
omochimetaru 4/18/2024 3:30 PM
ツールチェーン切り替えて試せばいいだけか。
Avatar
あー、昔からっぽいなー
3:32 PM
最近のMaxのtool/destinationのBuildParameters分離リファクタで壊れたわけでは無さそう
Avatar
Avatar
Yuta Saito
最近のMaxのtool/destinationのBuildParameters分離リファクタで壊れたわけでは無さそう
omochimetaru 4/18/2024 3:33 PM
俺もそれで筋間違えた説疑ってたw
Avatar
疑ってスマンな
🙇‍♂️ 1
Avatar
omochimetaru 4/18/2024 3:38 PM
1回目に PackageStructure が起動しない問題、DBが別れててシグネチャ判定が役に立たない問題、並列数が1だと _RegexBuilder が見つからない問題
3:38 PM
3つ踏んだ
Avatar
たくさん直す機会が得られてよかった
Avatar
omochimetaru 4/18/2024 3:39 PM
なんか確かにこれまでも
3:39 PM
mac と linuxで重ねるといろいろ壊れてはいた
3:40 PM
が、まあそんなもんかな、だったのでスルーしてたけど、wasmとmacは重ねて使いたいね
Avatar
直せた
Avatar
omochimetaru 4/18/2024 3:46 PM
えっはや
Avatar
若干切替時のキャッシュヒットが劣化してしまったけど
Avatar
omochimetaru 4/18/2024 3:49 PM
マジで共通にしただけだ
3:49 PM
元々別れていたものを雑にくっつけたら他の問題が起きないんか? (edited)
Avatar
とりあえずビルドは通ってるけど流石にもう少し真面目にテストしないといけないですねぇ
Avatar
omochimetaru 4/18/2024 3:50 PM
dbの中身がよくわかってないけど仕組み的には大丈夫そうなん?
Avatar
マージしてクリティカルに困るのって切り替え前のキャッシュを使ってしまうことだと思うんですけど
3:53 PM
マニフェストさえ正しく再生成されていればコマンドのシグネチャが切り変わるので、データベース上の切り替え前の記録にヒットすることはないはず
Avatar
omochimetaru 4/18/2024 3:53 PM
なるほど
Avatar
ただシグネチャが切り替わっていてもターゲットキーが重なってるので切り替えてビルドしたときに切り替え前のキャッシュが漏れなくinvalidateされてしまうので
3:54 PM
ターゲットキーのサフィックスにターゲットトリプル追加するのが良いかな
3:55 PM
もしくはマニフェストグローバルなキーが設定できると良いんだけど
Avatar
omochimetaru 4/18/2024 3:56 PM
あーこれそういう感じか
3:58 PM
key_id から key_name 引いたやつがNC みたいなコマンド種別+ファイルパスとかで、そういうKVSになっていて、これがmakefileのターゲットみたいなもんで ただエントリの有効性を signature で保護している (edited)
Avatar
そうそうMakefileとちがってコマンドの変化にセンシティブ
Avatar
omochimetaru 4/18/2024 3:59 PM
シグネチャはさっきの8000バイトぐらいのJSON3つ繋げた文字列から作ったハッシュってことかな (edited)
Avatar
さっきのやつはインプロセスで計算するルールだったのでそういう自分で作るハッシュなんですけど
4:00 PM
普通は実行するコマンドライン引数がハッシュになる
Avatar
omochimetaru 4/18/2024 4:00 PM
なるほど
4:01 PM
この ExternalCommand というやつは自分でシグネチャを決めるのでそういうことが起きる
自分で決めるというのはそういう意味か
Avatar
いやぁちょうど仕事でこの辺困ってたので原因判明してよかった
Avatar
omochimetaru 4/18/2024 4:05 PM
お〜そうか、Swift WASM最前線だとそうなるのか
Avatar
12:59 PM
ボタンクリックしたらイベントハンドラが消えてた
1:00 PM
1:00 PM
この前のfuncのブリッジを変えたやつがダメだった件を踏んでいるかな
1:01 PM
いや、違うな、チェックアウトしてるのはrevert済みの版だ
1:02 PM
あ〜
1:02 PM
mainを抜けたらローカル変数が消えただけかなこれ
1:05 PM
あー動いた動いた 何でもない
1:05 PM
グローバル変数にrootオブジェクトを入れたら大丈夫になった
Avatar
Thanks for the help! After resolving a few other issues that I ran into with JavaScriptKit and stuff, I finally managed to get an online playground working 🎉 I faced a few different issues while trying to get this working, if any of these aren't already known I'd be happy to split them out into separate topics or GitHub issues. Hiccups My fir...
👍 1
Avatar
omochimetaru 4/22/2024 1:02 AM
StackOttersさんがGalahという言語をSwiftで作ってそのプレイグラウンドをwasmで動かしたのか。いいね。
Avatar
あ〜〜〜〜
12:45 PM
cartonおまかせでビルドの構成だとSwift 5.9.2 だから variadic generics が使えな〜い
12:48 PM
WebAssembly support for the Swift programming language - swiftwasm/swift
12:48 PM
swiftwasm/swift には 5.10 の development snapshot は供給されているけど 5.10-RELEASE は無い?ここは手動なのかな
12:49 PM
ここにあればcarton側のアップデートは簡単そうだと思ったが
12:49 PM
こっちは難しそうだ
12:51 PM
なんか設定は入ってそうだ
12:58 PM
WebAssembly support for the Swift programming language - Manual distribution · swiftwasm/swift@691cfdf
1:01 PM
これはやってもらうしかなさそうだなあ
1:02 PM
ん?
1:02 PM
parameter packは5.9からじゃん
Avatar
関数のpackが5.9で、10から型へのpackですね
1:08 PM
だから5.9はcallAsFunctionのシグネチャーにはエラーでてない
Avatar
Avatar
Iceman
関数のpackが5.9で、10から型へのpackですね
omochimetaru 4/22/2024 1:08 PM
Avatar
あーたぶんこれですね
Avatar
omochimetaru 4/22/2024 1:09 PM
Status: Implemented (Swift 5.9)
うそか?
Avatar
5.9implementって書いてあるけど嘘じゃないかなぁ
Avatar
omochimetaru 4/22/2024 1:09 PM
え〜〜
Avatar
5.10はアップストリームから5.10.1のビルドが提供されるまでリリース待とうと思ってます。どうしてもリリースされなければこっちでSwiftPMのパッチ入りビルド提供します (edited)
Avatar
omochimetaru 4/22/2024 3:41 PM
ほうほう。 それはこの修正を入れたいから? https://github.com/apple/swift-package-manager/pull/7471 (edited)
Motivation: The build database should be shared between different triple builds to re-generate the build manifest correctly. With the current implementation, the following build command sequence fa...
Avatar
そっちは全然いいんですけどテストランナーのクリティカルなバグがあって
Avatar
omochimetaru 4/22/2024 3:43 PM
マジかw
Avatar
チェリーピックしてリリースブランチには入ってるんですけど、5.10のスナップショットがアップストリームの方でずっと止まってるんですよね
3:45 PM
🍒 #7341 Explanation: swift build --build-tests fails on WASI after the experimental summary output, which is introduced in 5.10. This affects not only experimental-summary mode but also the defau...
Avatar
omochimetaru 4/22/2024 3:46 PM
なるほど
3:47 PM
flockなくてビルドできなくて・・・?ん?
3:47 PM
これはswiftpmコマンドそのもののソースコードだけど
3:47 PM
困ることあるの?
Avatar
SwiftPMが生成するテストランナーコードがビルドできない
3:48 PM
これはコマンドそのもののソースじゃないんすよ
Avatar
omochimetaru 4/22/2024 3:48 PM
ほんとだ!w
3:49 PM
クソでかい トリプルクォートだw
3:49 PM
コードジェネレータに埋め込まれたテンプレート部分なのか。これはおしまいだ。
Avatar
オワタ
3:52 PM
6.0が出るまでに5.9.1が出なくて強い要望がなければ欠番でもいいかな
Avatar
omochimetaru 4/22/2024 3:53 PM
5.10.1 だよね? 5.9 は もう 5.9.2 まで出ている
Avatar
ああ5.10.1だ
🆗 1
Avatar
omochimetaru 4/22/2024 3:54 PM
とりあえずこうしといた
Avatar
omochimetaru 4/22/2024 3:56 PM
Wasmを使っている人を見ると、おっ分かってる人だなと思うので、「分かってる人」として見られたいときにオススメです。
マジ?見た事なかった
3:56 PM
A contraction of “WebAssembly”, not an acronym, hence not using all-caps.
3:57 PM
ほんとだ
3:57 PM
not using all-caps ってはっきり書かれてるw
3:58 PM
全部直しとこ
Avatar
まあ通じればなんでもいいんですけどね笑
Avatar
XCodeではなくXcode的な
👉 2
Avatar
omochimetaru 4/23/2024 3:03 AM
一昨日みずちさんと通話してて、かていくんと話した事とか話してたんだけど、記事が出た https://x.com/mizchi/status/1782602996108685486?s=46&t=x82HmLxu4d0JVtr__-b65Q
書いた。moonbit へのcomponent-model 対応のプロポーサルのために色々調べる過程でスタンドアロン wasm エコシステムの夢を見た https://t.co/UYp9znonza
Avatar
実現していくぞ
Avatar
この辺の詳細が気になってたりします.
悪い発想だと、メモリ境界チェックをサボる WebAssembly Runtime で高速化の余地が残されている?
Avatar
omochimetaru 4/23/2024 1:53 PM
1プロセス1Wasmじゃダメなんですかね?
Avatar
1 プロセス 1 Wasm が何のことをおっしゃっているのかはちょっと読み取れなかったですが,runtime を ring 0 のカーネル空間に実装してメモリ管理も Wasm に特化させれば限りなくネイティブに近い速度になったりするのかな?という意味で気になってました.(調べたら前例はあるっぽいので既にやり尽くされてる話かもしれないですが)
Avatar
一般的なOSを考えて、1つのプロセスの中に2つのwasm runtimeがあると、メモリアクセスでチェックをしないと隣のruntimeを読み書きできてしまうと思ったんですよね OSのメモリ保護で読み書きを設定する主体がプロセスなので。 であれば、1プロセスに1つのwasm runtimeしかなければ、OSのメモリ保護を自然とマッピングして再利用できるのかなと。 OSのメモリ保護が高速なのは、よく知らないですが、メモリコントローラに対して設定を行なって、違反時にハードウェア割り込みとかでOSに戻ってくるから?だと想像していて、範囲チェックのために汎用CPUのクロックを消費しなそう。 keboさんの書いてるのはプロセスとかOSの層も潰して無くしてしまう話ですよね、その方が良さそう。
Avatar
ああ,境界チェックってそういう意味で書いてあったんですね
Avatar
omochimetaru 4/24/2024 8:14 AM
mizchiさんとの会話はいろいろ発散していた(し、他の人もいた)ので、その文の正確なところは、わからないですが、おそらく。 (edited)
Avatar
@Yuta Saito wasmのswift sdkってコンパイラのスナップショットと同じ日付を使うべきですか?それとも一日後?
Avatar
基本的に1日後
11:22 AM
どのタグをベースにSDKが作られてるかはGitHubリリースのページに書いてあるんでそれと一致するバージョンを使ってもらえると
Avatar
なるほど。気が付いてなかった、確認します
Avatar
ああ〜ほんとだ。 apple/swift
Avatar
リポジトリを公開した https://github.com/omochi/swift-react
Contribute to omochi/swift-react development by creating an account on GitHub.
🎉 8
Avatar
try! Swiftで半分冗談で作ってくれないかなぁとお願いしたら本当に出来てしまった🥳
Avatar
omochimetaru 4/25/2024 1:25 PM
3年前ぐらいから誰か作ってくれと思ってたけど、自分で作るしかなかった
Avatar
うごいたうごいた
Avatar
omochimetaru 4/25/2024 3:15 PM
おお。いいね
3:15 PM
家庭くんが動かせなかったら誰も動かせないからまずは安心
Avatar
cssのパスがcarton devの期待するやつと違ってたけどそれ以外はスムーズに動きました https://github.com/omochi/swift-react/pull/88 (edited)
Avatar
omochimetaru 4/25/2024 3:20 PM
あ、CartonExampleの方やってくれたのか
3:22 PM
5.10使えるようになった?
Avatar
手元にあった DEVELOPMENT-SNAPSHOT-2024-04-12-aでやってました
3:24 PM
swift package --experimental-swift-sdk DEVELOPMENT-SNAPSHOT-2024-04-15-b-wasm32-unknown-wasi carton-dev これで
Avatar
omochimetaru 4/25/2024 3:25 PM
手元のツールチェーン + cartonの択もあるのか
3:26 PM
carton-dev ←ハイフンだっけ?
Avatar
SwiftPMプラグインは各サブコマンドで分かれてるのでハイフンが付く
Avatar
omochimetaru 4/25/2024 3:27 PM
あーrunの方じゃなくてpackageの方か
Avatar
runの方はそのうち消したいんですよねぇツールチェインインストーラは別のツールにやってほしい
Avatar
omochimetaru 4/25/2024 3:29 PM
3:29 PM
この辺に書いてあった
Avatar
Avatar
Yuta Saito
runの方はそのうち消したいんですよねぇツールチェインインストーラは別のツールにやってほしい
omochimetaru 4/25/2024 3:32 PM
その方が良さそう プラグインひとつにして内部でサブコマンドにすることもできるんだっけ?スペース区切りの方がオシャレで好み
Avatar
おしゃれなんだけど一つのプラグインにしてしまうと不必要な依存のビルドが発生するんですよねぇ。例えばbundleコマンドではHTTPサーバ使わないのにNIOをビルドすることになったり。
3:36 PM
現状全てのプラグインはCartonFrontendを叩くだけだから常に全部ビルドするんですけど、そのうちそれを細かく分けてビルドを最小限にしたいなと
Avatar
omochimetaru 4/25/2024 3:37 PM
むむむ、なるほど
Avatar
Avatar
Yuta Saito
swift package --experimental-swift-sdk DEVELOPMENT-SNAPSHOT-2024-04-15-b-wasm32-unknown-wasi carton-dev これで
真似してやってみたけど変なエラーが出てダメだった
18.77 KB
12:57 PM
なぜホームディレクトリに干渉してくる?(そしてパーミッションでブロックして助かった?
Avatar
お、macか
Avatar
そりゃあmacですわよ
Avatar
いい加減 ~/.carton/static作るの辞めさせよう
Avatar
omochimetaru 4/26/2024 1:00 PM
Linuxだとどうなるの?
Avatar
サンドボックス保護がないので書き込み成功!
Avatar
omochimetaru 4/26/2024 1:00 PM
www
1:01 PM
元々コマンドラインツールだったから、さもありなんだけど、swift package plugin として動かすなら、これはアカンね。
1:02 PM
CLIツールならよくある挙動だけど、複数のバージョンのcartonを使い分けようとしたりするときに不安だし、ユーザがcartonに対してマシンレベルで何かを設定したいニーズとかもなさそうだから、キャッシュとかの用途ならインストールローカルな場所でやってほしいわね (edited)
Avatar
そうなんですよねぇ
Avatar
swift package plugin として動かすから問題なのであれば,carton から swift sdk install を呼び出すのをやめて swift sdk install は requirement にして carton は SDK が存在するかチェックしてなければエラーを吐くくらいにとどめれば自然なんですかね?
Avatar
そんな感じですかねー
Avatar
Avatar
omochimetaru
そこは嬉しいけどどっちかというとその後ろに書くトリプルがつらいですね、覚えられません
そういえばサブコマンドやオプションから experimental を外して短くするのが merge されてました. https://github.com/apple/swift-package-manager/pull/7507
Since SE-0387 was accepted and available in Swift 5.9 and Swift 5.10, it's time to remove experimental prefix.
Avatar
お。いいですね これが乗ったスナップショットに乗り換えよう。
Avatar
まだ 04-26-a では乗ってなさそうです (edited)
Avatar
0427に期待
Avatar
0427 に来てますね
Avatar
omochimetaru 4/28/2024 2:26 PM
おっ
12:23 PM
swift 0427 と対応する swift-wasm 0428 のリリースに artifact bundle が無い
Avatar
ありますよ.host independent になってます.
Avatar
ほんとだ!
12:24 PM
パラダイムシフトしてた
12:26 PM
[omochi@omochi-mbp ~]$ swift sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm [omochi@omochi-mbp ~]$ swift sdk list DEVELOPMENT-SNAPSHOT-2024-04-03-a-wasm DEVELOPMENT-SNAPSHOT-2024-04-28-a-wasm32-unknown-wasi
12:26 PM
それと、そもそも最初から 0403a が入ってた。
Avatar
私の環境 (swiftly でインストール) だとそれはなかったので,単に ~/.swiftpm/swift-sdks/ にファイルが残っていただけなんじゃないかという気がします.
Avatar
あ、なるほど。ここはコンパイラによらず共通に管理されているんですね。
Avatar
ですね
Avatar
0427の $ swift sdk が手元でもCIでも動いた。ドキュメントも更新した。 https://github.com/omochi/swift-react/pull/94 artifact bundle の選び方の説明文が変わった。
snapshot 0427 から swift experimental-sdk が swift sdk に変わった
Avatar
omochimetaru 4/30/2024 1:27 PM
npm install foo, npm install @types/foo ってやってると、なんだこの環境はってなるわね
Avatar
<unknown>:0: error: The --global-base argument is not supported when targeting WebAssembly
この --global-baseってオプションは新しいんでしょうかね?
Avatar
omochimetaru 5/1/2024 12:08 PM
linker optionだけどどうだろう 僕は0402以降でしか試してない
Avatar
とりあえず無しでも動いた。
😲 1
Avatar
omochimetaru 5/1/2024 12:10 PM
--stack-first と組み合わさって何か意味があるんだと思ってた
Avatar
それが無いと最悪enumが壊れるので付けないとまずい
Avatar
omochimetaru 5/1/2024 12:13 PM
ワオ
Avatar
Avatar
Iceman
<unknown>:0: error: The --global-base argument is not supported when targeting WebAssembly
この --global-baseってオプションは新しいんでしょうかね?
これ出すのlegacy driverだけだったはずなんですけどlegacy driver使ってます? (edited)
Avatar
Xcode15.3についてるSwift使ってますね
Avatar
それは何がどうやって動いてるんだ…?
Avatar
Xcode15.3にswift experimental-sdk installしてますね・・・
Avatar
とりあえず --stack-firstを有効にしたとき明示的な--global-base が必要なのは6.0以降で、それ以前では必要ないのでおそらく大丈夫そう。
Avatar
そうなんですね。とりあえず見た感じは動いてそう。
Avatar
ヨシ yoshi
Avatar
どうせおもちゃとしての利用だからヨシ!
Avatar
omochimetaru 5/1/2024 12:18 PM
swift-reactをやってるわけではない?
Avatar
swift-reactをやっています
Avatar
omochimetaru 5/1/2024 12:18 PM
あれ、Xcode15.3のSwiftで行けたっけ
12:19 PM
なんか雰囲気動いてはいます
Avatar
omochimetaru 5/1/2024 12:19 PM
ビルドできてるしいけてるな
12:20 PM
ああXcode15.3 は Swift5.10か ok ok
12:36 PM
雑だけど動いた
Avatar
すごーい。リアクティブだ
Avatar
結構重いですね
Avatar
omochimetaru 5/1/2024 12:39 PM
keyとdepsつけてる?
Avatar
つけてないです
Avatar
omochimetaru 5/1/2024 12:40 PM
あーそれでもupdateにはなるはずだな
Avatar
つけたらさらに重くなりました
Avatar
omochimetaru 5/1/2024 12:40 PM
ww
12:40 PM
プロファイリングどうすればいいんだろう
Avatar
DOMの個数が多いと重い
Avatar
Chrome DevTools
Avatar
omochimetaru 5/1/2024 12:41 PM
できるのか
12:45 PM
12:45 PM
これいいな
12:46 PM
const wrapWASI = (wasiObject: WASI, wasmModule: WebAssembly.Module): WebAssembly.ModuleImports => { あーこれが噛み合わない
12:47 PM
import wasmUrl from 'foo.wasm?url' こっちの方式なら噛み合いそうだ
Avatar
omochimetaru 5/1/2024 12:55 PM
Carton無しで、ViteJSに乗っかってHMRできた
Avatar
どのくらい設定必要ですか?
12:57 PM
むかしwebpack用のプラグインをメンテしてたんですけど割と面倒くさくて辞めてしまった
12:59 PM
1. viteの設定はほぼそのまま 2. カスタムプラグインを書いて、変更検知してビルド君を叩いてる 3. ビルド君
12:59 PM
あとはターミナルで export TOOLCHAINS=... してから $ npm run dev でdev serverが動く (edited)
1:01 PM
4. エントリポイントはこう。 (edited)
1:02 PM
vitejsは index.html の script タグに書いてあるインラインスクリプトを理解するから、これでうまいこと依存先の更新検知してくれる
Avatar
なるほど
Avatar
omochimetaru 5/1/2024 1:06 PM
プラグインの中で自分でwatchしてるのはダサくて、 本当はvitejsに対して、このwasmファイルはこの辺のswiftソースからこのコマンドで生成されているよ、という宣言を与えてあとはうまくやって欲しかったが、やり方がわからなかった。できるのかどうかもわからない。
1:06 PM
ちなみにこのプラグインの実装はChatGPTに教えてもらってコピペで動いた。
Avatar
SwiftPMプラグインはパッケージのソース一覧を知ることができてCartonはそれを使ってる
Avatar
omochimetaru 5/1/2024 1:08 PM
それはえらいね。
1:09 PM
今の構成だとpackage updateした時とか、local packageが外においてある時に、反応しない問題がある。
Avatar
Avatar
Iceman
そうなんですね。とりあえず見た感じは動いてそう。
やっぱり謎のデリファレンスが起きてて壊れてそうな気がする
Avatar
omochimetaru 5/1/2024 2:23 PM
マジか
Avatar
omochimetaru 5/1/2024 3:49 PM
https://omochi.github.io/swift-string-counter-web/ とりあえず実験1号を公開した
3:49 PM
🎉 4
Avatar
omochimetaru 5/1/2024 3:58 PM
あ、説明文のフォントがデカい
Avatar
omochimetaru 5/2/2024 12:28 PM
スマホで見るとフォントサイズが変わるな・・・
12:32 PM
ところで、 / に全部置いてある想定で作ったんだけど、github pagesによって ディレクトリ名が付いたパスになってしまったが
12:32 PM
vitejsのbaseurl機能使ったら全部一括でオフセットできてうまく動いたのですごい npm run build -- --base=/swift-string-counter-web/
12:46 PM
div( attributes: [ "style": """ display: flex; flex-direction: column; align-items: center; gap: 4px; """ ] ) {
12:47 PM
実際に簡単なウェブページを作ってみた感想としては
12:47 PM
とりあえず最低限動いてそうなのは良いとして
12:47 PM
↑のように、HTMLのアトリビュートを書いて、さらにその中の style アトリビュートに インラインスタイルを書こうとすると
12:48 PM
まあSwiftのトリプルクォート文字列の恩恵はデカくて、書けるは書けるんだけど、これでもまだやっぱり TypeScript で JSX を書くのと比べると、インデントや余計な記号が多くて煩わしい
12:49 PM
例えば一つの理想としては div(display: "flex", flex-direction: "column", align-items: "center", gap: "4px") って書ける事だけど
12:50 PM
  • ハイフンを含むラベルは作れない
  • アトリビュートやスタイルプロパティは多すぎて、多引数の関数として実装すると明らかにまともに動かない
12:50 PM
のでそのまんまこれはできない、絶対に1度は辞書的な動的なオブジェクトにラップする必要がある
12:51 PM
実際のところ JSX も、あれはJSに対するDSLのようなもので、コンポーネント式は関数呼び出しにトランスパイルされて、アトリビュートは辞書になるんで
12:51 PM
これは直接そのトランスパイル先を書いてるような状態に似ているんだけども。 逆にJSXの必要性がよくわかった。
12:52 PM
ハイフンを含むラベルについては、Reactに関しては、このようなkebab-caseからcamelCaseに全部置き換えたAPIを提供しており
12:54 PM
一つの正解なんだけど、他にもちょっと名前が変わってたりして、裏のHTML/CSSとはまたちょっと違う体系の学習が強いられるのが好きではない・・・
12:54 PM
classclassName, forhtmlFor などがある。(どちらもJSのキーワードと衝突している)
12:55 PM
Result Builder とか型付きの辞書とかでなんかいい感じにできんかなあ〜
Avatar
一つの解決策はSwiftUIみたいにsome Elementのextensionとして各種属性設定を生やすことでしょうね
1:05 PM
SwiftUIと違ってHTMLはどのElementにもあらゆる属性を付与できるので構造としては崩れてない
Avatar
omochimetaru 5/2/2024 1:05 PM
そうですね。でもextensionだと後ろに付くから嫌なんですよね。 子供ノードをクロージャで包んでる時に、親ノードの設定が子供の定義の後に来るのは可読性が低いと思ってます。
1:06 PM
実際SwiftUIでも、Buttonのラベルとか、重要な設定は init で与えるようになっているのは、前に書きたいからだと思う。
1:06 PM
メンタルモデルがHTMLだから、アトリビュートは開きタグの方に書きたいというのもありますね。メソッドチェーンで後ろに書くのは閉じタグ側に感じる。 (edited)
Avatar
JetpackComposeは引数に与えるStylesプロパティ的なものをメソッドチェーンによるビルダー式で組み立てれるようになってますね (edited)
Avatar
omochimetaru 5/2/2024 1:08 PM
お、それは知らない、カンニングしてこよう
Avatar
some Elementに生やさなくても、頭に与える引数側のオブジェクトをチェーンで組み立てれるようにする方式
Avatar
omochimetaru 5/2/2024 1:10 PM
1:10 PM
この Image に対する modifier = の Modifier.size(...).clip(...) の部分ですかね
Avatar
そうですね
Avatar
omochimetaru 5/2/2024 1:11 PM
なるほど〜 これは良さそうだぞ
1:12 PM
メソッドチェーンが最適かは別として、attributesやstyleを構築する機能を別途設計して、a とか div にそれを渡す形だ。
1:13 PM
attributes { class = "..." src = "..." href = "..." } 本当はこんな感じに書きたいけど Result Builder はグローバルな名前しか使えないからできないんだよな
1:15 PM
Attributes .class(...) .src(...) .href(...) メソッドチェーンならKotlinと同じようにSwiftでもできる。 SwiftUIも、まあそうか。
1:16 PM
Style .display("flex") .flexDirection("column") .alignItems("center")
1:16 PM
flex-directionalignItems にできないのはしょうがないよなあ。 これはSwifty API なんだよという事かなあ。
1:17 PM
このアプローチだと適宜 enum とかも使えるのがいいですね。 .display(.flex).flexDirection(.column)...
Avatar
属性とその値の組み合わせに型が使えたほうが嬉しいですね
Avatar
omochimetaru 5/2/2024 1:18 PM
↑だと属性はメソッド名にすぎなくて型ではないですね。
1:19 PM
ただHTMLのattributeとかCSSのstyleにひとつずつ型を付けると
1:19 PM
型の数が多くなりすぎてランタイムのメタ情報がデカすぎそう (edited)
1:19 PM
コンパイラもヨボヨボになりそう。
Avatar
ランタイムのメタデータサイズ考える必要あるのかw
Avatar
omochimetaru 5/2/2024 1:21 PM
まあ、リンカ最適化でeliminateしてくれるかも、しれないけど・・・ (edited)
1:22 PM
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
kebo started a thread. 5/2/2024 1:23 PM
Avatar
omochimetaru 5/2/2024 1:24 PM
CSSプロパティは370個ぐらいありそう。思ったより少ないな。いけるか? (edited)
1:30 PM
自分で数えたけど、GPTにも丸ごとコピペしたら大体同じ数答えてきた
1:30 PM
レイアウトぶっ壊れてるのにすごいなこの子
1:36 PM
HTML attributeも170個ぐらいか
1:37 PM
想像していたほどではないな
Avatar
Sotoのシンボルのほうが断然多そう
Avatar
omochimetaru 5/2/2024 1:39 PM
Sotoのおかげでコンパイラの馬力がどのくらい出るかなんとなくイメージできるのおもろい。
Avatar
omochimetaru 5/2/2024 2:02 PM
手前味噌だけど(まあ流石に仕方ない)、事例紹介リンク集を作った 何か作ったら載せるから教えてください
2:06 PM
そういえば現時点のバイナリサイズも見ておくか default (debug): 25.5MB -c release: 24.3MB -c release, -Osize: 13.4MB -c release, -Osize, -wmo: 13.4MB (変化なし?) (edited)
Avatar
omochimetaru 5/2/2024 2:14 PM
-lto=llvm-full -experimental-hermetic-seal-at-link つけたらビルドできなかった・・・ wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/React.build/ChildrenBuilder.swift.o: undefined symbol: $sytWV clang: error: linker command failed with exit code 1 (use -v to see invocation) [10/11] Linking StringCounter.wasm
Avatar
Avatar
omochimetaru
そういえば現時点のバイナリサイズも見ておくか default (debug): 25.5MB -c release: 24.3MB -c release, -Osize: 13.4MB -c release, -Osize, -wmo: 13.4MB (変化なし?) (edited)
-c release-wmo が有効になるので比較は実質上 2 つだけで十分ですよ.
naruhodo 1
Avatar
Osizeの存在わすれてたので手元のプロジェクトにかけてみたけど、0.1MBしか変わらなかった
2:52 PM
wasm-optが結構効いてそう
Avatar
wasm-opt は -Os の上の -Oz もありますしね.wasm-strip をかけてから wasm-opt をかけるとさらに小さくなった記憶があります.
Avatar
wasm-stripもかけてます。結構効きますよね
2:57 PM
手元のプロジェクトだとswift(10.1MB)→wasm-opt(5.6MB)→wasm-strip(4.2MB)と変化してる
2:58 PM
お、stripを先にやったら最終結果が4.1MBになった
👀 1
Avatar
omochimetaru 5/3/2024 6:59 AM
↑のhermetic sealの問題を直すのも取り組みたいな。これが本命だろうし。
Avatar
omochimetaru 5/3/2024 2:00 PM
xcodeが意味のわからん壊れ方した
2:00 PM
*.bc と言うファイルが大量に生成される。
3:15 PM
メソッドチェーンで attributes, style, listenersを書く方式、快適だ
3:16 PM
補完が効くのが良いっぽい
Avatar
Avatar
omochimetaru
*.bc と言うファイルが大量に生成される。
LTO 向けのフラグをつけると生成されるファイルじゃないでしたっけ? (edited)
Avatar
Avatar
kebo
LTO 向けのフラグをつけると生成されるファイルじゃないでしたっけ? (edited)
omochimetaru 5/3/2024 3:17 PM
なるほど。Xcodeじゃなくて起動してた更新監視スクリプトが出してたっぽいです。 (edited)
Avatar
Avatar
omochimetaru
-lto=llvm-full -experimental-hermetic-seal-at-link つけたらビルドできなかった・・・ wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Keyed.swift.o: undefined symbol: swift_bridgeObjectRelease wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/AdjacentPairs.swift.o: undefined symbol: swift_release wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/Algorithms.build/Chunked.swift.o: undefined symbol: swift_deallocObject wasm-ld: error: /Users/omochi/github/omochi/swift-string-counter-web/.build/wasm32-unknown-wasi/release/React.build/ChildrenBuilder.swift.o: undefined symbol: $sytWV clang: error: linker command failed with exit code 1 (use -v to see invocation) [10/11] Linking StringCounter.wasm
そのエラー,.build ディレクトリを一旦消したら別のエラーになりませんか?ビルドディレクトリに *.swift.o ファイルが見つからないというようなエラーに. そして SwiftPM だと最近 LTO を有効にするための --experimental-lto-mode=full みたいなのが追加されたみたいなので,-Xswiftc -lto=llvm-full じゃなくてこっちのフラグで指定したらどうなりますか? https://github.com/apple/swift-package-manager/pull/6891/files
Avatar
omochimetaru 5/3/2024 4:54 PM
あ、たしかに、連続でやったせいでおかしかったのか 後日ためしてみます
Avatar
ちなみに Wasm とはまた状況が違うかもしれないですが,Embedded Swift を使っている swift_os だと swiftc に -experimental-hermetic-seal-at-link-lto=llvm-full を渡す方式じゃ同じエラー (*.swift.o が生成されない) が起こって,swiftc に -experimental-hermetic-seal-at-link で swift-build に --experimental-lto-mode=full を渡す方式だとちゃんとビルドが通ってバイナリサイズも小さくなりました.
Avatar
swift-string-counter-web でやると別のエラーが出ますね.(Linux aarch64 環境なので,macOS だと結果は異なるかもしれませんが) wasm-ld: error: /home/kebo/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/swift.xctoolchain/usr/lib/swift_static/wasi/wasm32/swiftrt.o: undefined symbol: swift_addNewDSOImage wasm-ld: error: /home/kebo/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _call_host_function_impl wasm-ld: error: /home/kebo/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _free_host_function_impl wasm-ld: error: /home/kebo/swift-string-counter-web/.build/wasm32-unknown-wasi/debug/_CJavaScriptKit.build/_CJavaScriptKit.c.o: undefined symbol: _library_features clang: error: linker command failed with exit code 1 (use -v to see invocation) (edited)
👀 1
Avatar
ちなみに diff はこんな感じです. diff --git a/bin/build b/bin/build index ae8a56c..d0ba369 100755 --- a/bin/build +++ b/bin/build @@ -6,7 +6,9 @@ set -x swift build --swift-sdk wasm32-unknown-wasi \ --disable-build-manifest-caching \ - -Xswiftc -static-stdlib \ + --static-swift-stdlib \ + --experimental-lto-mode=full \ + -Xswiftc -experimental-hermetic-seal-at-link \ -Xswiftc -Xclang-linker -Xswiftc -mexec-model=reactor \ -Xlinker --export-if-defined=__main_argc_argv \ -Xlinker --stack-first \
Avatar
めっちゃ ugly な解決策ですが,ここにあるみたいに undefined symbol: swift_addNewDSOImage-Xlinker $HOME/.swiftpm/swift-sdks/swift-wasm-DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi.artifactbundle/DEVELOPMENT-SNAPSHOT-2024-05-02-a-wasm32-unknown-wasi/wasm32-unknown-wasi/swift.xctoolchain/usr/lib/swift_static/wasi/libswiftCore.a を追加すればとりあえず出なくなりました.残り 3 つは全部 _CJavaScriptKit module なのが気になりますね. https://github.com/apple/swift-package-manager/issues/4415#issuecomment-1116961059
Exported 3,763 message(s)
Timezone: UTC+0