Common LISP Porting Initiative: различия между версиями

Материал из ALT Linux Wiki
м (→‎Клиенты: добавил ради fricas)
мНет описания правки
Строка 1: Строка 1:
__TOC__
__TOC__


==Состояние проекта==
== Состояние проекта ==


Собран свежий CLISP, но без некоторых библиотек. Им скомпилирована свежая версия Maxima. Далее стоит задача бутстрапа SBCL.
Собран свежий CLISP, но без некоторых библиотек. Им скомпилирована свежая версия Maxima. Далее стоит задача бутстрапа SBCL.


==Механизм портирования==
== Механизм портирования ==


Наиболее популярными и функциональными интерпретаторами и компиляторами Common LISP являются реализации SBCL и CMUCL. К сожалнию, они сами написаны на Common LISP и их портирование на новые архитектуры затруднено. Наиболее частым способом бутстрапа данных интерпретаторов является бутстрап через сборку интерпретатора CLISP, написанного на C.
Наиболее популярными и функциональными интерпретаторами и компиляторами Common LISP являются реализации SBCL и CMUCL. К сожалению, они сами написаны на Common LISP и их портирование на новые архитектуры затруднено. Наиболее частым способом бутстрапа данных интерпретаторов является бутстрап через сборку интерпретатора CLISP, написанного на C.


==CLISP==
== CLISP ==


В работе: nir@, mike@
В работе: nir@, mike@
Строка 17: Строка 17:
Для сборки требуются зависимости:
Для сборки требуются зависимости:


* '''libreadline-devel''' - для REPL
* '''libreadline-devel''' для REPL;
* '''libsigsegv2''' и '''libsigsegv-devel''' - для сборки мусора и обнаружения переполнений стека в интерпретируемом коде.
* '''libsigsegv2''' и '''libsigsegv-devel''' для сборки мусора и обнаружения переполнений стека в интерпретируемом коде;
* '''libffcall''' - для обеспечения поддержки FFI.
* '''libffcall''' для обеспечения поддержки FFI.


Первоначальный список проблем:
Первоначальный список проблем:
Строка 30: Строка 30:
Первичная сборка произведена успешно согласно инструкциям:
Первичная сборка произведена успешно согласно инструкциям:


<source>
<source lang="text">
./configure --ignore-absence-of-libsigsegv
./configure --ignore-absence-of-libsigsegv
make
make
</source>
</source>


==SBCL==
== SBCL ==


В работе: nir@
В работе: nir@
Строка 41: Строка 41:
SBCL является сложным продуктом и его бутстрап требует комплексной работы. В процессе общения в списке рассылки '''sbcl-devel@lists.sourceforge.net''' была получена информация касательно нюансов бутстрапа SBCL на новых архитектурах. Из списка рассылки была получена информация о том, что для бутстрапа SBCL не требуется cross-toolchain. Достаточно инструментария в виде линкера, ассемблера и компилятора C для целевой платформы.
SBCL является сложным продуктом и его бутстрап требует комплексной работы. В процессе общения в списке рассылки '''sbcl-devel@lists.sourceforge.net''' была получена информация касательно нюансов бутстрапа SBCL на новых архитектурах. Из списка рассылки была получена информация о том, что для бутстрапа SBCL не требуется cross-toolchain. Достаточно инструментария в виде линкера, ассемблера и компилятора C для целевой платформы.


Также, с первого августа 2018 года велось портирование SBCL на Linux@RISC-V. Из перечисленного был совет посмотреть на коммиты по ключевым словам '''RISCV''', '''risc''', и '''rv32'''. Грубо, процесс портирования выглядит как копирование директории <code>src/compiler</code> и допиливании под нужную архитектуру. Как только этот кусок будет переписан - можно будет переписать определения '''vops''' (virtual operations) соответственно. Наиболее полная пошаговая инструкция по портированию SBCL написана '''Alastair Bridgewater''' касательно архитектуры '''ARM'''.
Также, с первого августа 2018 года велось портирование SBCL на Linux@RISC-V. Из перечисленного был совет посмотреть на коммиты по ключевым словам '''RISCV''', '''risc''', и '''rv32'''. Грубо, процесс портирования выглядит как копирование директории <code>src/compiler</code> и допиливании под нужную архитектуру. Как только этот кусок будет переписан можно будет переписать определения '''vops''' (virtual operations) соответственно. Наиболее полная пошаговая инструкция по портированию SBCL написана '''Alastair Bridgewater''' касательно архитектуры '''ARM'''.


Также существует разрабатываемая сообществом документация по внутренностям SBCL: https://github.com/guicho271828/sbcl-wiki/wiki и http://www.sbcl.org/sbcl-internals/
Также существует разрабатываемая сообществом документация по внутренностям SBCL: https://github.com/guicho271828/sbcl-wiki/wiki и http://www.sbcl.org/sbcl-internals/
Строка 51: Строка 51:
На данный момент процедура бутстрапа выглядит как:
На данный момент процедура бутстрапа выглядит как:


* '''make-config.sh''' - добавляется определение архитектуры (соответстсвующее 'uname -a');
* '''make-config.sh''' добавляется определение архитектуры (соответствующее 'uname -a');
* '''build-order.lisp-expr''' - добавляется указатель на реализацию виртуальной машины: '''src/code/e2k-vm''';
* '''build-order.lisp-expr''' добавляется указатель на реализацию виртуальной машины: '''src/code/e2k-vm''';
* '''src/runtime/Config.e2k-linux''' - добавляется '''makefile''', указывающий на необходимые платформо-зависимые функции;
* '''src/runtime/Config.e2k-linux''' добавляется '''makefile''', указывающий на необходимые платформо-зависимые функции;
* '''src/runtime/e2k-arch.c'''
* '''src/runtime/e2k-arch.c'''
* '''src/runtime/e2k-arch.h'''
* '''src/runtime/e2k-arch.h'''
* '''src/runtime/e2k-assem.S''' - релизация функций '''call_into_lisp''', '''call_into_c'''. Из того, что усдалось выяснить на '''Freenode''' - данные функции выполняют задачу переключения между C ABI и SBCL ABI и не могут быть написаны ни на чём другом кроме Assembler.
* '''src/runtime/e2k-assem.S''' релизация функций '''call_into_lisp''', '''call_into_c'''. Из того, что удалось выяснить на '''Freenode''' данные функции выполняют задачу переключения между C ABI и SBCL ABI и не могут быть написаны ни на чём другом кроме Assembler.
* '''src/runtime/e2k-linux-os.c'''
* '''src/runtime/e2k-linux-os.c'''
* '''src/runtime/e2k-linux-os.h'''
* '''src/runtime/e2k-linux-os.h'''
* '''src/runtime/e2k-lispregs.h''' - определения регистров. Надо знать platform ABI;
* '''src/runtime/e2k-lispregs.h''' определения регистров. Надо знать platform ABI;
* '''src/compiler/e2k/*''' - определение механизма работы компилятора '''Python''' с vops (virtual operations);
* '''src/compiler/e2k/*''' определение механизма работы компилятора '''Python''' с vops (virtual operations);
* '''src/code/e2k-vm.lisp''' - маппинг физических регистров на регистры '''SB-VM''';
* '''src/code/e2k-vm.lisp''' маппинг физических регистров на регистры '''SB-VM''';
* '''assembly/e2k/*'''
* '''assembly/e2k/*'''


Строка 68: Строка 68:
В случае с использованием NFS на хосте и целевой машине:
В случае с использованием NFS на хосте и целевой машине:


<source>
<source lang="text">
Cross-compiling SBCL is easy; especially so if you arrange matters (e.g. using NFS)
Cross-compiling SBCL is easy; especially so if you arrange matters (e.g. using NFS)
so that host and target systems can see the same build directory. make.sh doesn't
so that host and target systems can see the same build directory. make.sh doesn't
Строка 93: Строка 93:
Или без NFS:
Или без NFS:


<source>
<source lang="text">
target$ GNUMAKE=make sh ./make-config.sh
target$ GNUMAKE=make sh ./make-config.sh
host$ GNUMAKE=gmake SBCL_ARCH='arch' sh ./make-config.sh
host$ GNUMAKE=gmake SBCL_ARCH='arch' sh ./make-config.sh
Строка 109: Строка 109:
</source>
</source>


==Сборка новых версий SBCL более старыми==
== Сборка новых версий SBCL более старыми ==


В процессе обновления SBCL 1.4.12 на архитектуре '''MIPS32 LE''' методом сборки с помощью SBCL 1.0.28 было выяснено, что SBCL 1.0.28 не способен собрать версию 1.4.12. Данная проблема вызвана коммитом https://sourceforge.net/p/sbcl/sbcl/ci/04139ea0e0f83a13b7a6fd2df0d797921f9e593b/ использующим '''BIGVEC''' в версии SBCL 1.4.8[[http://planet.sbcl.org/2018/5.html]]. В результате сборку удалось осуществить методом '''1.0.28''' -> '''1.4.6''' -> '''1.4.12''' [[https://bugs.launchpad.net/sbcl/+bug/1838232]]
В процессе обновления SBCL 1.4.12 на архитектуре '''MIPS32 LE''' методом сборки с помощью SBCL 1.0.28 было выяснено, что SBCL 1.0.28 не способен собрать версию 1.4.12. Данная проблема вызвана коммитом https://sourceforge.net/p/sbcl/sbcl/ci/04139ea0e0f83a13b7a6fd2df0d797921f9e593b/ использующим '''BIGVEC''' в версии SBCL 1.4.8[[http://planet.sbcl.org/2018/5.html]]. В результате сборку удалось осуществить методом '''1.0.28''' -> '''1.4.6''' -> '''1.4.12''' [[https://bugs.launchpad.net/sbcl/+bug/1838232]]

Версия от 10:27, 21 апреля 2022

Состояние проекта

Собран свежий CLISP, но без некоторых библиотек. Им скомпилирована свежая версия Maxima. Далее стоит задача бутстрапа SBCL.

Механизм портирования

Наиболее популярными и функциональными интерпретаторами и компиляторами Common LISP являются реализации SBCL и CMUCL. К сожалению, они сами написаны на Common LISP и их портирование на новые архитектуры затруднено. Наиболее частым способом бутстрапа данных интерпретаторов является бутстрап через сборку интерпретатора CLISP, написанного на C.

CLISP

В работе: nir@, mike@

Сборка производится из актуального репозитория: https://gitlab.com/gnu-clisp/clisp . Не смотря на отсутствие официальных релизов интерпретатора после 2010-го года, разработка продукта всё ещё продолжается.

Для сборки требуются зависимости:

  • libreadline-devel — для REPL;
  • libsigsegv2 и libsigsegv-devel — для сборки мусора и обнаружения переполнений стека в интерпретируемом коде;
  • libffcall — для обеспечения поддержки FFI.

Первоначальный список проблем:

  • Во время конфигурирования не удаётся найти пакеты libsigsegv2 и libreadline. Данная проблема актуальна не только для e2k, но также обнаружена при бутстрапе CLISP на архитектуре MIPS. Проблема вызвана отсутствием в пакетах необходимых для libtool/pkg-config файлов.
  • В репозиториях отсутствует библиотека libffcall.
    • make[1]: *** No rule to make target 'avcall-e2k.lo', needed by 'avcall.lo'. Stop.
    • Отправлен запрос на портирование №4210.

Первичная сборка произведена успешно согласно инструкциям:

./configure --ignore-absence-of-libsigsegv
make

SBCL

В работе: nir@

SBCL является сложным продуктом и его бутстрап требует комплексной работы. В процессе общения в списке рассылки sbcl-devel@lists.sourceforge.net была получена информация касательно нюансов бутстрапа SBCL на новых архитектурах. Из списка рассылки была получена информация о том, что для бутстрапа SBCL не требуется cross-toolchain. Достаточно инструментария в виде линкера, ассемблера и компилятора C для целевой платформы.

Также, с первого августа 2018 года велось портирование SBCL на Linux@RISC-V. Из перечисленного был совет посмотреть на коммиты по ключевым словам RISCV, risc, и rv32. Грубо, процесс портирования выглядит как копирование директории src/compiler и допиливании под нужную архитектуру. Как только этот кусок будет переписан — можно будет переписать определения vops (virtual operations) соответственно. Наиболее полная пошаговая инструкция по портированию SBCL написана Alastair Bridgewater касательно архитектуры ARM.

Также существует разрабатываемая сообществом документация по внутренностям SBCL: https://github.com/guicho271828/sbcl-wiki/wiki и http://www.sbcl.org/sbcl-internals/

Из существующих проблем:

  • Необходимо самостоятельно реализовать для кодогенератора SBCL поддержку e2k

На данный момент процедура бутстрапа выглядит как:

  • make-config.sh — добавляется определение архитектуры (соответствующее 'uname -a');
  • build-order.lisp-expr — добавляется указатель на реализацию виртуальной машины: src/code/e2k-vm;
  • src/runtime/Config.e2k-linux — добавляется makefile, указывающий на необходимые платформо-зависимые функции;
  • src/runtime/e2k-arch.c
  • src/runtime/e2k-arch.h
  • src/runtime/e2k-assem.S — релизация функций call_into_lisp, call_into_c. Из того, что удалось выяснить на Freenode — данные функции выполняют задачу переключения между C ABI и SBCL ABI и не могут быть написаны ни на чём другом кроме Assembler.
  • src/runtime/e2k-linux-os.c
  • src/runtime/e2k-linux-os.h
  • src/runtime/e2k-lispregs.h — определения регистров. Надо знать platform ABI;
  • src/compiler/e2k/* — определение механизма работы компилятора Python с vops (virtual operations);
  • src/code/e2k-vm.lisp — маппинг физических регистров на регистры SB-VM;
  • assembly/e2k/*

Одна из заметок касалась бутстрапа SBCL на OpenBSD@PPC:

В случае с использованием NFS на хосте и целевой машине:

Cross-compiling SBCL is easy; especially so if you arrange matters (e.g. using NFS)
so that host and target systems can see the same build directory. make.sh doesn't
cater for it directly, so you run each of the five scripts by hand. For example,
cross-compiling to PPC is something like

host$ export SBCL_ARCH=ppc
or

host$ export SBCL_ARCH=x86
ppc$ export SBCL_ARCH=x86

host$ export SBCL_XC_HOST=sbcl
ppc$ . ./find-gnumake.sh
ppc$ find_gnumake
ppc$ sh make-config.sh
host$ sh make-host-1.sh
ppc$ sh make-target-1.sh
host$ sh make-host-2.sh
ppc$ sh make-target-2.sh
ppc$ sh make-target-contrib.sh

Или без NFS:

target$ GNUMAKE=make sh ./make-config.sh
host$ GNUMAKE=gmake SBCL_ARCH='arch' sh ./make-config.sh
host$ scp target:sbcl-directory/local-target-features.lisp-expr .
host$ scp target:sbcl-directory/output/build-id.tmp output/
host$ SBCL_XC_HOST='lisp -batch' sh ./make-host-1.sh
host$ scp -r src/runtime/genesis src/runtime/ldso-stubs.S target:sbcl-directory/src/runtime/
target$ GNUMAKE=make sh ./make-target-1.sh
target$ scp src/runtime/sbcl.nm host:sbcl-directory/src/runtime/
target$ scp output/stuff-groveled-from-headers.lisp host:sbcl-directory/output/
host$ SBCL_XC_HOST='lisp -batch' sh ./make-host-2.sh
host$ scp output/cold-sbcl.core target:sbcl-directory/output/
target$ sh ./make-target-2.sh
target$ sh ./make-target-contrib.sh

Сборка новых версий SBCL более старыми

В процессе обновления SBCL 1.4.12 на архитектуре MIPS32 LE методом сборки с помощью SBCL 1.0.28 было выяснено, что SBCL 1.0.28 не способен собрать версию 1.4.12. Данная проблема вызвана коммитом https://sourceforge.net/p/sbcl/sbcl/ci/04139ea0e0f83a13b7a6fd2df0d797921f9e593b/ использующим BIGVEC в версии SBCL 1.4.8[[1]]. В результате сборку удалось осуществить методом 1.0.28 -> 1.4.6 -> 1.4.12 [[2]]

Клиенты

После сборки sbcl стоит удалить "пустышку" dummy-sbcl; настоящий пакет понадобится как минимум для fricas.