Эта статья представляет собой краткое руководство, целью которого является показать, как: Получить rust, создать файл .wasm и вызвать функции rust из этого файла .wasm из консоли браузера.

Чтобы запустить rust в сети, вам нужно найти язык программирования rust. Кроме того, он даст вам груз (их менеджер пакетов — подумайте о npm, если вы пришли из node.js).

Введите это в свой терминал в каталоге по вашему выбору.

$curl https://sh.rustup.rs -sSf | ш

Вы должны увидеть следующую распечатку ниже.

Боже, эти рустообразные - добрые люди.

Теперь перезапустите терминал, чтобы установить переменную PATH. (cmd+q, пробел+cmd, введите «терминал»)

На данный момент у вас теперь есть ржавчина. Если хотите, вы можете продолжить изучение языка, следуя этой замечательной книге:

https://doc.rust-lang.org/book/second-edition/

Я просто предполагаю, что вы прочитали всю книгу и вернулись. Итак, давайте создадим файл ржавчины.

Сначала давайте используем груз, чтобы сделать проект для нас. Я назову этот проект бодрым без особых причин.

В терминале запустить $cargo new pep — bin

следующее теперь должно быть содержимым вашего каталога pep внутри вашего текущего.

Здорово! Теперь перейдите в каталог «pep» или как вы его назовете.

Теперь вы можете запустить команду запуска груза из терминала.

$ грузовой пробег

И вы должны увидеть следующую распечатку.

Здорово! Теперь посмотрим на содержимое файла main.rs, оно должно быть таким:

главная функция () {

println!("Привет, мир!");

}

Давайте заменим это чем-нибудь интересным. Для экономии времени давайте создадим небольшую функцию Фибоначчи, которая принимает ввод u32 и выдает код символа. Не парься, я сделал это за тебя.

используйте std::ffi::CString;

используйте std::os::raw::c_char;

#[no_mangle ] //позволяет получить его из javascript

pub fn fib(input: u32) -› *mut c_char{

пусть mut f_zero: u64 = 0;

пусть mut f_one: u64 = 1;

пусть mut f_n: u64 = f_zero + f_one;

для _ в 1.. ввод {

f_n= f_zero + f_one;

f_zero = f_one;

f_one = f_n;

}

return CString::new(f_n.to_string()).unwrap().into_raw();

}

Теперь также добавьте эту библиотеку в свой файл Cargo.toml.

[библиотека]

тип ящика = [“cdylib”]

Идеально! теперь давайте превратим этот основной файл rust в частично переваренный материал .wasm, чтобы мы могли добавить его в браузер.

Для этого введите эти команды в свой терминал. Для последней команды убедитесь, что вы находитесь в каталоге с файлом main.rs.

$rustup обновление

$rustup target add wasm32-unknown-unknown — набор инструментов каждую ночь

$rustc +nightly — цель wasm32-unknown-unknown -O — crate-type=cdylib main.rs -o main.big.wasm

$Wasm-gc target/wasm32-unknown-unknown/release/PEP.wasm -o main.gc.wasm

теперь уменьшите его, бросив их в терминал:

Установка $cargo — git https://github.com/alexcrichton/wasm-gc

$wasm-gc main.big.wasm main.wasm

Теперь вы должны увидеть файл с именем add.big.wasm в вашем каталоге. и файл с именем main.gc.wasm внутри вашей папки PEP (или как бы вы ее ни называли).

Теперь очень быстро соберите этот файл index.html.

‹!DOCTYPE html›

‹html›

‹скрипт›

WebAssembly.instantiateStreaming(fetch('main.gc.wasm'))

.then(wasm_module =› {

alert(`эта страница может выполнять функции Rust из консоли!`);

window.wasm = wasm_module;

});

‹/скрипт›

‹тело›‹/тело›

‹/html›

Теперь бросьте это в терминал, чтобы запустить ваш маленький сервер с вашим маленьким файлом:

$npx http-обслуживание -C-1

Вы должны получить небольшое сообщение, подобное этому, в вашем терминале:

Теперь перейдите в выбранный вами браузер (под этим я подразумеваю Chrome, Opera, Firefox или Safari, потому что выбор — это иллюзия) и перейдите на localhost:8080. Вы должны получить горячее сообщение, в котором говорится.

«Эта страница может выполнять функцию ржавчины из консоли!»

Здорово! давайте посмотрим, правда ли это. откройте инструменты разработчика (cmd+opt+i на Mac) и откройте вкладку с надписью console. отсюда мы можем ввести следующую команду, чтобы получить доступ к нашей функции fib, и передать ей любое число, которое нам нравится, в моем случае это 10.

wasm.instance.exports.fib(10)

Нажмите Enter и… подождите секунду… это не 10-й индекс последовательности Фибоначчи.

В первую очередь вы можете подумать, что компьютеры тупые и бесполезные, и у вас нет времени на эту ерунду, и это отчасти правда, но в нашем случае браузер (компьютер) выдает индекс в памяти, соответствующий искомому числу. (спойлер 55) начинает храниться. Это подчеркивает некоторые фундаментальные различия между тем, как работает ржавчина как язык, и тем, как работает javascript. А пока давайте просто заставим консоль дерна сказать 55!

Давайте создадим еще одну небольшую функцию в нашем файле index.html, которая позволит нам считывать число из этого индекса и превращать его в строку.

Я использовал этот:

функция readString(wasm, ptr) {

a = новый Uint8Array(wasm.instance.exports.memory.buffer)

пусть строка = ‘’

в то время как (а [указатель]) {

string += String.fromCharCode(a[ptr++])

}

возвращаемая строка

}

Поместите это в файл index.html вот так

Идеально! перезапустите свой старый добрый сервер и вернитесь к вам localhost: 8080 и запустите в консоли браузера:

wasm.instance.exports.fib(10)

А теперь приготовьтесь к моменту, которого вы так долго ждали.

Вызовите функцию readString из консоли с wasm в качестве первого параметра и целым числом, которое консоль напечатала в качестве второго. пример показан ниже (ваше целое число будет отличаться от моего, так что не бойтесь.

Вау, вот оно! Похлопайте себя по плечу, идите выпейте, скажите соседу, что пишете ржавчину в сети. А теперь извинись перед соседом за претенциозность.