Pull to refresh

Comments 4

Формат .wat стоило бы переименовать в .wtf, потому что эту нечитабельную смесь LISP'а с Brainfuck'ом очевидно придумывал сумасшедший. ИМХО, напрямую байт-код в HEX-редакторе изучать и то легче, чем такое «human-readable» представление.
Вот смотрите, допустим у нас есть простейшая функция вычисления факториала:
int factorial(int n) {
  if (n == 0)
    return 1;
  else
    return n * factorial(n-1);
}

Мы её компилируем в .wasm, и потом «дизассемблируем» в .wat. Результат:
(module
  (type $t0 (func (param i64) (result i64)))
  (func $f0 (type $t0) (param $p0 i64) (result i64)
    (if $I0 (result i64) 
      (i64.eqz
        (local.get $p0)) 
      (then
        (i64.const 1))
      (else
        (i64.mul
          (local.get $p0)
          (call $f0      
            (i64.sub
              (local.get $p0)
              (i64.const 1))))))))

А вот что получится, если просто дизассемблировать байт-коды — последовательно, инструкцию за инструкцией, линейно. Как, собственно, и должен делать любой вменяемый дизассемблер, чей выхлоп предполагается для изучения живым человеком:
(func (param i64) (result i64)
  local.get 0
  i64.eqz
  if (result i64)
      i64.const 1
  else
      local.get 0
      local.get 0
      i64.const 1
      i64.sub
      call 0
      i64.mul
  end)

Линейный код всё же куда сложнее читать, чем нормально сгруппированный:


Наверное, это уже устоявшийся акроним, но упомянуть стоит, что wasm — WebAssembly.
Я догадался, но пришлось сходить по ссылке для уверенности.
Так-то, wasm может быть Watcom Assembler (да, я динозавр).

Sign up to leave a comment.