LINUX.ORG.RU

форкнуть SBCL

 


0

5

Есть такая идея. SBCL - это спортивный автомобиль. Они всё время работают над его ускорением, но надёжность не растёт. Конкретный пример для меня - https://bugs.launchpad.net/sbcl/ bug/1424031 - бага «medium». Если мы правильно разборались со Стасом, то мой тестовый случай состоял в том, что я во многих тредах запускал попеременно (room) и (gc). SBCL при этом с низкой вероятностью падает, зависает и т.п. С моей точки зрения это означает ничто иное, как «room не работает в многопоточном коде», а поскольку SWANK многопоточен, то далее получаем теорему «в SBCL не работает room». В течение более чем года это никого не волнует, а волнует, как ускорить сборку мусора на 5%. В моей вселенной это - абсолютно неправильное направление развития продукта.

Кроме того, в SBCL нет точной сборки мусора (во всяком случае, под Intel на Linux).

В третьих, лисп нужно модернизировать, а для этого нужно более агрессивно добавлять новшества. Явно не хватает таких вещей, как брекпойнт на присваивание и биндинг переменной. Хочется внедрить symbol-readmacros, которые я сделал уже несколько лет назад. Хочется возможностей безопасно прилинковать библиотеки, использующие сигналы - в CCL они работают, а в SBCL - нет. Хочется сделать более развитые средства навигации по исходникам, подобно dspec в Lispworks. Хочется сделать defadvice, как в Lispworks. Хочется реализовать на уровне компилятора call/cc, который мы с Монком в прошлом году сделали в виде интерпретатора.

Т.е. я вижу три направления развития:

  • точная сборка мусора
  • повышение качества
  • модернизация языка

Вопрос такой - есть ли попутчики? Надо сказать, что я не смогу этим много заниматься. Но если будет ещё хотя бы человека два, кто в этом заинтересован, я бы взялся.

★★★★★

Последнее исправление: den73 (всего исправлений: 2)

я бы сказал, что room работает, и даже из разных тредов, но он не reentrant и не thread-safe

Потому что это функция чисто для интерактивной разработки, и дебага. Никто не ожидал что ты ее постоянно из разных тредов дергать будешь, да и зачем это надо?

Таких функций вагон там. Ну и да, некоторые, которые должны быть thread-safe и reentrant, действительно, этих свойств лишены. Особенно там всякое legacy io(ака из stdlib).

Поэтому я мееедленно делаю свой STDLIB в блекджеком и макросами. https://github.com/Lovesan/CLR Если есть желание помочь - велкам.

Кроме того, в SBCL нет точной сборки мусора (во всяком случае, под Intel на Linux).

Эээ, вообще-то gencgc - точный во всех бытовых смыслах. Ты видимо неправильно понимаешь в чем «точность» GC заключается(в 100% сборке всего за _1_ цикл). А тот который 100% precise cheneygc, он с FFI не дружит особо, по объективным причинам.

Явно не хватает таких вещей, как брекпойнт на присваивание и биндинг переменной.

Это вообще-то делается макросом плюс функцией типа cerror внутри.

Хочется внедрить symbol-readmacros, которые я сделал уже несколько лет назад.

Библиотеки достаточно, тем более реализация и интерфейс спорные.

Хочется возможностей безопасно прилинковать библиотеки, использующие сигналы - в CCL они работают, а в SBCL - нет.

Юниксовые сигналы, чтоли? Это проблема юникса. Попробуй две библиотеки, использующие сигналы, одновременно попользуй. В случае SEH на винде - все лучше.

Хочется сделать более развитые средства навигации по исходникам, подобно dspec в Lispworks. Хочется сделать defadvice, как в Lispworks

Это что называется - бери и делай, а потом предлагай в конференциях разработчиков SBCL. А то пока - «хочу то не знаю что, как не знаю как, сделайте мне плиз новый лисп.»

Хочется реализовать на уровне компилятора call/cc

А вот мне не хочется, потому что ты слабо понимаешь, чем это грозит.

lovesan ★★★
()
Ответ на: комментарий от Hertz

Да сделали уже 10 лет как. Кложурой зовётся.

Плохо сделали. Годится только для написания веб-опердений и их бэкендов для заполнения БД.

Oxdeadbeef ★★★
()
Ответ на: комментарий от lovesan

потому что это функция чисто для интерактивной разработки, и дебага

Ну вот я в SLIME запускаю (room). Тогда получается, что ни один мой тред не может вызвать (room). Т.е. я не могу написать автоматический alert для моего сервера, который бы сообщал мне, что у меня проблемы с памятью приближаются. Или я должен окружать мьютексом (а где гарантия, что рантайм никогда не вызывает room?). Если даже ты и прав по сути ограничений room, то это, как минимум «плохо документированная особенность, могущая привести к краху приложения», а строго говоря, именно «не работает».

Ты бы хоть анонсировал свой CLR на сайте. А так непонятно без чтения исходников, чего ты пытаешься добиться.

Это вообще-то делается макросом плюс функцией типа cerror внутри.

Не думаю. Чтобы отловить биндинг, нужно поменять именно стандартный смысл let. А некоторые стандартные макросы (включая defun с *foo* в параметрах) сами делают биндинги и никто не обещает, что даже если ты заменишь let, это будет работать. Я не пробовал, впрочем. Но не верю, что оно будет работать, просто из понимания того, как строится образ лиспа: множество let в изначальном образе уже обработаны. Ты пробовал и у тебя получилось?

Попробуй две библиотеки, использующие сигналы, одновременно попользуй. В случае SEH на винде - все лучше.

Я пробовал прибиндить tcl и ещё что-то. В CCL работает, в SBCL - не работает. Не более того. Может быть, просто так повезло. Но это, впрочем, некритично.

Про gengc - не я написал, что он консервативен на стеке. Значит он консервативен вообще. Т.е. я не могу вообще ничего сказать об утечках памяти.

тем более реализация и интерфейс спорные.

Ок, меня оно в виде библиотеки устраивает в принципе.

Хочется реализовать на уровне компилятора call/cc
А вот мне не хочется, потому что ты слабо понимаешь, чем это грозит.

Я всё вполне чётко понимаю. Но это не совсем call/cc, это «контроль за состоянием скомпилированного вычисления», включая возможность его скопировать настраиваемым образом. Может быть, это монада Do, в той степени, в к-рой я понимаю, что есть монада Do. Мы в прошлом году с Монком сделали интерпретатор с контролем за состоянием, написали на этой базе раскраску в редакторе, она работала без проблем, но оказалась слишком медленной из-за интерпретации - надо хотя бы в 10 раз быстрее, а лучше в 100. Никаких проблем там нет, если работать аккуратно.

Это что называется - бери и делай, а потом предлагай в конференциях разработчиков SBCL.

Не, предлагать не буду. Потому что это надо убеждать и унижаться. Смысл не в гордыне, а в том, что это большая затрата энергии и всё равно могут не принять. Форк однозначно. Кстати, забыл, ещё хочу русификацию сообщений. В CLISP есть, вот пусть и в SBCL будет.

den73 ★★★★★
() автор топика

модернизация языка

http://cl21.org/

повышение качества

Почему не обратить свой взор на тот же CCL, вместо того, чтобы чинить ракету изолентой? Пара человек не потянет проект такого масштаба.

feofan ★★★★★
()
Ответ на: комментарий от feofan

cl21 - это лишь взгляд его автора на синтаксический сахар, у меня тоже свой взгляд, просто я не сделал такого красивого сайта. Но сахар - это не основное. Почему не CCL - из-за лицензии. Декларируется одна лицензия, а в исходниках прописана другая. Я не хочу лезть в эту ситуацию.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от Oxdeadbeef

Плохо сделали. Годится только для написания веб-опердений и их бэкендов для заполнения БД.

Для лиспа это большой шаг вперед. По субжу нельзя поченить то, что сломано бай дезигн.

Freyr69 ★★★
()
Последнее исправление: Freyr69 (всего исправлений: 1)

Следует отличать недостатки SBCL от недостатков CL. Например, все, что касается макросов, reader-макросов и т.п., упирается в пакетную систему, которую просто так менять нельзя.

Точная сборка мусора - это необходимый минимум для современной реализации любого языка.

Полноценный call/cc вряд ли нужен; скорее, полезно иметь трансформацию отдельно взятых функций во внешне управляемые state machine'ы.

Вопрос такой - есть ли попутчики? Надо сказать, что я не смогу этим много заниматься.

Гипотетически, если есть практический интерес, подкрепленный финансово, то этим можно заняться.

Эээ, вообще-то gencgc - точный во всех бытовых смыслах

Он консервативен по стэку и точный по куче. Что не очень хорошо.

Это вообще-то делается макросом плюс функцией типа cerror внутри.

Макрос - это как-то не очень надежно (не все обращения отловит) и требует пересборки кода, что противоречит основному использованию (для отладки).

В случае SEH на винде - все лучше.

Не сильно. Кроссязыковые исключения тоже вызывают проблемы (даже в связке .NET + C++).

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

Полноценный call/cc вряд ли нужен; скорее, полезно иметь трансформацию отдельно взятых функций во внешне управляемые state machine'ы.

А какая это замена call/cc? допустим, нужно выйти из стека и сохранить его состояние, с возможным возвратом на то же место, как эта ваша трансформация поможет справиться с такой задачей?

noconformism
()
Ответ на: комментарий от Oxdeadbeef

Как будто общелисп годится для чего то другого. Нереально удобный, хорошо спроектированный, и достаточно шустрый, но толку с этого тоже не шибко, ибо инфраструктура не ахти. С вонючего дотнета больше толку.

Hertz ★★★★★
()
Ответ на: комментарий от slaykovsky

Ага. Всё-таки нихрена не поменялось. Clojure 1.8.0.

user> (defn fact [x]
  (if (<= x 1) 
      1 
      (* x  (fact (- x 1)))))
;; ~> #'user/fact
user> (fact 2)
;; ~> 2
user> (fact 4)
;; ~> 24
user> (fact 40)
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (fact 4000)
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)

Hertz ★★★★★
()
Ответ на: комментарий от anonymous

А теперь вспомни COBOL который был до Java.

Deleted
()
Ответ на: комментарий от dmitry_vk

Финансового подкрепления не будет - я теперь безработный.

Вопрос с reader-макросами я решил лет 5 назад в своих budden-tools и с тех пор многократно опробовал. Для этого я переопределил ридер так, что сторонняя ф-я чтения может запускаться не только буквой или парой букв, а символом. Эта возможность является расширением CL в чистом виде (ничему не противоречит), и она хороша, поэтому её стоит включить в форк. С другой стороны, можно сделать и библиотекой. У меня нет никаких проблем с этой возможностью, кроме необходимости менять таблицу чтения, именно поэтому лучше включить в реализацию.

Полноценный call/cc вряд ли нужен

Опять же, нужно писать статью с объяснениями. Вот некоторые слова. Это было применено для вполне практической задачи.

den73 ★★★★★
() автор топика
Ответ на: комментарий от slaykovsky

В Common Lisp не лучше. Стандарт не гарантирует TCO.
И при этом даже стандартные функции реализованы рекурсивно:
Например subst:
https://github.com/Clozure/ccl/blob/003917cbbce90b7a7b5fa4bf90e9fe424e5637e9/...
А ведь это даже не tail call. Причём во всех реализациях такой код, не только ccl.
Короче стэковерфлоу можно поймать даже дёрнув стандартную функцию subst на достаточно большом дереве.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от den73

Ну вообще-то можно, если захотеть. Можно ручной стэк откладывать просто в массив в динамической памяти.
https://www.google.ru/search?q=traverse tree without recursion
Но не факт что это нужно. Точно так же как никто не будет считать факториал от 4000.
Просто это к тому, что JVM тут не хуже лиспов.

Bad_ptr ★★★★★
()
Ответ на: комментарий от den73

А как можно реализовать subst без рекурсии - оно же ходит и налево, и направо?

Не без рекурсии, а с хвостовой рекурсией, тащишь список поддеревьев в качестве аккумулятора, если неупорядоченное дерево.

Freyr69 ★★★
()
Ответ на: комментарий от Hertz

С вонючего дотнета больше толку.

На галерах такое обожают. ;)

Oxdeadbeef ★★★
()
Ответ на: комментарий от Freyr69

Наверное, вы правы. Но не суть. Мне кажется, нет ничего страшно, что subst рекурсивна, функция довольно проста, кому нужно что-то иное - легко сделать самому. И не стоит делать из этого какие-то выводы при сравнении SBCL и Clojure.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Ладно, вообще вы меня убедили посмотреть ещё раз на CCL.

Я посмотрел и увидел, что они поменяли лицензию в исходных текстах. Теперь он под Apache. Совместимость с платформами тоже неплохая.

Видимо, вопрос о форке SBCL пока что снимается - буду работать над переносимостью своего кода на CCL (до этого на данный момент довольно далеко - завязался на SBCL кое-где).

den73 ★★★★★
() автор топика

Сейчас придёт mv и скажет тебе, что это всё «ненужноененужно» и первым делом в SBCL (и в CCL ещё по хорошему) нужно запилить SSA, а уже потом всё остальное.

Hertz ★★★★★
()
Ответ на: комментарий от Hertz

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

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.