Все зависит от языка, платформы и ОС.
Когда говорят о куче, обычно подразумевают динамическое выделение памяти. На старте приложение не резервирует память в куче, а делает это по мере необходимости.
Если вы пишите например на C++ под платформу x86, то память под стек (несколько мегабайт) резервируется в самом начале работы приложения и освобождается только при его завершении.
Для разных языков то как реализован стек может сильно отличаться, важно лишь то что это обязательная часть механизма работы функций. Именно через него передаются аргументы, возвращается результат. На нем могут создаваться локальные переменные для функций.
Интерпретируемые языки могут быть устроены сильно по разному. Но в большинстве случаев они ведут себя так, как будто у них есть стек и куча.