Antigamente, os processadores não tinham instruções de pilha e as linguagens de programação não suportavam recursão. Com o tempo, mais e mais idiomas optam por oferecer suporte à recursão, e o hardware acompanha a suíte com recursos de alocação de quadros de pilha. Esse suporte variou muito ao longo dos anos com diferentes processadores. Alguns processadores adotaram registros de ponteiro de pilha e / ou pilha; algumas instruções adotadas que realizariam a alocação de quadros de pilha em uma única instrução.
À medida que os processadores avançam com caches de nível único e, em seguida, de vários níveis, uma vantagem crucial da pilha é a da localidade do cache. O topo da pilha está quase sempre no cache. Sempre que você pode fazer algo que tenha uma grande taxa de acertos de cache, você está no caminho certo com processadores modernos. O cache aplicado à pilha significa que variáveis locais, parâmetros, etc. estão quase sempre no cache e desfrutam do mais alto nível de desempenho.
Em resumo, o uso da pilha evoluiu tanto em hardware quanto em software. Existem outros modelos (por exemplo, a computação de fluxo de dados foi tentada por um longo período), no entanto, a localização da pilha faz com que ela funcione muito bem. Além disso, o código procedural é exatamente o que os processadores querem, para desempenho: uma instrução informando o que fazer após o outro. Quando as instruções estão fora de ordem linear, o processador desacelera tremendamente, pelo menos até o momento, já que não descobrimos como fazer acesso aleatório tão rápido quanto o acesso sequencial. (Btw, existem problemas semelhantes em cada nível de memória, do cache, para a memória principal, para o disco ...)
Entre o desempenho demonstrado de instruções de acesso sequencial e o comportamento de armazenamento em cache benéfico da pilha de chamadas, temos, pelo menos no presente, um modelo de desempenho vencedor.
(Também podemos jogar a mutabilidade das estruturas de dados nos trabalhos ...)
Isso não significa que outros modelos de programação não funcionem, especialmente quando eles podem ser traduzidos para as instruções sequenciais e o modelo de pilha de chamadas do hardware atual. Mas há uma vantagem distinta para modelos que suportam onde o hardware está. No entanto, as coisas nem sempre permanecem as mesmas, então podemos ver mudanças no futuro, já que diferentes tecnologias de memória e transistor permitem mais paralelismo. É sempre uma brincadeira entre linguagens de programação e recursos de hardware, então, vamos ver!