Компиляция C в Wasm на PHP

#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-коде, и первый бит кода-это просто какой-то артефакт того, что вы делали? Помогите нам здесь и постарайтесь сосредоточиться на насущной проблеме, а не на том, какой процесс приведет вас сюда. Хотя я уверен, что это было трудно понять, это просто отвлекающий маневр.