Pywasm Runtime Erorr - PullRequest
       12

Pywasm Runtime Erorr

1 голос
/ 22 октября 2019

Я попытался загрузить программу веб-сборки, используя pywasm (интерпретатор веб-сборки, полностью написанный на python: https://github.com/mohanson/pywasm), используя следующий код

    import pywasm
vm = pywasm.load('out.wasm')
r = vm.exec('fib', [10])
print(r) 

, где out.wasm был создан с использованиемemscripten в следующем C-коде, запустив emcc out.c в следующем out.c-коде

int fib(int n) {
    if (n <= 1) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}

, который сгенерировал файлы js и wasm. Загрузка файла wasm с помощью pywasm с помощью приведенного выше кода выдает ошибку

global import env.emscripten_resize_heap not found

. При проверке я обнаружил, что функция, которую пытался загрузить файл wasm, на самом деле была в файле js, сгенерированном emcc, поэтому я подумал о создании толькоавтономный файл wasm, который я сгенерировал с помощью следующей команды

emcc out.c -o out.wasm

, которая выдала один out.wasm. Я снова попытался загрузить этот автономный файл wasm, но на этот раз он показал другую ошибку

global import wasi_unstable.args_sizes_get not found

Это говорит о том, что файл wasm хочет импортировать модуль wasi_unstable, который я нашел и нашел доступным здесь https://www.npmjs.com/package/wasi_unstableЯ установил его с помощью команды npm install, но ошибка не исчезла. Есть ли способ преобразовать код ac в автономный файл wasm с помощью emscripten, а затем загрузить его с pywasm без каких-либо ошибок.

1 Ответ

0 голосов
/ 22 октября 2019

Автономный режим emscripten теперь, кажется, испускает базовую интеграцию WASI API . Таким образом, для запуска кода, скомпилированного с помощью emscripten, вам потребуется либо предоставить минимальные заглушки WASI в вашем загрузчике JavaScript, либо pywasm потребуется для их реализации. Похоже, что минимальный набор составляет args_sizes_get, args_get и proc_exit. В случае простого фиба эти функции не вызываются, поэтому их просто нужно определить в импорте. Вот обновление вашего кода, содержащее основные определения:

import sys
import pywasm
wasi_unstable = {
    'args_sizes_get': lambda x: 0,
    'args_get': lambda x: 0,
    'proc_exit': lambda x: 0
}
vm = pywasm.load(sys.argv[1], {'wasi_unstable': wasi_unstable})
r = vm.exec('fib', [10])
print(r) 

Вам также нужно будет скомпилировать код fib.c, чтобы функция emscripten не оптимизировала функцию fib (посколькуemscripten считает, что это не называется):

emcc -s "EXPORTED_FUNCTIONS=['_fib']" fib.c -o fib.wasm

С этими изменениями у меня работает:

python3.8 run.py ./fib.wasm
55
...