Запись в файл в WebAssembly
У меня есть следующий кусок C
код, который находится на крючке для компиляции в WebAssembly
,
# include <stdio.h>
int main() {
FILE *f = fopen("file.txt", "w");
if (f == NULL)
{
printf("Error opening file!\n");
return 0;
}
/* print some text */
const char *text = "Write this to the file";
fprintf(f, "Some text: %s\n", text);
/* print integers and floats */
int i = 1;
float py = 3.1415927;
fprintf(f, "Integer: %d, float: %f\n", i, py);
char c = 'A';
fprintf(f, "A character: %c\n", c);
fclose(f);
return 0;
}
Поэтому я использую следующие команды для генерации wasm
файл и соответствующий js
файл:
emcc write.c -s WASM=1 -o write.html
Тем не менее, когда я пытался использовать движок JS (как v8
Чтобы выполнить этот кусок кода, я просто не могу найти произведенный вывод. Также я не получил никакой ошибки:
➜ test_code ~/v8/v8/out/x64.release/d8 write.js
➜ test_code
Итак, согласно моему пониманию, wasm
код должен использовать JS
использовать некоторые системные функции, такие как операторы ввода / вывода. А может быть, не разрешено "манипулировать" файловой системой в этой среде браузера? Потому что в целом то, что происходит внутри браузера, должно оставаться внутри браузера.
Поэтому я пишу, чтобы узнать, как лучше перенести программу C, связанную с файловым вводом-выводом, на WebAssembly
среда. Любой комментарий будет оценен. Благодарю.
1 ответ
d8
есть write
функция ( v8 / src / d8.cc? l = 1706) для записи ввода / вывода, но Emscripten shell.js
никогда не использует его для простых оболочек JS. Вам понадобится взломать код Emscripten, если вы хотите, чтобы он работал в простых оболочках JS. Попробуйте исследовать emscripten/src/library_fs.js
,
РЕДАКТИРОВАТЬ: Просто понял, что D8 write
функция печати только для stdout
так что это не то, что вы хотите. Похоже, что запись в файл из простых оболочек JS невозможна (в любом случае, они предназначены только для разработчиков движка JS).
Я не проверял это, но я думаю, что запись ввода / вывода, вероятно, будет работать из коробки при запуске тестового кода в Node.js.
Последующие вопросы:
Emscripten генерирует код оболочки JS путем предварительной обработки и объединения shell.js
, preamble.js
, postamble.js
и некоторый код, сгенерированный во время компиляции из emscripten.py
а также compiler.js
, Предварительная обработка кода JS использует препроцессор в стиле C (#if
, #else
) плюс некоторые {{{ }}}
Вот почему JS-код Emscripten выглядит очень забавно.
Многие функции C реализованы в C и JS вместе. C-часть напрямую связана с WebAssembly (см. Их реализацию здесь), JS-часть реализована в library_*.js
под здесь.
В настоящее время Chrome является единственным браузером, который имеет API-интерфейс Web FileSystem. Google и Mozilla в настоящее время работают над стандартизацией API Writable Files. Первой реакцией большинства людей будет "это плохая идея", но поскольку браузеры уже позволяют выполнять ненадежный код в пользовательской системе (в песочнице), написание файлов, вероятно, не самая опасная вещь, которую может сделать браузер ( https://twitter.com/ericlaw/status/1066149633855053825).