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