Механизм, с помощью которого Common Lisp компилирует и загружает код в изображение - PullRequest
0 голосов
/ 27 июня 2018

Недавно я читал о том, как современные ОС загружают исполняемые программы и выделяют для них память. К сожалению, у меня есть только справочник по информатике на русском языке в качестве справочника, поэтому, пожалуйста, исправьте меня, если я ошибаюсь, но похоже, что современные ОС имеют разные разделы в исполняемой программе для данных и реальных команд процессора. Кроме того, невозможно передать управление в секцию данных, то есть нельзя сохранить команду там. Также невозможно изменить команду процессора в секции исполняемого файла (text).

Отсюда возникает вопрос: как это делает современный скомпилированный CL (SBCL, Clozure-CL)? Насколько я понимаю, он создает скомпилированные файлы FASL и затем загружает их. Но видимые файлы FASL создаются при компиляции файла. Что происходит при оценке формы функции? Во-вторых, как CL загружает их (на уровне команд машины / ОС), чтобы им выделялась правильная память? Кроме того, старый код должен быть как-то выгружен.

PS. Конечно, это не проблема для интерпретируемых языков. И все становится еще сложнее для JIT-компиляторов.

1 Ответ

0 голосов
/ 20 июля 2018

Может быть, это проясняет ситуацию: Группы Google

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

(привет)

И ваш код будет выполнен, и код, который вы запускаете, скомпилирован, и не интерпретируется В SBCL вам не нужно явно компилировать сначала, поскольку весь код, который вы вводите или загружаете в sbcl, компилируется на лету. В Дело в том, что в sbcl нет переводчика. В других системах LISP вы можете хотя нужно явно скомпилировать, чтобы компилировать код.

Файл fasl не является исполняемым сам по себе, его необходимо использовать вместе. с sbcl.

...