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.
\