Compiler des fichiers binaires avec Clozure Common Lisp
-
08-07-2019 - |
Question
Avec un programme simple tel que le suivant, comment feriez-vous:
-
compilez-le en tant que fichier image séparé chargé par l'implémentation, et quels arguments de ligne de commande utiliseriez-vous pour le charger?
-
Compilez-le en tant que fichier binaire autonome pouvant être chargé et exécuté tel quel.
Remarque: j'ai essayé d'ajouter ": prepend-kernel t " lors de la sauvegarde de l'application uniquement pour avoir l'erreur suivante.
Error: value NIL is not of the expected type REAL. While executing: CCL::<-2, in process Initial(0).
-
Comment voulez-vous supprimer le message de bienvenue?
Le programme
(defun main () (format t "This is the program.")0)
Modifier
Je déteste répondre à une partie de ma propre question, mais je l’ai tout de même trouvé.
Une fois la fonction chargée, tapez ce qui suit pour la compiler:
(ccl:save-application "app")
Ceci crée un fichier image. Pour le charger en le passant au type d'implémentation (note: le binaire 'ccl' est dans mon chemin système);
ccl -I app
Pour exécuter une fonction de niveau supérieur, transmettez-la en tant que paramètre
ccl -I app --eval (main)
La solution
Voir la documentation Clozure Common Lisp sous Enregistrement d'applications
Compilation et chargement de fichiers Lisp
Vous pouvez compiler un fichier nommé /foo/bar.lisp
en appelant
(compile-file "/foo/bar.lisp")
Ceci créera un fichier fasl (FASt Load), qui contient du code natif.
Vous pouvez charger le fichier compilé, le fichier fasl, avec la fonction LOAD
. LOAD
et COMPILE-FILE
sont des fonctions standard de Common Lisp.
Création d'applications
Quelques définitions:
- Noyau CCL : partie de CCL qui fournit des services d'exécution de bas niveau tels que la gestion de la mémoire.
- Image : une sauvegarde sauvegardée du tas Lisp
- Application : noyau CCL + image. Cela peut être dans un seul fichier.
Vous pouvez enregistrer une application en appelant une fonction spécifique à CCL:
(save-application "/foo/bar-image" :toplevel-function #'main)
Ceci enregistrera une image que vous pourrez exécuter à l'aide du noyau CCL à partir d'un interpréteur de commande:
ccl -I /foo/bar-image
Pour enregistrer un fichier exécutable incluant le noyau, utilisez-le à partir de Lisp:
(save-application "/foo/bar-app"
:toplevel-function #'main
:prepend-kernel t)
Vous pouvez appeler cet exécutable comme d'habitude avec / foo / bar-app
à partir d'un interpréteur de commande.
Dans Clozure Common Lisp, vous pouvez vérifier
*command-line-argument-list*
pour la liste des arguments de ligne de commande fournis.