Можно ли увеличить лимит рекурсии в SpiderMonkey?

В настоящее время я работаю над проблемами в Project Euler с помощью JavaScript. По большей части я использовал циклы for для повторения проблем, но хотел использовать рекурсивные функции. Однако кажется, что все движки JavaScript имеют ограничения на объем рекурсии, которую они могут обработать.

Я скомпилировал/установил SpiderMonkey, чтобы попытаться запустить его из оболочки, но все равно получаю 18: InternalError: too much recursion

Можно ли как-то увеличить лимит рекурсии в SpiderMonkey, или это вообще плохая идея.

Пример кода:

function cycle(x)
{
    if (check_divisble(x))
    {
        print(i + ' is divisble by 1 - 20' + '\n');
        return;
    }


    x+=20;
    cycle(x);
}

cycle(50400);

Спасибо за вашу помощь.


person Darren Newton    schedule 20.01.2010    source источник
comment
Почему вы вообще хотите сделать это с рекурсией? Я попробовал это с циклом for, и он работает в течение нескольких секунд... любой язык, который не выполняет оптимизацию хвостового вызова, сломался бы при решении проблемы такого размера.   -  person Thomas    schedule 21.01.2010
comment
Привет, Томас. Я сделал это с помощью цикла for. Мне просто было любопытно, можно ли это сделать с помощью рекурсии, поскольку в некоторых других задачах было проще остановить/отловить/изменить вычисления внутри функции.   -  person Darren Newton    schedule 21.01.2010


Ответы (1)


Максимальный уровень рекурсии является жестко запрограммированным значением в исходном коде C.

Если вы получите исходный код (как описано здесь: https://developer.mozilla.org/En/SpiderMonkey/Build_Documentation), вы можете изменить его и скомпилировать новый интерпретатор с более высоким значением.

Откройте js/src/jsinterp.c и найдите строку, содержащую

#define MAX_INLINE_CALL_COUNT 3000

и измените значение в конце на любое значение, которое вы хотите. Следите за использованием памяти, так как слишком высокое значение может убить вашу машину (или, по крайней мере, сделать ее очень тормозной).

Кроме того, вы, вероятно, захотите скомпилировать оптимизированную версию (как указано на странице выше), потому что, когда память освобождается в отладочной версии, она перезаписывает всю ее установленным значением, чтобы облегчить отладку, но это может чрезвычайно замедлить вашу работу. (см. http://groups.google.com/group/mozilla.dev.tech.js-engine/msg/57934d626c75f7d3).

person pib    schedule 20.01.2010