Design: Klarifikasi tumpukan yang muncul untuk cabang bersyarat

Dibuat pada 27 Mar 2017  ·  5Komentar  ·  Sumber: WebAssembly/design

Saya bermain-main dengan menulis kompiler WebAssembly. Saya melihat tes https://github.com/WebAssembly/spec/blob/634f0d9009404f498ef8d8bd510bd6f0941219cc/test/core/br_if.wast#L272 yang terlihat seperti ini sedikit diperluas:

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

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

Kesalahan yang saya dapatkan adalah:

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

Saya akan berpikir ukuran tumpukan ketika mencapai br_if adalah 2 yang berarti muncul 1 untuk kondisional dan kemudian memiliki satu sisa untuk memenuhi blok luar. Saya berasumsi (i32.const 0) akan masuk ke blok bersarang. Bagian mana yang saya lewatkan? Terima kasih sebelumnya.

Komentar yang paling membantu

>

Apakah ini berarti setiap blok mendapatkan tumpukannya sendiri?

Saya tidak akan mengatakan bahwa mereka mendapatkan tumpukan mereka sendiri, hanya saja ada batasnya
untuk apa yang bisa muncul. Itu sebenarnya bagaimana itu diterapkan di wabt, di sana
adalah tumpukan nilai dan tumpukan "label". Setiap label menyimpan "batas" yaitu
ukuran tumpukan nilai saat label didorong. Kemudian kapan pun Anda
pop, Anda memeriksa batas label atas.

Keduanya adalah pandangan yang valid. Secara semantik, tampilan "tumpukan blok-lokal" memiliki
keuntungan bahwa itu tidak memerlukan invarian tambahan. Dengan "tumpukan tunggal"
asumsi kebenaran tambahan diperlukan, seperti semua batasan
yang terjadi di tumpukan label harus dalam batas tumpukan operan saat ini
tinggi, mereka harus terjadi dalam (tidak harus benar-benar) urutan yang meningkat, dan
tumpukan label tidak boleh kosong.

Semua 5 komentar

Ya, pelaporan kesalahan wabt dapat ditingkatkan di sini. Meskipun ada dua i32 s di tumpukan, operator tidak akan pernah melewati awal blok, jadi hanya ada satu.

Apakah ini berarti setiap blok mendapatkan tumpukannya sendiri? Saya bingung dengan pernyataan berikut dalam dokumen semantik:

Mengeksekusi instruksi blok atau loop tidak berpengaruh pada tumpukan nilai.

Mungkin itu harus berubah menjadi:

Mengeksekusi instruksi blok atau loop tidak berpengaruh pada tumpukan nilai, tetapi semua nilai tumpukan di luar blok pelaksana tidak dapat diakses.

Atau aku salah paham?

Apakah ini berarti setiap blok mendapatkan tumpukannya sendiri?

Saya tidak akan mengatakan bahwa mereka mendapatkan tumpukan mereka sendiri, hanya saja ada batasan untuk apa yang bisa muncul. Itu sebenarnya bagaimana itu diterapkan di wabt, ada tumpukan nilai dan tumpukan "label". Setiap label menyimpan "batas" yang merupakan ukuran tumpukan nilai saat label didorong. Kemudian setiap kali Anda muncul, Anda memeriksa batas label atas.

Mengeksekusi instruksi blok atau loop tidak berpengaruh pada tumpukan nilai.

Mungkin itu harus berubah menjadi:

Mengeksekusi instruksi blok atau loop tidak berpengaruh pada tumpukan nilai, tetapi semua nilai tumpukan di luar blok pelaksana blok tidak dapat diakses.

Atau aku salah paham?

Ya, mungkin perlu disebutkan sesuatu seperti itu di Semantics.md. Meskipun saya harus menyebutkan bahwa ada pekerjaan pada spesifikasi prosa formal juga.

>

Apakah ini berarti setiap blok mendapatkan tumpukannya sendiri?

Saya tidak akan mengatakan bahwa mereka mendapatkan tumpukan mereka sendiri, hanya saja ada batasnya
untuk apa yang bisa muncul. Itu sebenarnya bagaimana itu diterapkan di wabt, di sana
adalah tumpukan nilai dan tumpukan "label". Setiap label menyimpan "batas" yaitu
ukuran tumpukan nilai saat label didorong. Kemudian kapan pun Anda
pop, Anda memeriksa batas label atas.

Keduanya adalah pandangan yang valid. Secara semantik, tampilan "tumpukan blok-lokal" memiliki
keuntungan bahwa itu tidak memerlukan invarian tambahan. Dengan "tumpukan tunggal"
asumsi kebenaran tambahan diperlukan, seperti semua batasan
yang terjadi di tumpukan label harus dalam batas tumpukan operan saat ini
tinggi, mereka harus terjadi dalam (tidak harus benar-benar) urutan yang meningkat, dan
tumpukan label tidak boleh kosong.

Terimakasih atas infonya. Saya menutup ini karena tidak ada yang dapat ditindaklanjuti darinya dan spesifikasi yang lebih formal akan datang untuk menjelaskan hal ini.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat