170 похожих чатов

Я не вижу смысла в утверждениях что стека не существует,

когда есть stack unwinding и stacktrace. Какой практический смысл отрицать существование абстракции которой оперируют оба этих конструкта?

40 ответов

24 просмотра

но ведь они не оперируют этой абстракцией

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Vlad
но ведь они не оперируют этой абстракцией

Если предположить что у нас нет стека вызовов и контрол флоу реализован любым другим способом, то есть мы можем нарушать правило, что мы возвращаем управление вызывающему коду. Условно говоря вместо обычной структурированный программы в c++ мы взяли и поехали на setjmp/longjmp во все стороны. Что-нибудь из того что описано стандартом в c++ все еще будет иметь смысл? Automatic storage duration? stack unwinding? std::stacktrace? Не будет, так как такая ситуация описана как ub. Даже return теряет смысл. Просто мы почему то не называем стек вызовов стеком вызовов в этом случае. Непонятно почему.

Aleksei Kuznetsov Kuznetsov
Если предположить что у нас нет стека вызовов и ко...

ваше предположение звучит так, будто подход к реализации — стек — обеспечивает семантику тому же return, что очевидно не так. семантика прописана в стандарте, и если реализация творит дичь, то она попросту не соответствует стандарту в стандарте уже было понятие о потоке управления, функциях, их вызове и возврате, и на основе такого понятийного аппарата вполне можно сформулировать семантику std::stacktrace не прибегая к стеку, что мы и наблюдаем в тексте

Aleksei Kuznetsov Kuznetsov
Если предположить что у нас нет стека вызовов и ко...

никто не говорит что фреймы должны лежать гдето вместе например

А я не вижу смысла обсуждения стека в чате по С/С++, когда такого понятия нет в определении языка.

Aleksei Kuznetsov Kuznetsov
Если предположить что у нас нет стека вызовов и ко...

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

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Vlad
ваше предположение звучит так, будто подход к реа...

Семантика return вернуть управление вызывающему коду. Call stack структура данных описывающая отношение вызывающего кода и вызываемого кода, без разницы как она реализована. Речь идет не об имплементации в каждой конкретной вм. Какой смысл имеет return если у вас нет call stack'а?

Danya🔥
Все ещё не понимаю как call stack и return связаны

У вас в стек-фрейме имеются локальные переменные функции, адрес возврата и параметры функции.

Danya🔥
Тут разговор в рамках стандарта

https://blog.panicsoftware.com/coroutines-introduction/ Закину на всякий случай

Sergey Sobolev
И что, по-другому реализовать никак нельзя?

Очень странный вопрос. А как вы собираетесь вернуться назад в точку выполнения своего без сохранения контекста выполнения?

Есть платформы где стека нет в принципе. Например первые моменты работы BIOS есть доступ только к регистрам, а память ещё не проинициализирована. C++ на таких платформах работает BTW

🐙 Antony Polukhin
Есть платформы где стека нет в принципе. Например ...

Антон, на ЕС-ЭВМ вообще нет (не было) стека, там используются связанные списки блоков PSB

🐙 Antony Polukhin
Есть платформы где стека нет в принципе. Например ...

а как под такие платформу плюсы компилят? там же наверняка свой компиль, который учитывает особенность железки и вместо принятых в х86 инструкций и регистров для стэка использует что-то другое?

Andrey Enshin
а как под такие платформу плюсы компилят? там же н...

Не компиль, линковщик. Для DOS был такой формат исполняемых файлов — com. Размером 64К максимум, и стек там шел с обратного конца от этих 64К. Ничто не помешает на какой-нибудь атмеге стек тоже организовать с обратного конца от RAM.

Aleksei Kuznetsov-Kuznetsov Автор вопроса
🐙 Antony Polukhin
Есть платформы где стека нет в принципе. Например ...

Я скорее не про отсутствие sp регистров в вм, а про то что структура данных, которая хранит адреса возврата все равно есть, и она lifo. Она может быть в дженерик регистрах, не обязательно в памяти. Иначе как мы можем возвращаться к вызываемому коду?

Aleksei Kuznetsov Kuznetsov
Я скорее не про отсутствие sp регистров в вм, а пр...

это совсем о другом) это про структуру данных как абстракицю и как её использовать и где)

Aleksei Kuznetsov Kuznetsov
Если предположить что у нас нет стека вызовов и ко...

Да и вообще говоря, джампы это повод очень хорошо задуматься о происходящем.

Aleksei Kuznetsov Kuznetsov
Я скорее не про отсутствие sp регистров в вм, а пр...

не обязательно Можно например все вызовы всегда инлайнить => stacktrace получать по указателю на инструкцию, а не по указателю на начало стек фрейма

Aleksei Kuznetsov-Kuznetsov Автор вопроса
🐙 Antony Polukhin
не обязательно Можно например все вызовы всегда ин...

Ну согласен, единственное что такой таргет не сможет в динамические библиотеки, но их в стандарте тоже нет, поэтому все хорошо

Aleksei Kuznetsov-Kuznetsov Автор вопроса
🐙 Antony Polukhin
не обязательно Можно например все вызовы всегда ин...

Хотя что делать с рекурсиями, которые не развернуть в циклы?

Aleksei Kuznetsov Kuznetsov
Хотя что делать с рекурсиями, которые не развернут...

либо превращать в цикл и инлайнить вызовы, либо падать с ошибкой компиляции

Aleksei Kuznetsov-Kuznetsov Автор вопроса
🐙 Antony Polukhin
либо превращать в цикл и инлайнить вызовы, либо па...

Но разве с точки зрения языка рекурсия это ошибка компиляции? Если мы говорим что это так на конкретной платформе, значит платформа может только в сабсет c++, получается без стека вызовов мы не можем получить полноценный с++ на этой платформе

Aleksei Kuznetsov Kuznetsov
Но разве с точки зрения языка рекурсия это ошибка ...

Можно ограничить через количество аргументов для функции, выдав их меньше чем регистров в системе, оставшиеся регистры использовать для треканья стейта рекурсии https://eel.is/c++draft/implimits#2.12 Ну и тут вообще позволяют делать имплементорам что угодно, лишь бы было задокументировано https://eel.is/c++draft/implimits#2

Aleksei Kuznetsov Kuznetsov
Но разве с точки зрения языка рекурсия это ошибка ...

Ты если исключения отключаешь или RTTI уже получаешь не полноценный С++. И во всяких эмбедед так и делают.

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Kirill Bolshakov
Ты если исключения отключаешь или RTTI уже получае...

Да можно и всю std выкинуть, но ничто не мешает реализовать что rtti, что исключения на платформе, делают так из соображений рационального использования памяти, проца. Ну и кому то контрол флоу исключений не нравится.

Aleksei Kuznetsov-Kuznetsov Автор вопроса
🐙 Antony Polukhin
Можно ограничить через количество аргументов для ф...

Ну 2.12 же про другое, если ваш компилятор решил аллоцировать регистры под стейт рекурсии, то сколько этого стейта понадобится, все равно станет известно только в рантайме же, в зависимости от глубины. Ну и какой мне код то сгенерить если я глубину узнаю в рантайме? На n уровней, а дальше крашнуться?

Aleksei Kuznetsov Kuznetsov
Ну 2.12 же про другое, если ваш компилятор решил а...

Но ведь щас и в обычной ситуации так и происходит :)

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Kirill Bolshakov
Но ведь щас и в обычной ситуации так и происходит ...

Естественно, просто в этом случае мы решение принимаем во время компиляции, когда генерим код. От того что мы в рантайме выжрали стек и упали у нас не пухнет бинарь.

Kirill Bolshakov
Ты если исключения отключаешь или RTTI уже получае...

Имхо, исключения - несоизмеримо более серьезная потеря, нежели RTTI

Гласси
Не компиль, линковщик. Для DOS был такой формат ис...

.model tiny молодость на Atmega8 так и сделано: стек с конца срама

Aleksei Kuznetsov Kuznetsov
Но разве с точки зрения языка рекурсия это ошибка ...

любую рекурсию можно реализовать через цикл. Пока видимое поведение программы не изменяется — с точки зрения компилятора и стандарта всё ОК.

Aleksei Kuznetsov-Kuznetsov Автор вопроса
Max
любую рекурсию можно реализовать через цикл. Пока ...

Именно, с помощью стека сохраняя стейт

Aleksei Kuznetsov Kuznetsov
Именно, с помощью стека сохраняя стейт

Выбор абстракции непринципиален. Абсолютно ничего не мешает сохранять с помощью того же линкедлиста. Или, как в стандартном std::stack, с помощью дека.

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

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта