Design: Klarstellung des Stack-Popping für bedingte Verzweigungen

Erstellt am 27. März 2017  ·  5Kommentare  ·  Quelle: WebAssembly/design

Ich spiele mit dem Schreiben eines WebAssembly-Compilers. Ich schaue mir den Test https://github.com/WebAssembly/spec/blob/634f0d9009404f498ef8d8bd510bd6f0941219cc/test/core/br_if.wast#L272 an, der wie

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

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

Der Fehler, den ich erhalte, ist:

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)
           ^^^^^^^

Ich würde denken, dass die Stapelgröße, wenn sie br_if 2 ist, was bedeutet, dass 1 für die Bedingung platzt und dann eine übrig bleibt, um den äußeren Block zu erfüllen. Ich nahm an, dass (i32.const 0) auf den verschachtelten Block durchfallen würde. Welches Teil fehlt mir? Danke im Voraus.

Hilfreichster Kommentar

>

Bedeutet das, dass jeder Block seinen eigenen Stack bekommt?

Ich würde nicht sagen, dass sie ihre eigenen Stacks bekommen, nur dass es ein Limit gibt
zu dem, was geknallt werden kann. In wabt ist das eigentlich so implementiert
ist ein Werte-Stack und ein "Label"-Stack. Jedes Etikett speichert ein "Limit", das
die Größe des Wertestapels, wenn das Label gedrückt wird. Dann wann immer du
pop, prüfen Sie gegen das Limit des oberen Labels.

Beides sind gültige Ansichten. Semantisch hat die Ansicht "blocklokaler Stapel" die
Vorteil, dass es keine zusätzlichen Invarianten erfordert. Mit "Einzelstapel"
zusätzliche Korrektheitsannahmen sind notwendig, wie z.B. alle Grenzen
im Label-Stack vorkommen, muss innerhalb der Grenzen des aktuellen Operanden-Stack liegen
Höhe, müssen sie in (nicht unbedingt streng) aufsteigender Reihenfolge auftreten, und
Der Etikettenstapel darf niemals leer sein.

Alle 5 Kommentare

Ja, hier kann die Fehlerberichterstattung von wabt verbessert werden. Obwohl es zwei i32 s auf dem Stack gibt, werden Operatoren nie über den Anfang eines Blocks hinausgehen, so dass es effektiv nur einen gibt.

Bedeutet das, dass jeder Block seinen eigenen Stack bekommt? Ich war durch die folgende Aussage im Semantik-Dokument verwirrt:

Die Ausführung einer Block- oder Schleifenanweisung hat keine Auswirkung auf den Wertestapel.

Vielleicht sollte sich das ändern in:

Die Ausführung eines Block- oder Schleifenbefehls hat keine Auswirkung auf den Wertestapel, aber auf alle Stapelwerte außerhalb des ausführenden Blocks kann nicht zugegriffen werden.

Oder verstehe ich das falsch?

Bedeutet das, dass jeder Block seinen eigenen Stack bekommt?

Ich würde nicht sagen, dass sie ihre eigenen Stacks bekommen, nur dass es eine Grenze gibt, was gepoppt werden kann. In wabt ist es eigentlich so implementiert, es gibt einen Werte-Stack und einen "Label"-Stack. Jedes Etikett speichert ein "Limit", das die Größe des Wertestapels ist, wenn das Etikett gedrückt wird. Wenn Sie dann auftauchen, überprüfen Sie das Limit des oberen Labels.

Die Ausführung einer Block- oder Schleifenanweisung hat keine Auswirkung auf den Wertestapel.

Vielleicht sollte sich das ändern in:

Die Ausführung eines Block- oder Schleifenbefehls hat keine Auswirkung auf den Wertestapel, aber auf alle Stapelwerte außerhalb des Blockausführungsblocks kann nicht zugegriffen werden.

Oder verstehe ich das falsch?

Ja, es lohnt sich wahrscheinlich, so etwas in Semantics.md zu erwähnen. Obwohl ich erwähnen sollte, dass auch an einer formalen Prosaspezifikation gearbeitet wird.

>

Bedeutet das, dass jeder Block seinen eigenen Stack bekommt?

Ich würde nicht sagen, dass sie ihre eigenen Stacks bekommen, nur dass es ein Limit gibt
zu dem, was geknallt werden kann. In wabt ist das eigentlich so implementiert
ist ein Werte-Stack und ein "Label"-Stack. Jedes Etikett speichert ein "Limit", das
die Größe des Wertestapels, wenn das Label gedrückt wird. Dann wann immer du
pop, prüfen Sie gegen das Limit des oberen Labels.

Beides sind gültige Ansichten. Semantisch hat die Ansicht "blocklokaler Stapel" die
Vorteil, dass es keine zusätzlichen Invarianten erfordert. Mit "Einzelstapel"
zusätzliche Korrektheitsannahmen sind notwendig, wie z.B. alle Grenzen
im Label-Stack vorkommen, muss innerhalb der Grenzen des aktuellen Operanden-Stack liegen
Höhe, müssen sie in (nicht unbedingt streng) aufsteigender Reihenfolge auftreten, und
Der Etikettenstapel darf niemals leer sein.

Danke für die Information. Ich schließe dies, da nichts Verwertbares daraus hervorgeht und formellere Spezifikationen dazukommen, um dies zu buchstabieren.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

nikhedonia picture nikhedonia  ·  7Kommentare

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6Kommentare

dpw picture dpw  ·  3Kommentare

arunetm picture arunetm  ·  7Kommentare

Artur-A picture Artur-A  ·  3Kommentare