LINUX.ORG.RU

Будет ли рекурсия в этом случае

 


1

2

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

var func = function() {
  console.log('Boo!');
  setTimeout(func, 10);
};

setTimeout(func, 10);
★★★★★

Последнее исправление: makoven (всего исправлений: 2)
Ответ на: комментарий от k0valenk0_igor

На самом деле, это совсем не так. Главное отличие рекурсии от цикличного исполнения - в контексте. У цикла контекст один и тот же, у рекурсивно вызванного кода - разный. Вот ссылка на вики

русская вика для меня не пруф.

Реализация рекурсивных вызовов функций в практически применяемых языках и средах программирования, как правило, опирается на механизм стека вызовов — адрес возврата и локальные переменные функции записываются в стек, благодаря чему каждый следующий рекурсивный вызов этой функции пользуется своим набором локальных переменных и за счёт этого работает корректно.

обрати внимание на слова «как правило». Вика описывает обычную _реализацию_. Это не правильно, потому-что реализация уже давно не в ведении программиста. Компилятор всё равно сделает как надо. А в сишечке нет такой абстракции «стек». Ну а контексты(полноценные) есть только в ФП, а в сишечке это всё фигня. Я уж молчу про JS.

Стек в данном случае и есть контекст.

откуда стек в JS???

но это не декларативная рекурсия, а рекурсия реализации.

нет такого понятия «рекурсия реализации». Реализация это вообще не твоя проблема, ты её при всём желании в JS не увидишь.

drBatty ★★
()
Ответ на: комментарий от k0valenk0_igor

Ты не понял меня. Я говорю о том, что треды никогда не создаются «тихо и незаметно», трединг это образно говоря достаточно сложная хреновина, чтобы можно было вот так вызвать параллельно два колбэка — это принципиально невозможно без содействия программиста. А события естественно сортируются в некотором (полу-)управляемом порядке и выполняются в единственном треде. При полной жопе с невозобновляемыми ресурсами (вроде памяти) рантайм обычно конями двигает без доп.эвристики.

arturpub ★★
()
Ответ на: комментарий от k0valenk0_igor

Я подозреваю, что в этом случае js-машина отрабатывает

зря. В любой момент это могут изменить, и твой код сломается.

Причем затраты на каждую новую рекурсивную петлю - это затраты только на контекст, а они в данном случае мизерны.

дык там раз в 10 секунд. Это надо лет 200..20000 ждать.

drBatty ★★
()
Ответ на: комментарий от drBatty

Это скорее похоже на CPS, только через жопу. Это вообще много на чего похоже, но остается отложенным вызовом, пусть и себя, но без контекста и/или захвата возвращаемого значения и побочных эффектов.

arturpub ★★
()
Ответ на: комментарий от drBatty

Нет там никаких растущих затрат. Старый колбэк отработал, установил новый колбэк, сам помер. В таблице диспетчера всегда ровно одна запись.

arturpub ★★
()
Ответ на: комментарий от k0valenk0_igor

хм. нет тут рекурсии тут за счёт «диспетчера запусков» эдакая разнесёная во времени(и даже может и налогатся - до диспетчер вроде кооперативную поддерживает) реентерабельность кода.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Люди не видят принципиальной разницы между func и func(), вот и мерещится везде это заезженное слово.

arturpub ★★
()
Ответ на: комментарий от drBatty

русская вика для меня не пруф.

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

Вика описывает обычную _реализацию_. Это не правильно, потому-что реализация уже давно не в ведении программиста.

Вот только автор сабжа об этом не знал и запилил реализацию которая, оказывается, не в его ведении.

Компилятор всё равно сделает как надо.

Во-первых тут нет компилятора. А во-вторых, откуда свединия что все будет «как надо»? Я вот думаю, что нет.

А в сишечке нет такой абстракции «стек».

Вообще-то имеется. Но причем тут Си?!

Ну а контексты(полноценные) есть только в ФП, а в сишечке это всё фигня. Я уж молчу про JS.

А что js уже перестал быть функциональным ЯП? Блеолять, надо почаще вылазить из крио-камеры, тут оказывается такие интересные дела творятся...

откуда стек в JS???

От туда, что адреса возвратов из функций надо где-то хранить.

k0valenk0_igor ★★★
()
Ответ на: комментарий от k0valenk0_igor

всё таки из за замыканий и т.п. там «кактусы» вызовов и они сразу в куче  — стек реальне там есть у хорошо оптимизирующих скорость исполнения машин.

а в общем случае нам «цепочки-каскады окружений» в виде «кактуса» для поддержания жизнедействия замкнувшихся сущьностей которые кому либо пока видны.

qulinxao ★★☆
()
Ответ на: комментарий от arturpub

В js по стандарту память описана как что-то, о чём программисту думать не следует.

PolarFox ★★★★★
()
Ответ на: комментарий от qulinxao

Ррр. Это не «кактусы вызовов», замыкания такие же объекты, как объекты например. Не путайте три понятия: лексическое определение функции (просто написана здесь), инстанциацию замыкания (исполнился код, где просто написана здесь) и вызов. Замыкание имеет две компоненты: собственно зохваченный контекст и записи активации (activation records). Последние создаются при [возможно рекурсивных] вызовах и отвечают за локальные переменные, контекст же фиксирован.

arturpub ★★
()
Ответ на: комментарий от arturpub

Да, и за точку возврата, как ни странно, тоже отвечает activation record, их цепочка и называется стеком вызовов, которого в js якобы нет :)

arturpub ★★
()
Ответ на: комментарий от arturpub

Нет там никаких растущих затрат. Старый колбэк отработал, установил новый колбэк, сам помер. В таблице диспетчера всегда ровно одна запись.

ясно, распарсил.

drBatty ★★
()
Ответ на: комментарий от k0valenk0_igor

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

в этом вопросе я больше доверяю SICP, а не вике. И сразу говорю, пруфов не будет, ибо лень искать.

Вот только автор сабжа об этом не знал и запилил реализацию которая, оказывается, не в его ведении.

быдлокодер.

Во-первых тут нет компилятора. А во-вторых, откуда свединия что все будет «как надо»? Я вот думаю, что нет.

«как ему надо». А это «как ему надо» сильно зависит от многого, в т.ч. погоды на Марсе.

А что js уже перестал быть функциональным ЯП?

ну называй его «ФП», я не против.

От туда, что адреса возвратов из функций надо где-то хранить.

кто тебе сказал, что они хранятся, и именно в стеке? Мне привести код, в котором не используется никакой стек, но рекурсия есть?

Но причем тут Си?!

при том, что в Си можно посмотреть, КАК это работает. А в js можно только догадываться.

drBatty ★★
()
Ответ на: комментарий от drBatty

быдлокодер

Я тоже умею обзываться ) Диванный теоретик вместо того, чтобы предложить «небыдлокод» использует магию ленивого программирования - лениво кукарекает «SICP» и улетает в закат

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Я тоже умею обзываться

я не со зла. Сам такой. Более убогого ЯП чем JS я не знаю, как не пиши, в любом случае быдлокод получается.

SICP

это не тебе.

drBatty ★★
()
Ответ на: комментарий от drBatty

Более убогого ЯП чем JS я не знаю

Как ни крути - единственный из динамических недоязычков который из коробки не запускает новый иннстанс своего рантайма (CGI-лайк) на каждый крошечный запрос извне

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Как ни крути - единственный из динамических недоязычков который из коробки не запускает новый иннстанс своего рантайма

а обязательно там использовать именно «динамический недоязычёк»?

drBatty ★★
()
Ответ на: комментарий от makoven

Так это ноды фишка, не js же? Джанго вроде то же самое делал. Да и рельсы наверное тоже. Хотя я конечно далек от этого всего...

arturpub ★★
()
Ответ на: комментарий от arturpub

Джанго с рельсами могут что-то подобное через fastCGI. Но нижележащие модули и i/o написаны в синхронном стиле. И каждый запрос честно останавливает весь мир, выполняется и только потом переходит к следующему.

makoven ★★★★★
() автор топика
Ответ на: комментарий от drBatty

Вот и я не знаю что вместо него. Тут принято возлагать надежды на rust. Так и поступим )

makoven ★★★★★
() автор топика

тред не читал. Рекурсии не будет.

bvn13 ★★★★★
()
Ответ на: комментарий от arturpub

позвольте позвольте

я даже патчил kde под freebsd вуиполнИл на курсере не приходя в сознание прикручивание замыканий к их недоинтерпретатору псевторакеты на ракете.

qulinxao ★★☆
()

Тред не читал. Рекомендую осилить эрланг.

nanoolinux ★★★★
()

Для каждого вызова будет рекурсивно создаваться свой контекст выполнения, не?

sphericalhorse ★★★★★
()

Рекурсией называется метод (функция), которая внутри своего тела вызывает сама себя.
Рассмотрим пример — вычисление факториала. Для того чтобы вычислить n!, достаточно знать и перемножить между собой (n-1)! и n.
Создадим метод, реализующий описанный способ.

static int fact (int n) {
if (n==1) {
return 1;
} else if (n==2) {
return 2;
} else {
return fact(n-1) * n;
}
}

Указанный метод вычисляет факториал натурального числа.

Если есть вызов внутри тела, значит и есть рекурсия.

oantey
()

Фик знает. По идее c памятью проблем быть не должно, в баузерах так часто делают. Но вообще я бы взял setInterval(). Только учтите, что он плавает.

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.