Domanda

Le chiamate di funzione vengono gestite tramite una struttura dati di stack.È sufficiente per supportare la ricorsione?

È stato utile?

Soluzione

Avere lo stack È il trattamento speciale che il compilatore deve avere quando supporta la ricorsione.

Nei linguaggi di programmazione più vecchi come le prime versioni di FORTRAN, l'ambiente runtime non aveva uno stack di funzioni e ciascuna funzione aveva esattamente un record di attivazione riservato ad essa da qualche parte nella memoria.Ciò significava che la ricorsione non era affatto possibile, perché se avessi chiamato ricorsivamente una funzione avresti sovrascritto il suo unico record di attivazione, perdendo traccia del contesto in cui ci sei arrivato.

L'introduzione dello stack di funzioni è ciò che per primo ha consentito di esprimere effettivamente la ricorsione in un linguaggio di programmazione.Prima di ciò, i programmatori utilizzavano la ricorsione come strumento per risolvere in modo astratto un problema, ma dovevano poi tradurre quel codice in logica iterativa a causa della mancanza di uno stack di chiamate.

Affinché un linguaggio di programmazione supporti la ricorsione, è necessario disporre di un meccanismo per mantenere dinamicamente lo stack di chiamate.Ciò non deve avvenire tramite uno stack esplicito;in teoria potresti allocare dinamicamente tutti gli stack frame e concatenarli insieme come un elenco collegato.Ciò può essere utile, ad esempio, se si desidera supportare coroutine o chiusure e in realtà è necessario conservare i vecchi record di attivazione dopo il ritorno della funzione in modo che i dati possano essere archiviati in seguito.

Spero che questo ti aiuti!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top