Pull to refresh

Comments 11

Чукча не писатель, чукча тесты блоков взял из тестов интерпретатора по спецификации (который на ocaml). То, что создаёт компилятор было ещё страшнее. Ибо сперва нужно выключить оптимизации, иначе он всё заменит на `select` без вопросов.

Что до объяснения — в документации не лучше. Я это всё в своём интерпретаторе руками делал, всё равно идеи конкретно такого описания потока исполнения не понял. Как и все, сделал все блоковетвистые инструкции аналогами `goto`.

Если есть вариант, как выразить лучше — буду благодарен.
Как и все, сделал все блоковетвистые инструкции аналогами `goto`.

Можете уточнить, как именно?

Если по-простому, то как-то так. Каждому блоку даём метку, потом проходим по коду и всем br* вписываем реальную позицию их метки, делаем их таким образом аналогами jmp или j[code]. А к конечным блокам записываем выходные параметры стека, чтобы работали возвраты и сбросы. Медленнее читать, зато намного быстрее выполнять. А вот опкоды для block и loop даже нет нужды создавать.

А вот в этом месте:
virtual float sq_dist() const{ return Vec3::sq_dist() + z * z; }

должно же быть Vec2::sq_dist. Код WebAssembly для этой функции не показан, а хорошо бы посмотреть.
Бинариен ругается при компиляции. На деле в финальном коде оно было исправлено, но копипасту сделал раньше. Исправлю в статье.

А вообще вот:

  (func (;8;) (type 0) (param i32) (result f32)
    (local f32 f32 f32 f32)
    get_local 0
    call 8
    set_local 4
    get_local 0
    f32.load offset=12
    set_local 3
    get_local 3
    get_local 3
    f32.mul
    set_local 2
    get_local 4
    get_local 2
    f32.add
    set_local 1
    get_local 1
    return)


Обычная рекурсия
UFO just landed and posted this here
Хоть ты тресни, но конкретно в коде для исполнения все увиденные мной интерпретаторы преобразуют все контрольные инструкции в аналоги goto ещё на этапе чтения чтении. Так быстрее и привычнее для машинного кода. Из каких соображений для байткода был выбран именно такой формат управляющих конструкций? Неужели только для красивого ручного написания?

В случае, например, Java, JIT–компилятор пытается из байткода восстановить как раз похожие структуры, это требуется для того, чтобы оценить время жизни локальных переменных, выполнить оптимизации и т. п.


На мой взгляд, то что сделано в webassembly очень дружелюбно по отношению к реализации оптимизирующих JIT–компиляторов.

В принципе, в Design Rationale так и пишут:


Why not a fully-general stack machine?

The WebAssembly stack machine is restricted to structured control flow and structured use of the stack. This greatly simplifies one-pass verification, avoiding a fixpoint computation like that of other stack machines such as the Java Virtual Machine (prior to stack maps). This also simplifies compilation and manipulation of WebAssembly code by other tools. Further generalization of the WebAssembly stack machine is planned post-MVP, such as the addition of multiple return values from control flow constructs and function calls.
Я это воспринял именно как «simplifies compilation and manipulation of WebAssembly code by other tools», то есть, красоты ради. Собственно, блоки то ещё куда не шло, наиболее дурацкая конструкция это `if… else… end`. Фактически в ней `if` это `jz` на опкод после `else`, а `else` это `jmp` на `end`. Что характерно, LLVM в неё ничего не компилирует. Вся инфраструктура wasm работает AOT, потому странно, если подобный формат ориентирован на JIT-компиляцию и оптимизации в ущерб скорости рантайма. При AOT-компиляции несравнимо больше ресурсов и возможностей.

Чем действительно можно оправдать, так это безопасностью. Wasm есть, по умолчанию, запуск недоверенного кода. И вот с этим условием простая валидация есть важная задача.

Под AoT понимается генерация wasm'ов?
Тут действительно руки разработчиков компиляторов немного связаны, так как текущие подходы, которые расчитаны на генерацию гибкого кода здесь не подходят: здесь либо надо отказываться от низкоуровневых оптимизаций и полагаться на работу JIT, либо делать обратное преобразование с восстановлением структурного кода.
И согласен, что валидация проще и быстрее.

Sign up to leave a comment.

Articles