Как рекурсия должна быть закодирована в WebAssembly?

Я компилирую язык чистых тотальных функций в WebAssembly. Самая сложная из доступных конструкций — это примитивная рекурсия. Я немного поэкспериментировал, и кажется, что единственный жизнеспособный подход — это построить прыгающую абстрактную машину, которая марширует по какому-то байт-коду, превращая рекурсию в итерацию. Есть ли лучшая стратегия?

Я слышал, что в предстоящем выпуске GHC будет реализована поддержка серверной части WebAssembly. Думаю, я бы принял ответ, в котором говорится «скомпилировать в Haskell».

Corbin 27.11.2022 19:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Расширение с явными хвостовыми вызовами было предложено для Wasm. Это предложение в настоящее время находится на «фазе 3» процесса предложения Wasm и было реализовано в V8 и (в настоящее время) Safari, что означает, что мы надеемся, что оно будет стандартизировано очень скоро.

До тех пор, да, вам придется использовать какой-то батут, если вы зависите от семантики хвостового вызова.

Я ценю этот ответ. Действительно, есть несколько предложенных улучшений, которые могли бы помочь: блоки с несколькими аргументами, базовые блоки, GC и хвостовые вызовы. Я не завишу от хвостовых вызовов, но моя рекурсия приведет к переполнению стека, если будет реализована наивно.

Corbin 30.11.2022 05:57

Ну, разве это не означает, что вы зависите от него? FWIW, блоки с несколькими аргументами уже являются стандартными. Однако я не уверен, какое предложение вы имеете в виду под базовыми блоками.

Andreas Rossberg 30.11.2022 08:57

Моя семантика довольно абстрактна; Меня не интересуют стеки вызовов, потому что у категорий нет стеков вызовов. Именно WASM, а не я, заставляет меня избегать вызовов, чтобы избежать переполнения стека. Если бы в WASM были базовые блоки или несокращаемый поток управления, то я мог бы просто сделать суп из блоков, которые кодируют какую-то абстрактную машину, что было бы более эффективно, чем интерпретация байт-кода или сокращение графа.

Corbin 30.11.2022 20:04

Думаю, я бы принял ответ, в котором говорится «реализовать алгоритм Relooper»!

Corbin 30.11.2022 20:06

Другие вопросы по теме