Почему F # налагает низкий предел на размер стека?

Я хотел бы знать, есть ли фундаментальная причина для ограничения глубины рекурсии в F # до 10000 или около того, и, в идеале, как избежать этого ограничения. Я думаю, что вполне разумно писать код, который использует пространство стека O (n), и был бы признателен, если бы кто-то, кто не согласен, мог объяснить, почему они это делают. Большое спасибо. Я объясняю свои мысли ниже.

Я не вижу причин не позволять стеку увеличиваться до тех пор, пока не будет исчерпана вся доступная память. Это означало бы, что на бесконечную рекурсию потребуется больше времени, но это не значит, что мы уже не можем писать программы, которые потребляют бесконечный объем памяти. Я знаю, что можно уменьшить использование стека до O (1), используя продолжения и хвостовую рекурсию, но я не особо понимаю, насколько хорошо для меня делать это все время.Я также не вижу, как полезно знать, когда функции, вероятно, потребуется обработать «большой» ввод (ну, по стандартам 8-битного микроконтроллера).

Я думаю, что это принципиально отличается от необходимости, например, используйте параметры накопления, чтобы избежать квадратичного поведения во времени. Хотя это тоже включает в себя заботу о деталях реализации, и этого не нужно делать для «маленьких» входных данных, это также очень отличается тем, что компилятор не может тривиально устранить проблему самостоятельно. Кроме того, он отличается тем, что немного сложный код O (n), который был бы O (n ^ 2), если бы он был написан наивно, гораздо более полезен, чем простая, медленная, легкая для чтения версия. Напротив, код в стиле продолжения имеет точно такую ​​же сложность памяти, что и соответствующая наивная версия, но просто использует другой тип памяти. Это то, о чем компилятор не должен заставлять меня беспокоиться в наши дни?

Хотя я «предпочел бы» теоретическую причину, почему невозможно иметь глубокий стек, мы могли бы с таким же успехом обсудить практические аспекты тоже. Мне кажется, что стек - это несколько более эффективный способ управления памятью, чем куча, поскольку он не требует сборки мусора и легко освобождается? Я даже не уверен, что вижу, что за использование глубоких стеков приходится платить. По общему признанию, ОС должна выделить достаточно виртуального пространства, чтобы содержать всю память, которую вы, возможно, захотите использовать одновременно во всей программе для каждого стека потока. Но что с того.Это не значит, что мы, вероятно, исчерпаем общепринятый в настоящее время 48-битный лимит, сделав это, или что производители оборудования не могут тривиально увеличить этот лимит до 64-битных?

Здесь не так уж много специфики для F #. Я ожидаю, что такое же ограничение применяется и в C #, и не вижу, чтобы оно стало там более необходимым, хотя, очевидно, на практике это гораздо менее болезненно при программировании в императивном стиле.

Большое спасибо за любые ответы / комментарии.

РЕДАКТИРОВАТЬ:Я написал резюме ответов ниже.

15
задан user1002059 4 November 2011 в 05:44
поделиться