welw | About_me Blog WebAssembly

Dlaczego chcemy dodać nową instrukcję do WebAsembly?

Kiedy po raz pierwszy zobaczyłem ten niezwykły przypadek, w którym 1.79e308 + 1.79e308 = 1.79e308, coś się nie zgadzało. Niby proste, dodaj dwie liczby. A jednak.

Przeczytałem kawałek specyfikacji. Dało mi to kilka odpowiedzi na parę pytań. Zapragnąłem zrozumieć, jak działa wykonanie instrukcji od momentu, gdy wchodzi ona w interpreter, do momentu gdy zwracany jest wynik. Dlatego zdecydowałem się zaimplementować z pozoru trywialną funkcję: f64.add_zero. Ta instrukcja będzie pobierała dwie liczby i zawsze zwracała zero. Później zrobię, żeby instrukcja dodawała, potem będzie jeszcze jedna instrukcja do odejmowania i tak dalej.

Zanim rozpoczniesz

Aby rozpocząć pracę z interpreterem wasm, najpierw musimy go pobrać i skompilować.

Dodajemy nową instrukcję

Mamy już działający interpreter webassembly. Powinniśmy teraz być w stanie dodać do niego nową instrukcję.

Wewnątrz runtime instrukcja przechodzi przez wiele poziomów.

Warstwa pierwsza: AST

type binop =
| Add
| AddZeroAll

Warstwa druga: runtime

Teraz interpreter będzie wiedział, co ta instrukcja robi.

| AddZeroAll -\> (fun \_ \_ -\> FXX.zero)

Warstwa trzecia: binary

pliki binarne nie zawieraja instrukcji. one zawieraja opcody, czyli binarne interpretacje instrukcji.

warstwa czwarta: testy

i tutaj uruchamiamy nasza instrukcje i patrzymy, co konkretnie nam to dalo.

Taka operacja nie do końca jest matematycznym dodawaniem. ale mozemy juz dopisac do niego nowy test case, czyli faktycznie wykonac te instrukcje w interpreterze.

\