Stack - vroby65/MiniForthConsole GitHub Wiki
stack
🧠 1. Origini teoriche: la pila come struttura dati
📅 Anni '40 - '50
- La struttura dati "stack" (in italiano "pila") è stata teorizzata negli anni '40 da matematici e logici informatici.
- Uno dei primi a parlarne fu Friedrich L. Bauer, matematico tedesco, che nel 1955 formalizzò l’idea insieme a Klaus Samelson.
- Lo stack nasce per gestire le chiamate di funzione nei linguaggi di programmazione in modo ordinato: LIFO ("Last In, First Out") = l’ultimo dato inserito è il primo ad essere rimosso.
👉 Esempio semplice: impilare piatti. Metti un piatto sopra l’altro e prendi sempre l’ultimo messo.
🖥️ 2. Stack nei primi computer
📅 Anni '50 - '60
- I primi computer non avevano uno stack hardware, ma i programmi simulavano il comportamento dello stack in memoria.
- I linguaggi come Algol (1958-1960) furono i primi a usare seriamente lo stack per gestione delle funzioni e delle variabili locali.
- Algol ha introdotto il concetto di scoping nidificato, che ha reso lo stack indispensabile.
🔧 3. Stack nel processore: implementazione hardware
📅 Anni '60 - '70
- Alcuni processori iniziarono ad avere registri dedicati allo stack, come il PDP-11 (DEC) con lo stack pointer (SP).
- L’Intel 8080 (1974) e soprattutto l’Intel 8086 (1978) introdussero un supporto hardware completo allo stack: SP e BP (base pointer), usati ancora oggi.
📌 Questo ha permesso:
- chiamate di funzione (
CALL
) e ritorni (RET
) - gestione dei parametri e variabili locali
- gestione delle interruzioni (interrupts) salvando lo stato del programma
💻 4. Stack e sistemi operativi
📅 Anni '80 - oggi
- Con l’evoluzione dei sistemi operativi (Unix, Windows, Linux), ogni thread/processo ha il suo stack privato.
- Lo stack è essenziale per:
- l’esecuzione delle funzioni
- la gestione delle eccezioni
- la sicurezza (Stack Overflow e attacchi buffer overflow)
- I compilatori (C, Pascal, etc.) usano lo stack per allocare dinamicamente variabili locali.
📲 5. Stack oggi: uso e sicurezza
📅 Anni 2000 - 2020+
- Lo stack è ancora fondamentale nei linguaggi compilati (C, C++, Rust).
- Nei linguaggi gestiti come Java o Python, lo stack è simulato nella macchina virtuale (es. JVM, PVM).
- I buffer overflow sono una minaccia comune: sfruttano lo stack per eseguire codice dannoso. Per questo oggi i sistemi:
- usano stack canary (protezione contro overflow)
- rendono lo stack non eseguibile (NX bit)
- isolano gli stack dei thread (ASLR)
🧵 6. Stack in contesti moderni
- In WebAssembly, lo stack è una parte centrale del modello di esecuzione.
- In programmazione concorrente, ogni thread ha il suo stack indipendente.
- In linguaggi funzionali come Forth o PostScript, lo stack è usato direttamente nella logica del programma.
📚 Riepilogo concettuale
Epoca | Evento Chiave |
---|---|
1955 | Bauer e Samelson formalizzano lo stack |
1960 | Algol usa lo stack per funzioni |
1970 | Nasce il supporto hardware (es. Intel 8086) |
1980+ | Sistemi operativi usano stack per thread/processi |
2000+ | Protezioni contro attacchi allo stack |
Oggi | Usato in JVM, WebAssembly, linguaggi funzionali |