LINUX.ORG.RU

История изменений

Исправление byko3y, (текущая версия) :

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

Проблемы Си не закончиваются на стэке, и делать Си настолько плохим было не обязательно для высокоуровневого асма — проблемы отсутствия проверок выхода за границы и использования нуль-терминированных строк аппаратным стэком не решаются. Структуры данных большого размера в регистры не засунешь, эта проблема архитектурой не решается.

Я согласен с тем, что организация стэка в процессорах PDP ужасная, но это лишь вишенка на торте. Более того, x86 был создан адаптированным конкретно под Си c сишными массивами и конкретно строками, в том числе там был аппаратный поиск нуль-терминатора (REPZ) — именно потому я говорю, что x86 был куском дерьма очень давно, но его до сих пор тащят по инерции.

Исходная версия byko3y, :

Почему считается нормальным, что программа на асме может работая с данным перетереть адрес возврата в стеке? И, если это считается нормальным для асма, то должно быть и в Си, он высокоуровневый асм и не более.

Делать Си настолько плохим было не обязательно для высокоуровневого асма. Прежде всего, в асме нет никаких «данных», которыми перетирается «адрес возврата» ­­— в классической тьюринговой архитектуре программа вольна есть детей когда ей угодно. И для некоторых это было оправданием для того, чтобы на самом деле «есть детей». Это же микрокомпьютер, игрушка, чего большего вы от нее ждете? По крайней мере, таково было отношение в 70-х. Что за 50 лет с этим почти ничего не сделали? Ну сорян.

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

Проблемы Си не закончиваются на стэке, и делать Си настолько плохим было не обязательно для высокоуровневого асма — проблемы отсутствия проверок выхода за границы и использования нуль-терминированных строк аппаратным стэком не решаются. Структуры данных большого размера в регистры не засунешь, эта проблема архитектурой не решается.

Я согласен с тем, что организация стэка в процессорах PDP ужасная, но это лишь вишенка на торте. Более того, x86 был создан адаптированным конкретно под Си c сишными массивами и конкретно строками, в том числе там был аппаратный поиск нуль-терминатора (REPZ) — именно потому я говорю, что x86 был куском дерьма очень давно, но его до сих пор тащят по инерции.