The Rust WASM (WebAssembly) VM (Virtual Machine) project demonstrates the interop between Rust and JavaScript using WebAssembly. It showcases a simple Virtual Machine implemented in Rust, with the ability to store and retrieve values in registers. This documentation provides an overview of the project, explains how to get started, describes the Rust code structure, and provides code samples with explanations.
This setup involves creating a Rust library project, implementing the virtual machine logic, building it into a WebAssembly module using wasm-pack, and integrating it into an HTML file for execution in the browser.
Install the wasm-pack module, by running the following command:
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | shTo run the project, follow these steps:
-
Install Rust if you haven't already.
-
Open a terminal and navigate to the project directory.
-
Build the WebAssembly module and JavaScript interop code by running the following command:
wasm-pack build --target web --out-dir ./dist
-
Open the
js-wasm-vm-interop.htmlfile in your web browser to see the output in the browser console.
The Rust code resides in the lib.rs file. It defines a VirtualMachine struct with methods to interact with the virtual machine.
The VirtualMachine struct represents a simple virtual machine with registers. It has the following methods:
The new method creates a new instance of the virtual machine.
#[wasm_bindgen]
pub fn new() -> Self {
// Initialize the virtual machine with default register values
VirtualMachine {
registers: [0; 16],
}
}The get_register_value method retrieves the value stored in the specified register.
#[wasm_bindgen]
pub fn get_register_value(&self, register_index: usize) -> u32 {
// Retrieve the value from the specified register
self.registers[register_index]
}The store_value_in_register method stores the specified value in the specified register.
#[wasm_bindgen]
pub fn store_value_in_register(&mut self, register_index: usize, value: u32) {
// Store the value in the specified register
self.registers[register_index] = value;
}The JavaScript code resides in the js-wasm-vm-interop.html file. It imports and utilizes the Rust WebAssembly module and JavaScript interop code.
The runVirtualMachine function initializes the WebAssembly module, creates a new instance of the VirtualMachine class, stores a value in register 0, and retrieves the value from register 0.
import init, { VirtualMachine } from './dist/rust_wasm_vm.js';
async function runVirtualMachine() {
// Initialize the WebAssembly module
await init();
// Create a new instance of the virtual machine
const vm = new VirtualMachine();
// Store a value in register 0
vm.store_value_in_register(0, 42);
// Retrieve the value from register 0
const registerValue = vm.get_register_value(0);
console.log('Value from register 0:', registerValue);
}
runVirtualMachine().catch(console.error);This project is licensed under the MIT License.
Feel free to modify and enhance the documentation according to your specific needs.