LINUX.ORG.RU

А как у common lisp дела с производительностью?

 


4

10

Решил покурить cl ,не ну реально красивый язык. Учить решил по книге Practical Common Lisp (может посоветуете что ещё?), а запускать код на clisp. Ну так вот какие реализации языка предпочесть? Касаемо книг хотелось бы что то типа k&r, в такой же манере, но для common lisp, ну вы поняли.

Ну и вообще что посоветуете начинающему лисперу?

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

Кстати вопрос: у Норвига есть пример компилятора из схемы в CL: http://norvig.com/paip/compile1.lisp и прочие compile*.lisp на http://norvig.com/paip/. Не знаешь, существует ли доделаный вариант такого компилятора (хотя бы с доделанной гигиеной)?

Не знаю, ибо не интересовался. И, стыдно признаться, даже не осилил paip :(

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

Что-то я там ни одной полной не нашёл. Всё на уровне набросков.

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

Полноценный компилятор Схемы в CL невозможен - рантайм CL не гарантирует корректную хвостовую рекурсию и не имеет примитивов для реализации first class continuations.

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

Полноценный компилятор Схемы в CL невозможен

Т.е. на одном «Тьюринт-полном» языке невозможно реализовать другой? Про потерю производительности и необходимость такого секса в ОЗК на лыжах в гамаке не говорим...

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

Т.е. на одном «Тьюринт-полном» языке невозможно реализовать другой?

Разговор про «полноценный компилятор», а не про убогие интерпретаторы.

Про потерю производительности и необходимость такого секса в ОЗК на лыжах в гамаке не говорим...

Говорим, еще как.

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

Понятие «полноценный компилятор» достаточно ограничивает само по себе. Куда ж дальше-то?

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

ты сейчас волшебным образом из рукава достанешь ещё одно ограничение, но я таки спрошу: CL не справится с генерацией одного кода из другого? Или все прочие особенности ты «очевидно» включил в понятие «полноценный»?

Ладно, можешь не отвечать - мне уже не интересно...

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

Не, ну ты тупой.

Повторяю для баранов: на CL нельзя написать волшебный макрос "(scheme blah-blah-blah)", который бы транслировал код на RnRS в код на CL, который был бы не менее эффективным, чем код, изначально написанный на CL. Потому что у CL и RnRS несовместимые требования к семантике рантайма. Корректная поддержка хвостовой рекурсии - это не «особенность», это фундаментальное требование, без которого Схема - это уже не Схема. First class continuations тоже не «особенность», а фундаментальнейшая конструкция языка.

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

на CL нельзя написать волшебный макрос "(scheme blah-blah-blah)", который бы транслировал код на RnRS в код на CL, который был бы не менее эффективным, чем код, изначально написанный на CL

не находишь, что это несколько другое, нежели та фраза, к которой я придрался? Впрочем, можешь не признаваться - желаемого я добился ;)

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

Формулировка звучала так:

Полноценный компилятор Схемы в CL невозможен

Под «полноценным компилятором» естественно понимается компилятор, способный порождать эффективный код, не менее эффективный, чем идиоматический код целевой платформы. Иначе компилятор не имеет права титуловаться «полноценным», поскольку налицо явная и вполне конкретная неполноценность.

Итак, еще раз, какие претензии к этой конкретной формулировке?

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

ЗЫ: причем, все это в контексте обсуждения как раз реализации из PAIP.

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

Под «полноценным компилятором» естественно понимается компилятор, способный порождать эффективный код, не менее эффективный, чем идиоматический код целевой платформы.

Спасибо за Ваш труд по разъяснению Вашего понимания Вашего-же понятия «полноценный компилятор» :)

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

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

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

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

У тебя слишком много определений, и совсем нет каких-либо фактов хоть как-то их подтверждающих. Так что последнее процитированное понятие больше характеризует тебя:

Корректная поддержка хвостовой рекурсии - это не «особенность», это фундаментальное требование, без которого Схема - это уже не Схема. First class continuations тоже не «особенность», а фундаментальнейшая конструкция языка.

Хвостовая рекурсия (не ТСО!) таки поддерживается некоторыми реализациями - можно опустить с указанием допустимых реализаций. Так что тебе то осталось написать на CL, или чего уж там мелочится - давай на конкретной реализации - sbcl, пусть даже не оптимальную версию First class continuations (а если вдруг сеньор умеет пользоваться поиском, то... ну да ладно, я не учитель), и продемонстрировать на примере сравнения, пусть даже с racket, на сколько выполнение на sbcl сливает «нативному». А я тогда буду знать - на сколько должна быть разница с «рефренсной реализацией», дабы можно было однозначно делить - полноценный компилятор или нет.

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

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

Хвостовая рекурсия (не ТСО!) таки поддерживается некоторыми реализациями

А в чем заключает такая поддержка без tco со стороны реализации?

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

Поддержка «хвостовой» рекурсии? В банальной «замене хвостового call+ret на jmp» (утрированно).

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

В банальной «замене хвостового call+ret на jmp» (утрированно).

Ну очень утрированно. Там еще надо аргументы вызова на стеке сдвинуть к началу фрейма.

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

sbcl - не единственный CL, поддерживающий «хвостовую рекурсию». И да - я оговорил это пункт. Но понятно - дислектикам всё ровно...

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

ты определись - тебе хвостовые вызовы или хвостовую рекурсию. А то меняешь показания быстрее чем малолетняя шалава под следствием...

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

Он говорит о кросскомпиляторе scheme -> cl, понятно что это невозмоно, даже с потерей эффективности - все равно невзможно. А scheme -> машкод, конечно возможно.

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

Он говорит о кросскомпиляторе scheme -> cl, понятно что это невозмоно, даже с потерей эффективности - все равно невзможно.

Не понятно. Какую «фичу» схемы ты не в состоянии выразить в «low level» примитивах (да хоть вплоть до псевдо-ассемблера), чтобы потом написать её на CL?

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

Не понятно. Какую «фичу» схемы ты не в состоянии выразить в «low level» примитивах

Так у нас нету low-level примитивов, только примитивы CL. Мы ведь в CL кросскомпилируем.

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

И? Ты можешь переопределить «ридер», ты можешь переопределить «поиск символов», я уж не говорю про «обычные» макры. Тебе доступны «окружения» (как времени компиляции, так и времени исполнения). Какую «фичу» схемы _принципиально_ нельзя реализовать?

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

Какую «фичу» схемы _принципиально_ нельзя реализовать?

Ну вон тебе про ТСО уже сказали. Реализуй. Или те же гигинические макры. Или фазы исполнения.

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

Схема требует корректности любых хвостовых вызовов.

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

tco реализуется через передачу tc вызывающему коду, а каждый вызов tco функции обрамляется соответствующим анализом. Да, при необходимости придётся переписать всю библиотеку. Это принципиально невозможно?

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

Не делается. Гигиена разве что (чисто изза тьюринг полноты, как реализация на пракике будет выглядеть я не представляю), а фазы точно нет.

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

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

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

Достаточно одного - cps с мини-интерпретатором это тормозня, а jump это очень, очень быстро, даже если аргументы функции по фрейму двигать.

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

Не тупи. CL здесь всего лишь целевой язык, гигиена и фазы делаются внутри компилятора Схемы.

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

так мы уже не про «полноценный», а про

Он говорит о кросскомпиляторе scheme -> cl, понятно что это невозмоно, даже с потерей эффективности - все равно невзможно.

Не вижу никаких ограничений «полноценностью» :)

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

cps с мини-интерпретатором это тормозня

выше по цепочке шла речь о невозможности как таковой. Для оценки порядка тормозни нужен минимальный «тест-кейс»

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

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

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

Какие отличия слона от сложения?

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

Нельзя все всунуть в один тагбоди. Нельзя реализовать на тагбоди функции, если нету доступа к стеку.

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

Напоминаю, что речь о компиляторе а не об интерпритаторе. Интерпретатор, конечно, сделать можно. А компилятор - нет. Не получится заставить рантай общелиспа «притвориться» рантаймом схемы. Они кардинально разные.

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