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