Design: Aclaración del estallido de la pila para ramas condicionales

Creado en 27 mar. 2017  ·  5Comentarios  ·  Fuente: WebAssembly/design

Estoy jugando con la escritura de un compilador de WebAssembly. Estoy viendo la prueba https://github.com/WebAssembly/spec/blob/634f0d9009404f498ef8d8bd510bd6f0941219cc/test/core/br_if.wast#L272 que se ve así expandido un poco:

(module
    (func
      $type-arg-void-vs-num-nested
      (result i32)

      block i32
        (i32.const 0)
        block
          (i32.const 1)
          (br_if 1)
        end
      end
    )
)

El error que obtengo es:

Error: check failed:
test.wast:10:12
type stack size too small at br_if value. got 0, expected at least 1
          (br_if 1)
           ^^^^^^^

Creo que el tamaño de la pila cuando alcanza br_if es 2, lo que significa que aparece 1 para el condicional y luego tiene un sobrante para satisfacer el bloque exterior. Supuse que (i32.const 0) pasaría al bloque anidado. ¿Qué parte me estoy perdiendo? Gracias por adelantado.

Comentario más útil

>

¿Significa esto que cada bloque tiene su propia pila?

No diría que obtienen sus propias pilas, solo que hay un límite
a lo que se puede hacer estallar. Así es como se implementa en wabt, hay
es una pila de valores y una pila de "etiquetas". Cada etiqueta almacena un "límite" que es
el tamaño de la pila de valores cuando se empuja la etiqueta. Entonces cuando tu
pop, comprueba el límite de la etiqueta superior.

Ambos son puntos de vista válidos. Semánticamente, la vista "block-local stack" tiene la
ventaja de que no requiere invariantes adicionales. Con "pila única"
son necesarias suposiciones de corrección adicionales, como todos los límites
que ocurre en la pila de etiquetas debe estar dentro de los límites de la pila de operandos actual
altura, deben ocurrir en (no necesariamente estrictamente) orden creciente, y
la pila de etiquetas nunca debe estar vacía.

Todos 5 comentarios

Sí, el informe de errores de wabt puede mejorar aquí. Aunque hay dos i32 s en la pila, los operadores nunca aparecerán más allá del comienzo de un bloque, por lo que efectivamente solo hay uno.

¿Significa esto que cada bloque tiene su propia pila? Estaba confundido por la siguiente declaración en el documento de semántica:

La ejecución de una instrucción de bloque o bucle no tiene ningún efecto sobre la pila de valores.

Quizás eso debería cambiar a:

La ejecución de una instrucción de bloque o bucle no tiene ningún efecto sobre la pila de valores, pero todos los valores de la pila fuera del bloque en ejecución son inaccesibles.

¿O lo estoy entendiendo mal?

¿Significa esto que cada bloque tiene su propia pila?

No diría que obtienen sus propias pilas, solo que hay un límite para lo que se puede explotar. De hecho, así es como se implementa en wabt, hay una pila de valores y una pila de "etiquetas". Cada etiqueta almacena un "límite" que es el tamaño de la pila de valores cuando se empuja la etiqueta. Luego, cada vez que aparece, verifica el límite de la etiqueta superior.

La ejecución de una instrucción de bloque o bucle no tiene ningún efecto sobre la pila de valores.

Quizás eso debería cambiar a:

La ejecución de una instrucción de bloque o bucle no tiene ningún efecto sobre la pila de valores, pero todos los valores de la pila fuera del bloque de ejecución del bloque son inaccesibles.

¿O lo estoy entendiendo mal?

Sí, probablemente valga la pena mencionar algo así en Semantics.md. Aunque debo mencionar que también se está trabajando en una especificación formal en prosa.

>

¿Significa esto que cada bloque tiene su propia pila?

No diría que obtienen sus propias pilas, solo que hay un límite
a lo que se puede hacer estallar. Así es como se implementa en wabt, hay
es una pila de valores y una pila de "etiquetas". Cada etiqueta almacena un "límite" que es
el tamaño de la pila de valores cuando se empuja la etiqueta. Entonces cuando tu
pop, comprueba el límite de la etiqueta superior.

Ambos son puntos de vista válidos. Semánticamente, la vista "block-local stack" tiene la
ventaja de que no requiere invariantes adicionales. Con "pila única"
son necesarias suposiciones de corrección adicionales, como todos los límites
que ocurre en la pila de etiquetas debe estar dentro de los límites de la pila de operandos actual
altura, deben ocurrir en (no necesariamente estrictamente) orden creciente, y
la pila de etiquetas nunca debe estar vacía.

Gracias por la info. Estoy cerrando esto ya que no hay nada que pueda derivarse de ello y se están presentando especificaciones más formales para explicarlo.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

jfbastien picture jfbastien  ·  6Comentarios

thysultan picture thysultan  ·  4Comentarios

Artur-A picture Artur-A  ·  3Comentarios

frehberg picture frehberg  ·  6Comentarios

spidoche picture spidoche  ·  4Comentarios