Programmazione stack-oriented
La '''programmazione stack-oriented''' (letteralmente "orientata alla pila"), o '''stack-based''' ("basata su pila") è un [[paradigma di programmazione]] che basa il suo funzionamento su una [[macchina a stack]] (''stack machine'') a cui passare i [[Parametro (programmazione)|parametri]]. Diversi linguaggi seguono questo paradigma, fra i più noti [[Forth (linguaggio)|Forth]], [[RPL (linguaggio)|RPL]], [[PostScript]], e vari linguaggi [[assembly]] (di livello meno astratto).

I linguaggi stack-oriented operano su una o più [[Pila (informatica)|pile]] (''stack''), ciascuna delle quali possono avere scopi diversi. Per cui, gran parte dei costrutti di programmazione che possono essere usati in altri linguaggi devono essere modificati per poter funzionare in un sistema a pila. Inoltre, alcuni linguaggi stack-oriented operano in [[notazione polacca inversa]] (o postfissa), ovvero, ogni argomento o parametro per un comando viene espresso prima del comando stesso. Per esempio, in notazione postfissa si scriverebbe {{code|2, 3, multiply}} anziché {{code|multiply, 2, 3}} ([[notazione polacca]] o prefissa), o {{code|2 multiply 3}} ([[notazione infissa]]).

Teoricamente l'interpretazione dei programmi scritti secondo il paradigma stack-based è più veloce rispetto a quelli scritti secondo modelli più classici, in quanto non dev'essere eseguita un'[[analisi sintattica]], ma solo [[Analisi lessicale|lessicale]].

== Algoritmi stack-based ==
Consideriamo un linguaggio stack-based in notazione postfissa, come [[PostScript]]. Per capire il funzionamento di un sistema a pila, consideriamo un'espressione matematica come {{code|2 3 mul}}.

[[File:Human stack.svg|thumb|Illustrazione]]

Dapprima verrà preso {{code|2}} e posto sulla pila, seguito da {{code|3}}. In seguito si incontra {{code|mul}}, che è un operatore che indica un'istruzione da eseguire. Le istruzioni dell'operazione {{code|mul}} prevede che gli ultimi due valori nella pila vengano estratti, moltiplicati e scartati, e che il risultato della loro moltiplicazione ({{code|6}}) venga ri-aggiunto sulla pila.

Nel caso di calcoli più complessi, come {{code|(2 + 3) × 11 + 1}} (in notazione postfissa {{code|2 3 add 11 mul 1 add}}),
il calcolo può essere eseguito nella stessa maniera. I passi dell'algoritmo per eseguire il calcolo di cui sopra sono mostrati nella tabella seguente. Ogni colonna mostra un elemento in ingresso e il contenuto dello stack dopo aver processato tale input.
{| class="wikitable" 
|-
! Input
| style="text-align: right;" | <kbd>2</kbd>
| style="text-align: right;" | <kbd>3</kbd>
| style="text-align: center;" | <kbd>add</kbd>
| style="text-align: right;" | <kbd>11</kbd>
| style="text-align: center;" | <kbd>mul</kbd>
| style="text-align: right;" | <kbd>1</kbd>
| style="text-align: center;" | <kbd>add</kbd>
|-
! Stack
| style="text-align: right; vertical-align: bottom;" | <kbd>2</kbd>
| style="text-align: right; vertical-align: bottom;" | <kbd>3<br/>2</kbd>
| style="text-align: right; vertical-align: bottom;" | <kbd>5</kbd>
| style="text-align: right; vertical-align: bottom;" | <kbd>11<br/>5</kbd>
| style="text-align: right; vertical-align: bottom;" | <kbd>55</kbd>
| style="text-align: right; vertical-align: bottom;" | <kbd>1<br/>55</kbd>
| style="text-align: right; vertical-align: bottom;" | <kbd>56</kbd>
|}

La programmazione basata su stack funziona quindi prelevando un determinato numero di valori dalla cima alla pila (''pop'') per poterli processare e riaggiungere il risultato in cima allo stack (''push'').

== Manipolazione dello stack ==
Generalmente, i linguaggi di programmazione basati su pila forniscono metodi per manipolare la pila stessa. Fra i più comuni, {{code|dup}} per duplicare l'elemento in cima allo stack, {{code|exch}} (o {{code|swap}}) per scambiare i due elementi in cima, {{code|roll}} per permutare in maniera ciclica un sottinsieme degli elementi in cima,<ref>{{cita web|url=http://www.ugrad.math.ubc.ca/Flat/stack-eg.html|titolo=5.5.1 How Roll Works|lingua=en|editore=[[Università della Columbia Britannica]]|sito=ubc.ca|urlarchivio=https://web.archive.org/web/20030222200921/http://ugrad.math.ubc.ca/Flat/stack-eg.html|dataarchivio=22 febbraio 2003|urlmorto=no}}</ref> o {{code|pop}} (o {{code|drop}}) per scartare l'elemento in cima.

Per mostrare gli effetti di un operatore, può essere usato un [[Commento (informatica)|commento]]. La notazione seguente è usata solitamente in [[Forth (linguaggio)|Forth]], dove i commenti sono inseriti fra parentesi.

<syntaxhighlight lang="forth">( prima -- dopo )</syntaxhighlight>

Per esempio, gli operatori basilari del Forth sono descritti come segue:

<syntaxhighlight lang="forth">
dup  ( a -- a a )
drop ( a -- )
swap ( a b -- b a )
over ( a b -- a b a )
rot  ( a b c -- b c a )
</syntaxhighlight>

E la funzione <code>fib</code> è descritta come segue:

<syntaxhighlight lang="forth">fib  ( n -- n' )</syntaxhighlight>

== Note ==
<references/>

== Voci correlate ==
* [[Notazione polacca inversa]]
* [[Concatenative programming]]

{{Paradigmi di programmazione}}
{{Portale|informatica}}

[[Categoria:Paradigmi di programmazione|Stack-oriented]]