Gestione delle immagini in Clozure CL
Domanda
1) Qual è il metodo corretto per creare un'immagine in CCL? O qual è la differenza esatta tra:
(compile-file "foo.lisp")
e (progn (load "foo.lisp") (save-application "foo"))
?
2) Esiste la possibilità di caricare più immagini (la riga di comando preferita)?
Soluzione
Il compilatore di file nei sistemi LISP comuni crea una rappresentazione della fonte originale in una sorta di linguaggio della macchina (a seconda del processore di destinazione) o per una macchina virtuale (ad esempio in CLISP). Questo file compilato può quindi essere caricato in un sistema LISP in esecuzione con la funzione di caricamento e crea le definizioni della sorgente (funzioni, classi, variabili, ...) ed esegue altro codice nel file.
Si possono caricare direttamente i file di origine (anche utilizzando il carico della funzione). Se il LISP utilizza un compilatore anche per il caricamento dei moduli, il vantaggio del compilatore file è:
- Il caricamento del codice compilato dovrebbe essere leggermente più veloce
- Qualche errore che controlla il tempo di compilazione
- Forse una raccolta più aggressiva con codice più veloce in fase di esecuzione
- Il codice può essere più piccolo (dipende)
Salvare un'immagine è indipendente. L'immagine è un dump di memoria di un LISP in esecuzione. Ma generalmente non tutti gli stati possono essere scaricati a seconda del sistema LISP. Candidati di cose che non possono essere scaricate su un'immagine: connessioni di file, connessioni di rete, finestre aperte, ... quindi, queste cose potrebbero dover essere riaperte quando viene avviata un'immagine.
Se si desidera avviare un'applicazione LISP una ha diverse opzioni:
- Carica tutto il codice sorgente all'avvio
- Carica tutto il codice compilato all'avvio
- Carica un'immagine con tutto il codice incluso
Quest'ultimo è probabilmente il più veloce. Per molti scopi ora caricare il codice compilato all'avvio è anche abbastanza veloce, soprattutto se l'avvio avviene solo una volta ogni tanto.
Diamo di nuovo la tua domanda.
(compile-file "foo.lisp")
Sopra solo compila un singolo file in un file compilato (file FASL, 'Fast Load'). L'effetto della compilazione è anche che alcune informazioni sono state registrate nel sistema LISP, ma le definizioni del file non sono disponibili. È necessario caricare quindi il file compilato.
(progn (load "foo.lisp") (save-application "foo"))
Sopra prima carica il file. Si noti che un LISP con un compilatore incrementale può compilare alcune o tutte le istruzioni in quel file (CCL e SBCL lo stanno facendo). Salva-Applicazione è una funzione specifica CCL, che scarica lo stato LISP completo (meno connessioni di file, ...) e crea un'applicazione che quindi può essere avviata.
Se si desidera creare applicazioni LISP che iniziano come altre applicazioni, l'applicazione di salvataggio è la strada da percorrere.
Se è possibile caricare più immagini dipendenti dal sistema. In CCL non puoi. Su una macchina LISP si potrebbe caricare un'immagine di base e quindi più immagini incrementali sopra.
Altri suggerimenti
compile-file
Fa quello che dice che fa: compila un file di origine nel codice nativo e memorizza il risultato in un altro file. File compilati con compile-file
può essere caricato con il file load
funzione. La compilazione è semplicemente un'ottimizzazione, quindi l'effetto è molto simile al caricamento diretto del file di origine.
Al contrario, un negozio di immagini di base lo stato completo dell'ambiente LISP, incluso il heap LISP (con tutto il codice e i dati caricati), nonché lo stato dell'esecuzione, motivo per cui il tentativo di caricare più immagini di base in una singola istanza LISP non ha alcun senso. Come è descritto nel manuale, puoi Salva un'immagine di base usando (ccl:save-application "image_name")
dove image_name
è il nome del file di immagine che si desidera creare. Un'immagine centrale può essere caricata solo avviando una nuova istanza Clozure Cl e fornendo al file l'immagine -I
Opzione della riga di comando.
In generale, se stai scrivendo un software composto da più file di origine, di solito non vuoi davvero compilare e caricare le cose manualmente. Invece, considera Creazione di una definizione di sistema File e caricando il tuo software con ASDF.