Oltre al concetto di Dll che fornisce funzionalità di caricamento/scaricamento di metodi o funzioni in fase di esecuzione, mi chiedo se un compilatore possa mai dire qualcosa del tipo, ok dato che questa particolare parte del codice occupa una notevole quantità di spazio nel segmento di codice e non verrà mai più utilizzato dopo questo punto durante l'esecuzione del programma, sarebbe opportuno generare del codice per scaricare quella parte del segmento di codice dopo aver raggiunto quel particolare punto durante l'esecuzione del programma in modo che lo spazio complessivo occupato dal segmento di codice si riduca. È qualcosa di fittizio o può succedere?Un compilatore può mai generare codice per scaricare parti del segmento di codice durante l'esecuzione?
risposta
Un compilatore può fare tutto ciò che vuole, purché ciò non violi lo standard. Se riesce a capire che il codice non viene mai più chiamato, può abbandonarlo completamente.
Potrebbe anche sostituirlo con una funzione di stub più piccola che ricaricherebbe il codice, se necessario.
Ma sarà molto improbabile vederlo in un sistema operativo moderno poiché il sistema operativo stesso fornisce tale funzionalità sotto le copertine.
I sistemi operativi (almeno quelli comuni) si scambiano le pagine fisiche quando la memoria si esaurisce e non verranno ricaricati fino a quando non sono necessari (di solito da un errore di pagina quando si tenta di accedervi).
Non conosco un compilatore che faccia questo, ma non c'è nessuna regola che lo proibisca. Se il compilatore può dimostrare che così facendo non cambierà la semantica del programma, allora è permesso dalla regola as-if.
Di solito non è necessario, tuttavia, poiché il codice non utilizzato può già essere sostituito come parte del meccanismo del file di paging associato alla memoria virtuale. (e perché probabilmente si risparmiano solo pochi KB di spazio di memoria)
Sicuro. C'è una tecnica chiamata overlaying che carica un codice diverso nello stesso bit di spazio indirizzo in momenti diversi. A volte è stato fatto manualmente, altre volte i compilatori hanno aiutato. A volte il caricamento viene eseguito in software, a volte in hardware (con multiplexing degli indirizzi, ad esempio durante il tempo di avvio un bit dello spazio di indirizzamento viene letto da un chip ROM, ma dopo l'avvio passa invece alla RAM dell'indirizzo o ad una ROM diversa).
La sovrapposizione era molto più comune quando i computer avevano meno memoria, ad es. agli albori del DOS dove si aveva 640K al massimo e spesso nemmeno quello. In questi giorni ha ancora applicazioni per sistemi embedded in cui la memoria e/o lo spazio degli indirizzi sono un premio.
Sì, i driver di dispositivo Windows utilizzano questa tecnica. Il formato LE file ha determinati segmenti di codice contrassegnati come discardabili. Il sistema operativo può anche certe volte prendere una tale decisione per scambiare i segmenti di codice che non sono stati utilizzati per un lungo periodo di tempo.
Strettamente parlando, questa non è l'area in cui il compilatore può giocare. Per lo più è il linker/loader/OS.
I segmenti di codice scartati esistono anche nel formato PE più comune utilizzato da EXE e DLL. Il compilatore ha sicuramente un ruolo qui; posiziona le funzioni in segmenti specifici. Ma non ha molto senso, come hai notato: un sistema operativo può scartare tutte le pagine di sola lettura che sono ricaricabili e scarterà le pagine che non sono state toccate ultimamente. – MSalters
+1 domanda interessante – delnan