Pull to refresh

Comments 7

Кто-нибудь всерьёз писал под голое железо без стека

без рекурсии спокойнее, цикл с ручным фреймом.

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

Кто-нибудь всерьёз писал под голое железо без стека, не в учебном примере, а в работе?

На мейнфреймах IBM нет стека. На 6502 был такой стек, что его почти и не было. Ну и вообще аппаратный стек не во всех случаях пригоден. В частности, глубокая рекурсия на практике не очень хорошо ложится на вызов через стек.

У меня в конце статьи как раз вывод, что стек это не железо, а договорённость: sp оказался обычным x2, и держится всё на том, что её соблюдают. Ваши примеры это то же самое с другой стороны.

Про 6502 не думал совсем. 256 байт на фиксированной странице, и не подвинуть.

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

Да, всё верно. Особенно проблематичен фиксированный размер стека в случае многонитевой организации программы.

Можно подойти к вызову функций и совсем с другой стороны, без областей сохранения, как таковых. Вопрос сам по себе интересный, я писал про него здесь.

Прочитал обе части. Ухватил не всё с первого раза.

Но одну вещь вроде понял. У меня в коде к этой самой статье есть хвостовой вызов: print_dec не зовёт print_str, а прыгает в неё, отдав свой кадр. Я это сделал просто чтобы не заводить лишний кадр. А у вас во второй части выходит, что если так поступить со всеми вызовами, то возвращаться станет некуда и стек возвратов не нужен вовсе. Не думал, что моя мелкая экономия это край чего-то другого.
Поправьте, если я не туда понял.

Абсолютно верно!

Я тоже в свое время познакомился с этим сначала как с мелкой оптимизацией в ассемблере, а уже потом прочёл про продолжения на концептуальном уровне.

Sign up to leave a comment.

Articles