LINUX.ORG.RU

Юбилей у SBCL - 10 лет!

 , ,


0

1

Замечательной реализации Common Lisp'a SBCL исполняется 10 лет.

10 лет назад, 14 декабря 1999 года, в рассылке Common Lisp реализации CMU CL, было анонсировано, что William Harold'у удалось собрать CMU CL систему, имея лишь одну из ANSI-систем для кросс-компиляции. Также было заявлено о внутренних изменениях в реализации и уход от некоторых внешних компонентов и библиотек, отсутствовавших в стандарте Common Lisp. Это позволило уменьшить ядро Common Lisp и портировать его на другие операционные системы.

Все эти наработки дали старт новой ветке развития Common Lisp реализации, названной Steel Bank Common Lisp (SBCL). В то время, как SBCL работал только на Linux (2.х.х) для х86 архитектуры, была начата работа по портированию на FreeBSD.

SBCL's 10th Anniversary Workshop

SBCL official website

>>> Подробности



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

Ответ на: комментарий от www_linux_org_ru

Введение искусственного понятия «десятичная дробь» — это провал. Конструктивностью тут и не пахнет. Слишком сильно притянуто за уши.

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

теперь тут спрашиваю.

Про количество битов в целочисленных типах в ANSI CL ничего нет. Часть стандартного для сишников 32-х или 64-битного целочисленного значения используется для маркировки типа.

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

> Введение искусственного понятия «десятичная дробь» — это провал. Конструктивностью тут и не пахнет. Слишком сильно притянуто за уши.

???

я тебя перестал понимать.

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

> В SBCL? Разумеется, боксинг будет.

возможна ли реализация лиспа, в которой в глобальной переменной с указанным типом и видимой из 2 функций, боксинга не будет?

(короче — это SBCL недопилен или дефект лиспа?)

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

возможна ли реализация лиспа, в которой в глобальной переменной с указанным типом и видимой из 2 функций, боксинга не будет?

Возможна.

(короче — это SBCL недопилен или дефект лиспа?)

Хорошее у вас понятие дефекта :) Получается, все динамически типизированные языки дефектные?

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

> Хорошее у вас понятие дефекта :) Получается, все динамически типизированные языки дефектные?

Да хоть вообще никак не типизированые! Но будь добр, при указании прогером типа переменной проведи все возможные оптимизации. Иначе — да, дефектные.

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

Допустим, мне нужен быстрый генератор псевдослучайных чисел, например x+=x<<2 (и дальше берем старшие байты х)

Можно ли в лиспе сделать х глобальной переменной и указать ей тип, чтобы:

1. переполнение при сложении и сдвиге не проверялось (нужна скорость)

Это как раз можно сделать, указав функции сдвига тип результата, вырубить проверки, включить оптимизацию.

2. операции боксинга-разбоксинга не осуществлялись (нужна скорость)

Тут сложнее. Даже дело не в боксинге, а в том, что доступ к глобальной переменной осуществляется каждый раз, как она нужна.

(declaim (optimize (speed 3) (safety 0) (debug 0)))

(defvar *x*)
(declaim (type fixnum *x*))  

(defun pseudo-rnd ()
  (incf *x* (the fixnum (ash *x* 2))))

Дает:

* (disassemble 'pseudo-rnd)

; 0A86716A:       8B0D4071860A     MOV ECX, [#xA867140]       ; '*X*
                                                              ; no-arg-parsing entry point
;       70:       8B4111           MOV EAX, [ECX+17]
;       73:       64               FS-SEGMENT-PREFIX
;       74:       8B00             MOV EAX, [EAX]
;       76:       83F85A           CMP EAX, 90
;       79:       7503             JNE L0
;       7B:       8B41FD           MOV EAX, [ECX-3]
;       7E: L0:   C1E002           SHL EAX, 2
;       81:       8B154071860A     MOV EDX, [#xA867140]       ; '*X*
;       87:       8B4A11           MOV ECX, [EDX+17]
;       8A:       64               FS-SEGMENT-PREFIX
;       8B:       8B09             MOV ECX, [ECX]
;       8D:       83F95A           CMP ECX, 90
;       90:       7503             JNE L1
;       92:       8B4AFD           MOV ECX, [EDX-3]
;       95: L1:   01C1             ADD ECX, EAX
;       97:       8B154071860A     MOV EDX, [#xA867140]       ; '*X*
;       9D:       8B4211           MOV EAX, [EDX+17]
;       A0:       64               FS-SEGMENT-PREFIX
;       A1:       83385A           CMP DWORD PTR [EAX], 90
;       A4:       7405             JEQ L2
;       A6:       64               FS-SEGMENT-PREFIX
;       A7:       8908             MOV [EAX], ECX
;       A9:       EB03             JMP L3
;       AB: L2:   894AFD           MOV [EDX-3], ECX
;       AE: L3:   8BD1             MOV EDX, ECX
;       B0:       8D65F8           LEA ESP, [EBP-8]
;       B3:       F8               CLC
;       B4:       8B6DFC           MOV EBP, [EBP-4]
;       B7:       C20400           RET 4
;       BA:       90               NOP
;       BB:       90               NOP
;       BC:       90               NOP
;       BD:       90               NOP
;       BE:       90               NOP
;       BF:       90               NOP

Вот видно, что проверка границ при сдвиге (SHL) и сложении (ADD) не производится, но вот к переменной *x* обращение идет три раза: один раз перед сдвигом, один раз для сложения и один раз для записи результата.

Но с локальной переменной получше

(declaim (optimize (speed 3) (safety 0) (debug 0)))

(defun pseudo-rnd (x)
  (declare (type fixnum x))
  (incf x (the fixnum (ash x 2))))

Имеем

* (disassemble 'pseudo-rnd)

; 0ABADAEC:       8D0CC500000000   LEA ECX, [EAX*4]           ; no-arg-parsing entry point
;      AF3:       01C8             ADD EAX, ECX
;      AF5:       8BC8             MOV ECX, EAX
;      AF7:       8BC1             MOV EAX, ECX
;      AF9:       8BD1             MOV EDX, ECX
;      AFB:       8D65F8           LEA ESP, [EBP-8]
;      AFE:       F8               CLC
;      AFF:       8B6DFC           MOV EBP, [EBP-4]
;      B02:       C20400           RET 4
;      B05:       90               NOP
;      B06:       90               NOP
;      B07:       90               NOP

Однако если больше переменных будет, то они уже через память будут передаваться, а регистров у меня мало в процессоре, а часть из них под нужды SBCL забита, так что чаще всего будет загрузка из памяти для осуществления операций. Это на новых процессорах надобавляли регистров. В данном случае, когда одна переменная, она передается через свободный регистр. Да, SBCL далеко не всегда оптимизирует. Хочешь помочь проекту? :)

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

Точно, довольно странно такое читать от лисповцев, всё таки не пэхапэшники малые, могли бы и более понятно поднаписать:)


Что не так в новости?
Чисталисповский синтаксис, только пара скобочек пропущена.

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

Получается, все динамически типизированные языки дефектные?

Именно так и получается :)

Я когда коммент постил, думал приписать ", как tailgunner считает", но потом решил, что ты сам появишься и своё это мнение выскажешь :)

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

>Но с локальной переменной получше

Есть еще вариант с замыканием.

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

> Хочешь помочь проекту? :)

мы там http://www.linux.org.ru/jump-message.jsp?msgid=4254952&cid=4256112 хотели сравнить скорость работы исключений в лиспе и в с++, но по причине тормозов и 28-29 бит в x+=x<<2 с глобальным х в лиспе все заглохло. х нужен из 2 функций.

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

> Я когда коммент постил, думал приписать ", как tailgunner считает", но потом решил, что ты сам появишься и своё это мнение выскажешь

я в общем-то так же считаю, но программист-хозяин-барин, может ему нравится по крышам по ночам бегать или там динамическую типизацию юзать — это его дело

однако в случае, когда программист где-то указал статическую типизацию картина резко меняется

ладно — для маленьких программ динамическая типизация может быть полезна, и если она не выползает наружу класса/модуля/... — почему бы и нет.

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

мы там gcc, SIGSEGV и try/catch теперь друзья :) (комментарий) хотели сравнить скорость работы исключений в лиспе и в с++, но по причине тормозов и 28-29 бит в x+=x<<2 с глобальным х в лиспе все заглохло. х нужен из 2 функций.

Извращённое понимание работы исключений у вас ;) Если хотите проверить скорость работы исключений, проверяйте исключения.

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

> Что касается специфичных для реализации решений, то я где-то год назад постил такой кусок кода в теме, в которой сам Саныч на лиспе пример наваял.

Можно ссылку или ключевые слова для поиска?

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

ладно — для маленьких программ динамическая типизация может быть полезна, и если она не выползает наружу класса/модуля/... — почему бы и нет.

Взять, к примеру, мессейджинг 0MQ2. 420 кб исходников на C++ c кучей рантаймных ассертов (fast-fail, типа). Чем тут программа на C++ в плане поведения в рантайме отличается от динамического языка, в котором тоже есть куча рантаймных ассертов?

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

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

> Извращённое понимание работы исключений у вас ;) Если хотите проверить скорость работы исключений, проверяйте исключения.

мне больше обращение на ты нравится

я так надеялся, что ты сразу поймешь, что время, потраченное на исключения, может нелинейно зависеть от процента исключений

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

>для маленьких программ динамическая типизация может быть полезна, и если она не выползает наружу класса/модуля/... — почему бы и нет.

Зачем маленькой программе динамическая типизация? Д.Т нужна для MOP и бинарной стабильности, то есть как раз для больших программных инфраструктур. А локально вполне безопасно можно использовать и статическую если нужен перформанс в битфаке.

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

> 420 кб исходников на C++ c кучей рантаймных ассертов (fast-fail, типа). Чем тут программа на C++ в плане поведения в рантайме отличается от динамического языка, в котором тоже есть куча рантаймных ассертов?

в динамическом языке рантаймных ассертов будет больше, и главное — в неожиданных местах.

впрочем, с++ не идеал статической типизации — там нет возможности сделать реальный nothrow.

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

> мессейджинг 0MQ2. 420 кб исходников на C++ c кучей рантаймных ассертов (fast-fail, типа). Чем тут программа на C++ в плане поведения в рантайме отличается от динамического языка, в котором тоже есть куча рантаймных ассертов?

А в OMQ2 ассерты на неверные типы переменных, или на какую-то логику?

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

> Д.Т нужна для MOP

если ты называешь Д.Т. виртуальные функции в с++ или pattern matching, то я бы это отнес к статической типизации

МОР нужен, но статически верифицируемый

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

я так надеялся, что ты сразу поймешь, что время, потраченное на исключения, может нелинейно зависеть от процента исключений

Только вот в Лиспе можно вполне себе контрол флоу на кондишенах сделать... ;)

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

А в OMQ2 ассерты на неверные типы переменных, или на какую-то логику?

В C/С++ на самом деле есть типы? =) На самом деле, после деплоймента системы уже не важно, от чего валится софт: из-за ошибки динамических типов или сработавшего ассерта в библиотеке.

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

> Возможно, Виталик имеет в виду тему Знатокам лиспа (2).

Нет, там mv код вообще не приводит. По ссылке в конце тоже нет.

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

> Только вот в Лиспе можно вполне себе контрол флоу на кондишенах сделать...

ну так сделай. кстати, предполагаю, что правильно сделанное контрол флоу обгонит тот пример на с++ (а то пока что тот вариант на лиспе сливал плюсам в 4 раза)

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

> Что-то сам не могу найти. Возможно, постил ссылку на пример Paul'а Khuong'а: http://article.gmane.org/gmane.lisp.steel-bank.devel/12380

Спасибо, интересно, исследую подробнее немного попозже. Это где-нибудь документировано? А то беглый поиск в мануале и гугле результатов не дал, исходников сейчас под рукой нет...

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

>> А в OMQ2 ассерты на неверные типы переменных, или на какую-то логику?

В C/С++ на самом деле есть типы? =)

Да :)

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

До деплоймента это тем более не важно. Важно то, что в системе на динамически типизированном языке есть все ассерты, которые есть в системе на статически типизированном, плюс еще свои, встроенные :)

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

(а то пока что тот вариант на лиспе сливал плюсам в 4 раза)

На примерах отсюда и с миллионом итераций:

C++ (-O3):

real    0m2.348s
user    0m2.325s
sys     0m0.001s

SBCL:

  0.011 seconds of real time
  0.010998 seconds of total run time (0.010998 user, 0.000000 system)
  100.00% CPU
  30,580,221 processor cycles
  0 bytes consed

SBCL у меня 64-битный, 32 бита (размер int'а) в его fixnum влазят.

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

До деплоймента это тем более не важно. Важно то, что в системе на динамически типизированном языке есть все ассерты, которые есть в системе на статически типизированном, плюс еще свои, встроенные :)

Их можно почти все отключить.

Мегатипизация в Хаскелле не спасает Darcs от сегфолтов, кстати ;)

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

>> Важно то, что в системе на динамически типизированном языке есть все ассерты, которые есть в системе на статически типизированном, плюс еще свои, встроенные :)

Их можно почти все отключить.

Отключить проверки типов в динамически типизированном языке? O_O Какой странный способ самоубийства.

Мегатипизация в Хаскелле не спасает Darcs от сегфолтов, кстати ;)

Разве там сегфолты? Оно просто память жрало в три горла, и вылетало по ее нехватке. Ленивость же, круто.

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

>Или ты в у нивере где-либо в матане или выводах в физике встречал итеративные обозначения?

Представь себе, да. An = f(An-1) - как раз итеративные обозначения, где An следует читать как «значение переменной A на n шаге» (An-1 соттв. на предыдущем). (n это нижний индекс, ну вы поняли)

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

>Только вот в Лиспе можно вполне себе контрол флоу на кондишенах сделать... ;)

А что лучше для этого, кондишены или hof( т.е. монады и компания)?

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

>An = f(An-1) - как раз итеративные обозначения, где An следует читать как «значение переменной A на n шаге»

Понятие переменной контекстно-зависимо от области применения (математика/большинство языков программирования) и несколько различается

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

>>а это надо ввести в определение эквивалентности, а не доказывать

с десятичными дробями это тоже тривиально доказывается.

vasaka ★★★
()

А что лучше для множества небольших и изменяемых объектов: иммутабильность, синхронизация на основе системных примитивов, или что-то высокоуровневое типа tm? Возможно или первое и последние сделать на лиспе?

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

Отключить проверки типов в динамически типизированном языке? O_O Какой странный способ самоубийства.

А вот в статически типизированном XYZ включить рантаймные проверки типов нельзя :-P

Разве там сегфолты? Оно просто память жрало в три горла, и вылетало по ее нехватке. Ленивость же, круто.

Не-не, оно падало не от нехватки памяти. Вернее, не только.

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

этот (нерезборчиво) со 100% исключений я рассматривать всерьез не буду

Да вы, крестофилы, много чего рассматривать не хотите. Например, мультиметоды или, до недавнего времени, даже лямбды ;)

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

>Отключить проверки типов в динамически типизированном языке?

Давай конструктивно: рассмотрим dymamic_cast или его аналог в жаве в контексте проблем которые они рещают. Для решения каких проблем нужен динамический даункастинг и как можно обойтись без него? В качестве примера использования динамического даункастинга можно взять например ациклический визитор.

Absurd ★★★
()

Вот и получается, что для того, чтобы писать на этом функциональном поделии, нужно хорошо знать и математику, и программирование (чтобы не получался «ужоснах»-код). Много ли Вы знаете программирующих математиков? Вот то-то и оно, отсюда и высокая себестоимость разработок (требуется нанимать специалистов высокой квалификации). За столько лет существования ничего хорошего (кроме диалектов его же самого) из лиспа не поучилось, и вряд ли получится в будущем. Так что в топку этот язык со скобками, закапывайте.

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

> Да вы, крестофилы, много чего рассматривать не хотите. Например, мультиметоды или, до недавнего времени, даже лямбды ;)

почему же? хотим.

(что касается лямбд, то я их хотел еще в Си в 1993 году)

вот перепиши мой код на лиспе, чтобы он оборачивался за 32 бита, а не 28-29 как у love5an, тогда и сравним. причем сравним при разных BITS. (предупрежают — int там 32битный, да надо было написать assert)

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

>если программисты лиспа - это математики-задроты, то программисты на Си - технари-дроты, которые вместо того, чтобы продумывать бизнес-логику программы должны думать о том что и как помещается в память, думать о том как работает компьютер, а не программа.

А по моему, все наоборот. Программист отличается от быдлокодера именно тем, что он понимает, как работает программа на уровне железа. Всякие C# и PHP считают быдлоязыками именно потому, что там не надо думать о низкоуровневых вещах типа выделения памяти.

anonymous
()
Ответ на: ЛИСП не нужен от rsync

Ага. Вам на сишарпе писать проще, поскольку быдлоязык хаха :) Мозг у вас объектноориентированный.

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

>Много ли Вы знаете программирующих математиков?

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

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

> Просто в императивных языках это подразумевается неявно в виде регистров и памяти.

в императивных языках высокого уровня группа таких изменений оборачивается в statement



Явно, явно. Оператор (паскаль) ":=".

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

> Числовой континуум трактуется не как совокупность отдельных точек, а как «среда становления», поток измельчающихся рациональных интервалов.

Мне определённо импонирует такое определение.

Если же он увидит много красных яблок, то это увеличит его уверенность в том, что все не чёрные предметы не являются воронами,..


Фейспальм.svg

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