Есть ли компиляторы собственного кода Lisp?

Swift 4

super.init(nibName:String(describing:MyClass.self), bundle: nil)
32
задан Headcrab 27 May 2009 в 02:25
поделиться

6 ответов

Многие компиляторы Lisp компилируются в «собственный» код. «Родной» здесь означает «машинный код» (x86 в 32-битном или 64-битном режиме, PowerPC, SPARC, ...).

Другие вопросы:

  • могут ли компиляторы «неродного кода» генерировать одиночные исполняемые файлы? -> Да.

  • могут ли компиляторы «машинного кода» генерировать одиночные исполняемые файлы? -> Да

  • как «родной» является «родным»? -> Система Lisp в большинстве случаев будет иметь свой собственный внутренний макет структуры данных (классы CLOS), их собственная обработка ошибок («условия»), их собственное управление памятью (сборка мусора), их собственные библиотеки, ...

  • может ли Lisp работать без сборщика мусора? -> Обычно нет. Есть исключения.

  • как насчет размера приложения? -> По умолчанию простые способы создания приложения на Лиспе часто приводят к большим исполняемым файлам. Исполняемые файлы включают в себя весь Лисп, включая его библиотеку, имена всех символов, информацию о списках аргументов функций, компилятор, отладчик, информацию о местоположении исходного кода и многое другое. Некоторые компиляторы также генерируют объемный код (например, SBCL).

  • есть ли способы уменьшить размеры приложений? -> Это зависит от системы Lisp. Коммерческие системы Lisp, такие как LispWorks и Allegro CL, могут. Для доставки приложений они могут удалить неиспользуемый код, удалить отладочную информацию, удалить части Lisp (библиотеки, компилятор, ...) и т. д.

  • могут системы Common Lisp генерировать небольшие исполняемые файлы. Я имею в виду очень маленький. -> Не совсем. Исполняемые файлы могут быть либо большими (CCL), либо очень большими (SBCL). Некоторые системы Common Lisp могут генерировать исполняемые файлы среднего размера. Но никто не может реально генерировать небольшие исполняемые файлы.

  • действительно ли нет способа генерировать действительно маленькие исполняемые файлы? -> Много лет назад были написаны компиляторы, которые генерируют относительно компактный код C без больших библиотек. Но эти компиляторы не поддерживаются.

  • Есть ли другие способы сжатия исполняемых файлов? -> Если вы хотите запустить более одного приложения Lisp, имеет смысл повторно использовать среду выполнения, компилятор, библиотеки в одной или нескольких разделяемых библиотеках. Таким образом, код для доставки будет меньше, если среда выполнения уже установлена ​​как разделяемая библиотека (или аналогичная).

  • как мне узнать, какой Лисп, который я использую, поддерживает доставку приложений? -> прочтите руководство и спросите других пользователей.

  • Хорошо, поэтому большинство систем Common Lisp не могут создавать крошечные приложения. Существуют ли другие диалекты Лиспа, которые могут генерировать меньшие исполняемые файлы. -> Да, некоторые компиляторы схем могут.

  • как Common Lisp обрабатывает ошибки времени выполнения? -> зависит от того, как вы создаете приложение. По умолчанию вы получаете отладчик Lisp (если вы его не удалили). Но вы можете использовать свои собственные процедуры обработки ошибок в своем приложении и можете предотвратить появление отладчика.

  • В чем заключаются сильные стороны Common Lisp, когда создание действительно небольших исполняемых файлов не является одним из них? -> вы можете включить REPL для взаимодействия с приложением, вы можете использовать включенный компилятор для компиляции нового (или измененного кода) во время выполнения, вы можете использовать загрузчик FASL (скомпилированный код Lisp) для ЗАГРУЗКИ дополнительного собственного кода во время выполнения (подумайте о надстройках, патчах, расширениях, ...), возможна сложная обработка ошибок, включая восстановление ошибок, ...

  • но Lisp динамичен ? -> Да, динамический означает, что он может многое изменить во время выполнения. Например, в Common Lisp вы можете изменить класс CLOS во время выполнения, и экземпляры класса адаптируются к изменениям. Но разные системы Lisp имеют разные способы удаления некоторых динамических функций. Структуры менее динамичны, чем классы CLOS. Вы можете объявлять типы и компилировать с различными настройками оптимизации (скорость, безопасность, отладка, ...). Вы можете встроить функции. И многое другое.

Простой способ увидеть скомпилированный код функций - это использовать функцию DISASSEMBLE Common Lisp. Пример в Clozure CL на Mac x86-64

? (defun foo (x y) (if (= x y) (sin x) (* y (cos x))))
FOO
? (disassemble 'foo)
L0
  [0]     (leaq (@ (:^ L0) (% rip)) (% fn))
  [7]     (cmpl ($ 16) (% nargs))
  [10]    (jne L209)
  [16]    (pushq (% rbp))
  [17]    (movq (% rsp) (% rbp))

...

53
ответ дан 27 November 2019 в 20:12
поделиться

Существует огромное количество компиляторов Lisp для машинного кода, см. http://www.thefreecountry.com/compilers/commonlisp. shtml и, например, компилятор CMU Common Lisp.

6
ответ дан 27 November 2019 в 20:12
поделиться

Существует множество компиляторов Lisp, которые компилируются в собственный код. CMUCL, SBCL, ClozureCL известны среди компиляторов Lisp с открытым исходным кодом.

Сборка мусора не является препятствием для компиляции в собственный код. Кроме того, в некоторых случаях Lisp может использовать выделение стека, которое не требует сборки мусора, и может значительно улучшить производительность (с помощью объявления динамического экстента; по крайней мере, SBCL поддерживает это).

Макросы (и любой код, который запускается во время чтения ( чтение макросов и чтение-eval), время компиляции (макросы, макросы компилятора, код в eval-when)) требует инкрементной компиляции (сначала должна быть скомпилирована макрос-функция, а затем код, использующий макрос, может быть скомпилирован). Это несколько усложняет компиляцию, но не представляет большой проблемы. Также, макросы и макросы компилятора даже помогают процессу компиляции, потому что они позволяют программисту писать генераторы кода и оптимизаторы кода, по сути настраивая компилятор.

Таким образом, компилятор сложнее, чем некоторые более простые языки (например, C), но сложность управляема (см. Дизайн CMU Common Lisp ).

Динамическая природа Common Lisp управляема и предназначена для эффективной компиляции. В отличие от некоторых других динамических языков (например, Python), динамизм ограничен (например, вы не можете использовать текущую лексическую среду во время выполнения), что дает компиляторам некоторую свободу для оптимизации.

Динамическая природа Common Lisp управляема и разработана для эффективной компиляции. В отличие от некоторых других динамических языков (например, Python), динамизм ограничен (например, вы не можете использовать текущую лексическую среду во время выполнения), что дает компиляторам некоторую свободу для оптимизации.

Динамическая природа Common Lisp управляема и разработана для эффективной компиляции. В отличие от некоторых других динамических языков (например, Python), динамизм ограничен (например, вы не можете использовать текущую лексическую среду во время выполнения), что дает компиляторам некоторую свободу для оптимизации.

9
ответ дан 27 November 2019 в 20:12
поделиться

Вы делаете ставку. Chez Scheme (коммерческий компилятор) - один из лучших. Gambit и Larceny - исследовательские компиляторы, которые также генерируют собственный код.

4
ответ дан 27 November 2019 в 20:12
поделиться

Да. См. http://en.wikipedia.org/wiki/Common_Lisp . В нем упоминается, что Steel Bank Common Lisp (довольно популярная реализация) по умолчанию компилирует все в нативный. Тот факт, что используются сборщики мусора и тому подобное, не является препятствием для нативного кода. Это просто означает, что требуется некоторая среда выполнения. Но что с того? Даже у C есть среда выполнения.

3
ответ дан 27 November 2019 в 20:12
поделиться

Не забудьте Цыпленок Схема.

4
ответ дан 27 November 2019 в 20:12
поделиться