Введение
CMUCL — это бесплатная реализация Common Lisp, изначально разработанная в Университете Карнеги — Меллона. CMUCL работает на большинстве Unix-подобных платформ, включая Linux и BSD; также существует экспериментальный порт для Windows. Steel Bank Common Lisp является производной от CMUCL. Scieneer Common Lisp была коммерческой версией, основанной на CMUCL.
CMUCL is a free Common Lisp implementation, originally developed at Carnegie Mellon University. CMUCL runs on most Unix like platforms, including Linux and BSD; there is an experimental Windows port as well. Steel Bank Common Lisp is derived from CMUCL. The Scieneer Common Lisp was a commercial derivative from CMUCL.
История
Самая ранняя реализация предшествовала Common Lisp и являлась частью Spice Lisp, примерно в 1980 году. В 1985 году Роб МакЛаклан начал переписывать компилятор, который впоследствии стал компилятором Python, и CMUCL был портирован на Unix-рабочие станции, такие как IBM PC RT, MIPS и SPARC. Ранние выпуски CMUCL не поддерживали архитектуру Intel x86 из-за недостаточного количества регистров. CMUCL строго разделял типы с тегами и непосредственные типы данных, а сборщик мусора опирался на знание о том, что половина регистров ЦП может хранить только типы с тегами, а другая половина – только типы без тегов. Этого было недостаточно для бэкенда Python. После того, как CMU прекратил финансирование проекта (в пользу реализации Dylan с использованием части кодовой базы компилятора CMUCL), поддержку взяла на себя группа добровольцев. К 1996 году эта группа начала регулярно выпускать обновления, используя собственную инфраструктуру. Примерно в то же время был завершен порт на архитектуру Intel x86, сначала для FreeBSD, а затем для Linux. Проблема недостатка регистров была решена с помощью нового консервативного сборщика мусора. Этот сборщик мусора принимает любое значение любого типа в регистрах и рассматривает всё, что потенциально может быть указателем, как указатель, чтобы избежать его сбора или перемещения.
Компилятор и другие устройства исполнения кода
CMUCL включает в себя интерпретатор, который в основном используется для REPL, но также может применяться для более быстрой загрузки Lisp-файлов, не требующих компиляции. Это машина для интерпретации компактного байт-кода (который может быть сгенерирован компилятором). Сейчас это используется редко, но было популярно в ранних версиях CMUCL, поскольку размеры образов значительно уменьшались в то время, когда пропускная способность интернет-соединений была ограничена. Также имеется компилятор нативного кода под названием "Python" (не следует путать с языком программирования Python). Если исходный код Common Lisp написан с использованием соответствующих объявлений и оптимизирован по скорости, компилятор Python генерирует код, практически лишенный накладных расходов по сравнению с кодом, скомпилированным из языков вроде C++. Некоторые неэффективности, такие как интерфейсы вызова функций и отсутствие указателей в массивах пользовательских типов данных, обусловлены стандартом Common Lisp и требуют обходных решений (например, за счет большей инлайнинга и использования макросов для создания конструкций, имитирующих пользовательские структуры, но фактически обращающихся к полям в предварительно выделенных специализированных массивах). Компилятор Python также обладает мощными возможностями вывода типов, помогая программисту писать код без накладных расходов, либо автоматически определяя типы, либо предоставляя подсказки об упущенных возможностях оптимизации.
Особенности
Сборка мусора по поколениям и поддержка многопроцессорности на x86-платформах. Интерфейс для взаимодействия с функциями на языке C и системными библиотеками, включая разделяемые библиотеки на большинстве платформ, и прямой доступ к системным вызовам Unix. Поддержка межпроцессного взаимодействия и удаленного вызова процедур. Реализация CLOS, объектной системы Common Lisp, включающая мультиметоды и метаобъектный протокол. Графический отладчик на уровне исходного кода с интерфейсом Motif и профилировщик кода. Интерфейс к оконной системе X11 (CLX) и развитая библиотека графических виджетов (Garnet). Расширяемые потоки ввода-вывода, программируемые пользователем. Hemlock, редактор, подобный Emacs, реализованный на Common Lisp.