Я хочу преобразовать этот проект C++ (Facebook FastText)
├── args.cc
├── args.h
├── dictionary.cc
├── dictionary.h
├── fasttext.cc
├── fasttext.h
├── main.cc
├── matrix.cc
├── matrix.h
├── model.cc
├── model.h
├── productquantizer.cc
├── productquantizer.h
├── qmatrix.cc
├── qmatrix.h
├── real.h
├── utils.cc
├── utils.h
├── vector.cc
└── vector.h
Хочу запустить в node.js. Сначала я построил его как проект с emmake make, и у меня есть связанные объектные файлы LLVM:
-rw-r--r-- 1 loretoparisi staff 27536 30 Lug 10:20 args.o
-rw-r--r-- 1 loretoparisi staff 78632 30 Lug 10:20 dictionary.o
-rw-r--r-- 1 loretoparisi staff 23864 30 Lug 10:20 productquantizer.o
-rw-r--r-- 1 loretoparisi staff 12120 30 Lug 10:20 matrix.o
-rw-r--r-- 1 loretoparisi staff 9132 30 Lug 10:20 qmatrix.o
-rw-r--r-- 1 loretoparisi staff 10532 30 Lug 10:20 vector.o
-rw-r--r-- 1 loretoparisi staff 30036 30 Lug 10:20 model.o
-rw-r--r-- 1 loretoparisi staff 1616 30 Lug 10:20 utils.o
-rw-r--r-- 1 loretoparisi staff 118404 30 Lug 10:20 fasttext.o
-rwxr-xr-x 1 loretoparisi staff 270940 30 Lug 10:20 fasttext
но очевидно, что это был не битовый код! Затем я скомпилировал emmake make VERBOSE=1, и оказалось, что он не использовал компилятор em++, поэтому я попробовал cmake:
emconfigure cmake
emmake make VERBOSE=1
На данный момент я вижу, что em++ работает.
/usr/local/Cellar/cmake/3.11.1/bin/cmake -E cmake_link_script CMakeFiles/fasttext-shared.dir/link.txt --verbose=1
/Users/loretoparisi/Documents/MyProjects/emsdk/emscripten/1.38.10/em++ -fPIC -pthread -std=c++11 -funroll-loops -O3 -march=native -shared -Wl,-soname,libfasttext.so -o libfasttext.so @CMakeFiles/fasttext-shared.dir/objects1.rsp
поэтому я получаю следующий результат:
-rw-r--r-- 1 loretoparisi staff 870544 30 Lug 10:40 libfasttext.a
-rw-r--r-- 1 loretoparisi staff 306646 30 Lug 10:40 fasttext.wasm
-rw-r--r-- 1 loretoparisi wheel 114099 30 Lug 10:40 fasttext.js
-rw-r--r-- 1 loretoparisi staff 870504 30 Lug 10:40 libfasttext_pic.a
-rw-r--r-- 1 loretoparisi staff 663728 30 Lug 10:40 libfasttext.so
Оказывается, это действительный файл javascript, но при его запуске возникает исключение.
$ node fasttext.js predict-prob /root/lang_id.bin - 2
exception thrown: 5280232 - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.
при этом должно получиться от stdin вроде
./fasttext predict-prob /root/lang_id.bin - 2
ja das is seher gut heute
__label__deu 0.999483 __label__bar 4.1711e-05
Может эта ошибка из-за stdin в node.js? Кажется, что с командой like все в порядке, поскольку она правильно принимает и анализирует параметры:
$ node fasttext.js predict-prob
usage: fasttext predict[-prob] <model> <test-data> [<k>] [<th>]
<model> model filename
<test-data> test data filename (if -, read from stdin)
<k> (optional; 1 by default) predict top k labels
<th> (optional; 0.0 by default) probability threshold
Затем я разбил его на модули, как emcc -s MODULARIZE=1 -s LEGACY_VM_SUPPORT=1 -s WASM=0 -O1 libfasttext.so -o libfasttext.js, и вызвал в модуле узла, например:
let FastTextModule = require('./fasttext-module.js');
let Module = null;
if (Module) {
return;
}
Module = {
noExitRuntime: true,
noInitialRun: false,
preInit: [],
preRun: [],
postRun: [function () {
console.info(`Loaded Javascript Module OK`);
}],
locateFile: "./",
arguments: ['predict-prob', '/root/lang_id.bin', '-', 2]
};
Module['locateFile'] = function (path, prefix) {
return prefix + path;
}
FastTextModule(Module);
Но у меня такая же ошибка: exception thrown: 5278216 - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.
Таким же образом я могу запустить его, установив noInitialRun:true, а затем сделав
Module.callMain(['predict-prob', '/root/ft_lang_model.bin', 'test.csv', '2']);
но в любом случае с этой ошибкой.
В основном это выдает исключение: exception thrown: 5279128
поэтому я думаю, что это означает, что программа работает до исключения. Вы сначала пробовали встроенную версию clang?
да, он работает при использовании исполняемого файла, созданного с помощью make, и передачи тех же параметров, что и Module['arguments'], в этом порядке. Мне интересно, как emscripten обрабатывает stdin и stdout, возможно, это могло вызвать то исключение.
@JiangYD, спасибо, это может быть отправной точкой. Может быть, мне нужно больше конфигурации Module перед callMain и запустить для установки stdin и stdout. Собственные клиенты используют std::cout для записи в stdout. Я также отправил сюда вопрос: github.com/kripken/emscripten/issues/6923



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


так поможет
-s DISABLE_EXCEPTION_CATCHING=0?