Pregunta

1) ¿Cuál es el método adecuado para hacer una imagen en CCL? O cuál es la diferencia exacta entre:

(compile-file "foo.lisp") y (progn (load "foo.lisp") (save-application "foo"))?

2) ¿Hay alguna posibilidad de cargar múltiples imágenes (preferida la línea de comando)?

¿Fue útil?

Solución

El compilador de archivos en sistemas LISP comunes crea una representación de la fuente original en algún tipo de lenguaje de máquina (dependiendo del procesador de destino) o para alguna máquina virtual (por ejemplo en clisp). Este archivo compilado se puede cargar en un sistema LISP en ejecución con la función de carga y crea las definiciones de la fuente (funciones, clases, variables, ...) y ejecuta otro código en el archivo.

Uno puede cargar archivos de origen directamente (también utilizando la carga de funciones). Si el LISP usa un compilador incluso para cargar formularios, la ventaja del compilador de archivos es:

  • La carga del código compilado debe ser un poco más rápido
  • Algunos errores de compilación en el momento de la compilación
  • Posiblemente compilación más agresiva con código más rápido en tiempo de ejecución
  • El código puede ser más pequeño (depende)

Guardar una imagen es independiente. La imagen es un volcado de memoria de un LISP en ejecución. Pero generalmente no todos los estados pueden ser arrojados dependiendo del sistema LISP. Candidatos de cosas que no se pueden arrojar a una imagen: conexiones de archivo, conexiones de red, ventanas abiertas ... por lo tanto, estas cosas pueden necesitar ser reabridas cuando se inicia una imagen.

Si desea iniciar una aplicación LISP, uno tiene varias opciones:

  • Cargue todo el código fuente en el inicio
  • Cargar todo el código compilado al inicio
  • Cargue una imagen con todo el código incluido

Este último es probablemente el más rápido. Para muchos propósitos, la carga de código compilado al inicio también es lo suficientemente rápido, especialmente si comenzar solo ocurre de vez en cuando.

Veamos su pregunta nuevamente.

(compile-file "foo.lisp")

Arriba simplemente compila un solo archivo en un archivo compilado (archivo FASL, 'carga rápida'). El efecto de la compilación también es que se ha registrado cierta información en el sistema LISP, pero las definiciones del archivo no están disponibles. Entonces debe cargar el archivo compilado.

(progn (load "foo.lisp") (save-application "foo"))

Arriba primero carga el archivo. Tenga en cuenta que un LISP con un compilador incremental puede compilar algunas o todas las declaraciones en ese archivo (CCL y SBCL están haciendo eso). Save-Aplication es una función específica de CCL, que arroja el estado LISP completo (menos conexiones de archivo, ...) y crea una aplicación que luego se puede iniciar.

Si desea crear aplicaciones LISP que comiencen como otras aplicaciones, Save-Aplication es el camino a seguir.

Si se pueden cargar varias imágenes depende del sistema. En CCL no puedes. En una máquina LISP se puede cargar una imagen base y luego múltiples imágenes incrementales sobre eso.

Otros consejos

compile-file Hace lo que dice que hace: compila un archivo fuente en el código nativo y almacena el resultado en otro archivo. Archivos compilados con compile-file se puede cargar con el load función. La compilación es simplemente una optimización, por lo que el efecto es muy similar a la carga del archivo de origen directamente.

Por el contrario, una imagen central almacena el estado completo del entorno LISP, incluido el montón LISP (con todos los códigos y datos cargados), así como el estado de la ejecución, por lo que tratar de cargar múltiples imágenes centrales en una sola instancia de LISP no tiene ningún sentido. Como se describe en el manual, puedes Guardar una imagen central mediante el uso (ccl:save-application "image_name") dónde image_name es el nombre del archivo de imagen que desea crear. Una imagen central solo se puede cargar iniciando una nueva instancia de Clozure CL y suministrando el archivo de imagen con el -I opción de línea de comandos.

En general, si está escribiendo una pieza de software que consta de múltiples archivos de origen, generalmente no desea compilar y cargar cosas manualmente. En cambio, considere Creación de una definición del sistema Archivo y cargando su software con ASDF.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top