Обработка изображений в Clozure Cl - PullRequest
3 голосов
/ 14 июня 2011

1) Как правильно создать изображение в ccl?Или какая точная разница между:

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

2) Есть ли возможность загрузить несколько изображений (предпочтительно в командной строке)?

Ответы [ 2 ]

5 голосов
/ 14 июня 2011

Компилятор файлов в системах Common Lisp создает представление исходного источника на каком-то машинном языке (в зависимости от целевого процессора) или для некоторой виртуальной машины (например, в CLISP). Этот скомпилированный файл затем может быть загружен в работающую систему Lisp с помощью функции LOAD и создает определения источника (функции, классы, переменные, ...) и выполняет другой код в файле.

Можно загружать исходные файлы напрямую (также с помощью функции LOAD). Если Lisp использует компилятор даже для загрузки форм, преимущество файлового компилятора:

  • загрузка скомпилированного кода должна быть немного быстрее
  • некоторая проверка ошибок во время компиляции
  • возможно более агрессивная компиляция с более быстрым кодом во время выполнения
  • код может быть меньше (зависит)

Сохранение изображения является независимым. Образ представляет собой дамп памяти работающего Lisp. Но обычно не каждое состояние может быть сброшено в зависимости от системы Lisp. Кандидаты вещей, которые не могут быть выгружены в образ: соединения с файлами, сетевые соединения, открытые окна, ... Итак, эти вещи, возможно, придется открыть заново при запуске образа.

Если вы хотите запустить приложение на Лиспе, у вас есть несколько вариантов:

  • загрузить весь исходный код при запуске
  • загрузить весь скомпилированный код при запуске
  • загрузить изображение с включенным кодом

Последний, вероятно, самый быстрый. Для многих целей загрузка скомпилированного кода при запуске также выполняется достаточно быстро, особенно если запуск происходит только время от времени.

Давайте снова посмотрим на ваш вопрос.

(compile-file "foo.lisp")

Выше просто компилируется один файл в скомпилированный файл (файл FASL, «быстрая загрузка»). Результатом компиляции также является то, что некоторая информация была записана в системе Lisp, но определения файла недоступны. Затем вам нужно загрузить скомпилированный файл.

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

Выше сначала загружается файл. Обратите внимание, что Lisp с инкрементным компилятором может компилировать некоторые или все операторы в этом файле (CCL и SBCL делают это). SAVE-APPLICATION - это специфическая функция CCL, которая выводит полное состояние Lisp (за исключением соединений с файлами, ...) и создает приложение, которое затем может быть запущено.

Если вы хотите создавать приложения на Лиспе, которые запускаются как другие приложения, SAVE-APPLICATION - это то, что вам нужно.

Если можно загрузить несколько изображений, это зависит от системы. В CCL вы не можете. На Лисп-машине можно загрузить базовое изображение, а затем несколько инкрементальных изображений поверх этого.

5 голосов
/ 14 июня 2011

compile-file делает то, что говорит: компилирует исходный файл в собственный код и сохраняет результат в другом файле.Файлы, скомпилированные с compile-file, могут быть загружены с помощью функции load.Компиляция - это просто оптимизация, поэтому эффект очень похож на прямую загрузку исходного файла.

Напротив, базовое изображение хранит полное состояние среды Lisp, включая кучу Lisp(со всем загруженным кодом и данными), а также состояние выполнения, поэтому попытка загрузить несколько основных образов в один экземпляр Lisp не имеет никакого смысла.Как описано в руководстве, вы можете сохранить образ ядра , используя (ccl:save-application "image_name"), где image_name - это имя файла образа, который вы хотите создать.Образ ядра может быть загружен только путем запуска нового экземпляра Clozure CL и предоставления файла образа с параметром командной строки -I.

Как правило, если вы пишете программный продукт, состоящий из нескольких исходных файловВы обычно не хотите компилировать и загружать вещи вручную.Вместо этого рассмотрим создание файла определения системы и загрузку программного обеспечения с помощью ASDF.

...