Другие языки программирования и технологии

ВОПРОС программистам Интересует стек и работа с памятью. В каких учебниках можно про это узнать более детально?

1) Устройство стековой памяти
2) Устройство динамической и вообще, всех видов памятей
3) Устройство программы на низком уровне
4) Как компилировался первый компилятор

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

Отсюда вывод: читать надо об алгоритмах и структурах данных. Найди книгу старика Никлауса Вирта примерно с таким названием, она короткая (по сравнению с другими материалами на эту тему). Поскольку архитектура компьютера имеет много изменяющихся во времени нюансов, лучше искать последнее издание.

Зная фундамент, дальше можно ориентироваться по прикладной документации. Если платформа x86 c Windows - читай MSDN, а если что-то юниксовое на том же железе - то документацию по юниксам. Если не интел, а IBM Power, Sparc (который, вроде, к Fujitsu отошёл) или что-то ещё, то их документацию смотри.

Стек, как тебе верно ответили, - это просто область данных в адресном пространстве процесса. Обычно он начинается в старших адресах и растёт вниз, это позволяет гибко регулировать размер стека, не мешая остальным регионам памяти. Адресное пространство - это линейный диапазон адресов от 0 до сколько разрядность шины адреса позволяет (например, в 80386-Pentium - 32 бит, в Pentium Pro и далее - 36 бит (PAE), а в современных 64-битных камнях - несложно догадаться, сколько). Оно делится на пользовательскую часть и системную, обычно пополам, т.к. системе так проще различать адреса, хотя, под закат 32-битной адресации процессам уже не хватало 2 гигов, и можно было поделить память 3:1. Пользовательская часть адресных пространств процессов изолирована друг от друга, но можно явно указать ОС, что некий диапазон адресов будет общим для двух и более процессов. Системная часть - всегда общая.

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

Скомпилированная программа в файле - это заголовок, разделы кода, разделы данных (и тех, и тех может быть много) и ссылки на динамические библиотеки. Ещё могут быть нашлёпки вроде ЭЦП и др. данных.

Загрузка программы в память выполняется путём создания нового процесса или (в Unix) - замещением исполняемого образа в рамках текущего процесса, или (например, в VMS) - добавлением образа к уже выполняемому образу без его вытеснения из памяти. Операционка раскладывает код и данные по соответствующим участкам адресного пространства процесса и загружает динамические библиотеки (или мапит уже загруженные), затем передаёт управление на первую инструкцию с понижением привилегий. Передача управления обратно к ОС может происходить по аппаратным или программным прерываниям (таймер, данные от устройства и др.) или по вызову системного сервиса.

Кроме адресного пространства, у каждого процесса есть свои хендлы или дескрипторы, ссылающиеся на открытые файлы и др. объекты ядра (процессы, сетевые сокеты, примитивы синхронизации и др).

Кроме "тяжёлого" процесса, есть такое понятие как поток (thread), это с т.з. ОС - отдельный процесс, разделяющий адресное пространство и исполняемый образ с другими потоками.

Всю специфику нужно читать в документации по конкретным ОС. Гуглишь все незнакомые слова и ищешь документацию по ним.

Первый компилятор писался на ассемблере, а первый ассемблер - непосредственно в машинных кодах.
ВК
Владимир Кондратьев
54 053
Лучший ответ
Dima Arkhipov O_O
Если это chatGPT, то это охереть как круто!
Dima Arkhipov Вот, всё хочу попробовать, но купить ВПН жаба душит.
Виктор Мерзляков да ...ть.. сложно что ли автора и книжку просто написать?
че у вас за любовь к большим текстам)))
>1) Устройство стековой памяти
Это просто область ОЗУ, зарезервированная под стек.

>2) Устройство динамической и вообще, всех видов памятей
Зависит от конкретного устройства. Я по молодости PLC программировал, так там было штук 7 разных видов памяти - адресуемая побитно, побайтно, пословно, энергонезависимая и сбрасываемая, специальная память для работы с устройствами на шине и прочая фигня.

>3) Устройство программы на низком уровне
Программа представляет собой набор инструкций процессора.

>4) Как компилировался первый компилятор
Головой, скорее всего. Раньше программы писали без компьютера - на карточках и ленточках. Ну или интерпретатором.

>В идеале понять хочу каким образом выделяется память
Приложение делает запрос операционной системе на выделение некоторого количества памяти. ОС делает некотороые проверочки и либо возвращает указатель на выделенную память, либо дает приложению по рукам.

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

>поясняю для векипедистов и свидетелей чата GPT мне нужна ЛИТЕРАТУРА.
Твоя ЛИТЕРАТУРА зависит от АРХИТЕКТУРЫ. Откуда нам знать, устройство какой архитектуры ты собрался там программировать? Есть там операционная система или память доступна для прямой адресации или и то и другое?
Посмотри Криса Касперски. Так живо и интересно, как у него, ты больше нигде не прочитаешь.
Виктор Мерзляков мне увы нужно про память почитать.
Точнее про оптимизацию работы с памятью если быть точныи
Чтобы научиться работать с кодом чтобы он не жрал ресурсы.
Стек это вообще структура данных. Типа массив, но брать из него элементы можно только с конца
Некоторые ответы можно найти в книге "Программирование однокристальных микропроцессоров" Григорьев В. Л., я начинал не с этой книгой, но во многом она помогла.
Виктор Мерзляков книга же за 1987 по свежее ничего нет?