# 遇到的几个关于ffi的问题

**URL:** <https://taolun.moonbitlang.com/t/topic/1061>\
**Category:** 欢迎\
**Created:** [2024 年11 月 28 日 10:50 UTC](https://taolun.moonbitlang.com/t/topic/1061 "2024-11-28T10:50:46Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

作者： ![yuyi919](https://taolun.moonbitlang.com/user_avatar/taolun.moonbitlang.com/yuyi919/32/199_2.png) [@yuyi919](https://taolun.moonbitlang.com/u/yuyi919)\
发布日期： [2024 年11 月 28 日 10:50 UTC](https://taolun.moonbitlang.com/t/topic/1061/1 "2024-11-28T10:50:46Z")

</div>

1.js后端目前也会限制ffi的传递类型，实际上是没有必要的  
2.配置use-js-builtin-string后可在wasm-gc中使用String作为传递类型，构建通过但lsp还是会提示不支持，感觉需要在pkg.json里提供一个配置默认target给lsp进行检测  
3.目前支持js-builtin-string的似乎只有部分浏览器和deno？node和bun都不支持

如果可以给wasm-gc后端生成dts和对应的glue.js就更好了

---

<div class="post-metadata">

作者： ![jerry-ye](https://taolun.moonbitlang.com/user_avatar/taolun.moonbitlang.com/jerry-ye/32/178_2.png) [@jerry-ye](https://taolun.moonbitlang.com/u/jerry-ye)\
发布日期： [2024 年11 月 29 日 02:08 UTC](https://taolun.moonbitlang.com/t/topic/1061/2 "2024-11-29T02:08:04Z")

</div>

1. 确实，我们会考虑放松限制
2. lsp之后会读取pkg.json
3. 确实：[Feature Extensions - WebAssembly](https://webassembly.org/features/)
4. 可以考虑。但glue.js里面怎么知道这个ffi是什么呢？还是说生成一个template文件？

---

<div class="post-metadata">

作者： ![yuyi919](https://taolun.moonbitlang.com/user_avatar/taolun.moonbitlang.com/yuyi919/32/199_2.png) [@yuyi919](https://taolun.moonbitlang.com/u/yuyi919)\
发布日期： [2024 年11 月 29 日 12:50 UTC](https://taolun.moonbitlang.com/t/topic/1061/3 "2024-11-29T12:50:00Z")

</div>

最简单的设想是导出一个函数

```auto
// 基于`WebAssembly.instantiateStreaming`
(Response | PromiseLike<Response>, ImportObject) => Promise<{
   module: WebAssembly.Module
   instance: WebAssembly.Instance & {exports: Exports}
}>

// 也可以考虑导出另一个同步函数，基于new WebAssembly.Module
(BufferSource, ImportObject) => ({
   module: WebAssembly.Module
   instance: WebAssembly.Instance & {exports: Exports}
})

```

根据target生成默认的配置（js-builtin-string,etc.），只向用户暴露需要传入的ffi对象  
这样足够简单也对typescript项目比较友好，不需要写额外的断言

另外是否考虑支持从模块导入的ffi，以下是gleam中的写法

```gleam
@external(erlang, "gleam_stdlib", "identity")
// @external(javascript, "@pkg/std", "to_unicode_str")
@external(javascript, "../parser_gleam_ffi.mjs", "to_unicode_str")
pub fn do_to_unicode_char(i: Int) -> c.Char

```

默认的wasm-gc后端可以结合上述glue.js的设想，从模块导入ffi也就可以直接写在glue.js里，由于buffer需要用户传入更为灵活，相对路径导入也会更简单

---

<div class="post-metadata">

作者： ![jerry-ye](https://taolun.moonbitlang.com/user_avatar/taolun.moonbitlang.com/jerry-ye/32/178_2.png) [@jerry-ye](https://taolun.moonbitlang.com/u/jerry-ye)\
发布日期： [2024 年12 月 4 日 05:19 UTC](https://taolun.moonbitlang.com/t/topic/1061/4 "2024-12-04T05:19:46Z")

</div>

你似乎是要生成.d.ts？类似这样的功能：[WebAssembly](https://docs.deno.com/runtime/reference/wasm/#type-checking)

从模块中导入FFI具体是什么意思？Wasm标准只定义了根据两个字符串定义导入。你的设想是在开发环境中已知有JS文件，生成的时候同时生成导入标识符与Import Object？

---

<div class="post-metadata">

作者： ![yuyi919](https://taolun.moonbitlang.com/user_avatar/taolun.moonbitlang.com/yuyi919/32/199_2.png) [@yuyi919](https://taolun.moonbitlang.com/u/yuyi919)\
发布日期： [2024 年12 月 4 日 08:49 UTC](https://taolun.moonbitlang.com/t/topic/1061/5 "2024-12-04T08:49:55Z")

</div>

对，wasm后端在glue.js里生成相应的部分ImportObject，js后端可以直接编译为import statement而不用手写require这种很不自然的方式

生成.d.ts其实就是为glue.js生成dts，和运行时无关
