Это точно так, как указано в справочнике Rust: мы создаем динамическую библиотеку для загрузки с другого языка. Так почему же вывод не .dll
, .so
или .dylib
? Это потому, что мы не компилируем ни для Windows, ни для Linux, ни для MacOS. Мы компилируем для wasm32-unknown-unknown
. Таким образом, единственным недостатком ссылки здесь не является перечисление всех возможных платформ и их окончаний в файлах динамической библиотеки.
Нам нужна динамическая библиотека, потому что динамические библиотеки могут быть загружены во время выполнения (как правило, браузером). Библиотеки Rust должны быть статически связаны для использования.
Дополнительная информация о том, что происходит под капотом:
Если вы вызовете макрос wasm_bindgen
, он (помимо прочего) расширит сигнатуру функции в C
функцию.
#[wasm_bindgen]
pub fn my_function()
#[export_name = "my_function"]
pub extern "C" fn __wasm_bindgen_my_function()
Почему функция C? Вызовы функций могут отличаться от языка к языку. Путем искажения, порядка аргументов в стеке вызовов и т. Д. Это называется ABI. C
обладает явным преимуществом наличия определенного и стабильного ABI, поэтому он является популярным выбором для интерфейсов сторонних функций.