#javascript #php #c #compilation #webassembly
Вопрос:
Я работаю над проектом, в котором мне нужно скомпилировать C в веб-сборку. Я использую PHP, поэтому предпочтительно что-то, что может работать с этим. В своем проекте я беру входные данные из строки (скажем, $foo), затем я хочу скомпилировать ее в веб-сборку, чтобы отобразить ее в Javascript. У меня уже есть часть отображения, если я скомпилирую код C извне, но есть ли способ напрямую скомпилировать эту строку? Мой код для отображения Wasm:
let x = 'main.wasm';
let instance = null;
let memoryStates = new WeakMap();
function syscall(instance, n, args) {
switch (n) {
default:
// console.log("Syscall " n " NYI.");
break;
case /* brk */ 45: return 0;
case /* writev */ 146:
return instance.exports.writev_c(args[0], args[1], args[2]);
case /* mmap2 */ 192:
debugger;
const memory = instance.exports.memory;
let memoryState = memoryStates.get(instance);
const requested = args[1];
if (!memoryState) {
memoryState = {
object: memory,
currentPosition: memory.buffer.byteLength,
};
memoryStates.set(instance, memoryState);
}
let cur = memoryState.currentPosition;
if (cur requested > memory.buffer.byteLength) {
const need = Math.ceil((cur requested - memory.buffer.byteLength) / 65536);
memory.grow(need);
}
memoryState.currentPosition = requested;
return cur;
}
}
let s = "";
fetch(x).then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, {
env: {
__syscall0: function __syscall0(n) { return syscall(instance, n, []); },
__syscall1: function __syscall1(n, a) { return syscall(instance, n, [a]); },
__syscall2: function __syscall2(n, a, b) { return syscall(instance, n, [a, b]); },
__syscall3: function __syscall3(n, a, b, c) { return syscall(instance, n, [a, b, c]); },
__syscall4: function __syscall4(n, a, b, c, d) { return syscall(instance, n, [a, b, c, d]); },
__syscall5: function __syscall5(n, a, b, c, d, e) { return syscall(instance, n, [a, b, c, d, e]); },
__syscall6: function __syscall6(n, a, b, c, d, e, f) { return syscall(instance, n, [a, b, c, d, e, f]); },
putc_js: function (c) {
c = String.fromCharCode(c);
if (c == "n") {
document.write(s);
s = "";
} else {
s = c;
}
}
}
})
).then(results => {
instance = results.instance;
}).catch(console.error);
PHP-код:
function get_string_between($string, $start, $end){
$string = ' ' . $string;
$ini = stripos($string, $start);
if ($ini == 0) return '';
$ini = strlen($start);
$len = stripos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}
$string = 'blah blah {start c}#include <iostream>{end c}';
$foo = get_string_between($string, '{start c}', '{end c}');
//Something to compile $foo to Wasm
Комментарии:
1. Я не вижу здесь ни одной строки PHP. Как влияет PHP?
2. @tadman Я использую PHP для хранения переменных и получения входных данных, которые мне нужно скомпилировать в Wasm.
3. Если вы используете PHP, покажите нам, как вы его используете, или это просто деталь, которая не имеет значения.
4. Добавил немного кода.
5. Итак, я предполагаю, что настоящая проблема заключается в PHP-коде, и первый бит кода-это просто какой-то артефакт того, что вы делали? Помогите нам здесь и постарайтесь сосредоточиться на насущной проблеме, а не на том, какой процесс приведет вас сюда. Хотя я уверен, что это было трудно понять, это просто отвлекающий маневр.