LINUX.ORG.RU

Вышло обновление для Corman Lisp 3.02

 , ,


1

1

В этой версии починили запуск Corman Lisp на современных вeрсиях Windows. Доступны исходные коды (лицензия MIT) и свежий бинарный дистрибутив.

Corman Lisp — это одна из многих реализаций языка программирования Common Lisp. До недавнего времени Corman Lisp распространялся под коммерческой лицензией и в этом году был выпущен под свободной open-source лицензиией MIT. Особенностью Corman Lisp является тесная интеграция с Windows платформой (доступно все Win32 API), компилятор в нативный код, встроенный ассемблер и дизассемблер для 80x86, встроенная IDE.

Подробности: http://lispblog.xach.com/post/120466152968/corman-lisp-3-02-now-available

Скачать: https://github.com/sharplispers/cormanlisp/releases

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

Это не идеоматический код.

Кококо. :-)

Так никто не пишет.

Я пишу. :-)

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

Может, потому что я в 1.2.12 запускал?

ccl даёт примерно такой же результат:

Welcome to Clozure Common Lisp Version 1.10  (LinuxX8664)!

CCL is developed and maintained by Clozure Associates. For more information
about CCL visit http://ccl.clozure.com.  To enquire about Clozure's Common Lisp
consulting services e-mail info@clozure.com or visit http://www.clozure.com.

? (time (loop for i from 1 to 1000000000 sum i))
(LOOP FOR I FROM 1 TO 1000000000 SUM I)
took 2,271,578 microseconds (2.271578 seconds) to run.
During that period, and with 6 available CPU cores,
     2,256,000 microseconds (2.256000 seconds) were spent in user mode
             0 microseconds (0.000000 seconds) were spent in system mode
500000000500000000

Хрен его знает, товарищ майор. Может gentoo решает?

no-such-file ★★★★★
()

(доступно все Win32 API)

Что в переводе на русский: «доступен весь Win32 API». :-)

anonymous
()
Ответ на: комментарий от no-such-file
monk@veles:~$ racket
Welcome to Racket v6.1.1.
> (time (for/sum ([i (in-range 1000000001)]) i))

cpu time: 4828 real time: 4832 gc time: 0
500000000500000000
>
monk@veles:~$ sbcl
This is SBCL 1.2.11.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (time (loop for i from 1 to 1000000000 sum i))

Evaluation took:
  5.049 seconds of real time
  5.036000 seconds of total run time (5.036000 user, 0.000000 system)
  99.74% CPU
  9,069,172,508 processor cycles
  0 bytes consed

500000000500000000
* monk@veles:~$ uname -a
Linux veles 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-3 (2015-04-23) x86_64 GNU/Linux
monk@veles:~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 58
model name      : Intel(R) Celeron(R) CPU 1037U @ 1.80GHz
monk ★★★★★
()
Ответ на: комментарий от monk

9,069,172,508 processor cycles - у всех тут ~ 7 миллиардов, если писать ИДЕОМАТИЧЕСКИЙ!!!11 код, а у тебя аж 9. :-)

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

У меня 7 миллиардов на i5 на Debian:

* (time (loop for i from 1 to 1000000000 sum i))

Evaluation took: 3.146 seconds of real time 3.144196 seconds of total run time (3.144196 user, 0.000000 system) 99.94% CPU 7,218,935,606 processor cycles 0 bytes consed 500000000500000000

Linux anon 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u1 x86_64 GNU/Linux

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

Win7, сравниваем:

sbcl

* (time (loop for i from 1 to 1000000000 sum i))

Evaluation took: 3.246 seconds of real time 3.229221 seconds of total run time (3.213621 user, 0.015600 system) 99.48% CPU 9,116,543,790 processor cycles 0 bytes consed

500000000500000000

racket

«racket» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

Вывод: CL рулит

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

Репл clojure-clr заводится гораздо шустрее жабьей кложуры.
Вся жопа ситуации – инфраструктура строится вокруг JVM, на дотнет сообщество как-то подзабило, поэтому придётся напрямую дёргать дотнетовские функции. Проще ваять на F# в таком случае.

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

Корман

«Корман» не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

Корман тоже отстой.

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

А ты наберись терпения и сравни именно при суммировании первых десяти миллиардов чисел. (Прошу других участников дискуссии не полениться и тоже проверить.) Вот что на моём i5 под Debian:

(time (for/sum ([i (in-range 10000000000)]) i))

cpu time: 580337 real time: 580343 gc time: 11360 49999999995000000000

* (time (loop for i from 1 to 10000000000 sum i))

Evaluation took: 335.099 seconds of real time 334.088879 seconds of total run time (333.524844 user, 0.564035 system) [ Run times consist of 18.688 seconds GC time, and 315.401 seconds non-GC time. ] 99.70% CPU 767,584,544,174 processor cycles 334,223,927,632 bytes consed 50000000005000000000

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

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

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

Celeron 1037U, Debian

(time (for/sum ([i (in-range 10000000000)]) i))

cpu time: 770480 real time: 769602 gc time: 16368

* (time (loop for i from 1 to 10000000000 sum i))

Evaluation took:
  442.352 seconds of real time
  441.832000 seconds of total run time (440.688000 user, 1.144000 system)
  [ Run times consist of 30.912 seconds GC time, and 410.920 seconds non-GC time. ]
  99.88% CPU
  794,430,096,072 processor cycles
  334,223,993,248 bytes consed

На 32 битах разница между SBCL и Racket была меньше. Или оптимизатор в SBCL с тех пор сильно подкрутили.

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

Может конкретный процессор

Ну прям заинтриговал. Выложи disassemble чтоли, интересно в чём таки отличие.

CL-USER> (defun test () (loop for i from 1 to 1000000000 sum i))
TEST
CL-USER> (disassemble #'test)
; disassembly for TEST
; Size: 78 bytes. Origin: #x10060C8A24
; 24:       498B4C2460       MOV RCX, [R12+96]                ; thread.binding-stack-pointer
                                                              ; no-arg-parsing entry point
; 29:       48894DF8         MOV [RBP-8], RCX
; 2D:       BB02000000       MOV EBX, 2
; 32:       31C9             XOR ECX, ECX
; 34:       EB28             JMP L1
; 36:       660F1F840000000000 NOP
; 3F:       90               NOP
; 40: L0:   48895DF0         MOV [RBP-16], RBX
; 44:       488BD1           MOV RDX, RCX
; 47:       488BFB           MOV RDI, RBX
; 4A:       41BBC0010020     MOV R11D, 536871360              ; GENERIC-+
; 50:       41FFD3           CALL R11
; 53:       488BCA           MOV RCX, RDX
; 56:       488B5DF0         MOV RBX, [RBP-16]
; 5A:       4883C302         ADD RBX, 2
; 5E: L1:   4881FB00943577   CMP RBX, 2000000000
; 65:       7ED9             JLE L0
; 67:       488BD1           MOV RDX, RCX
; 6A:       488BE5           MOV RSP, RBP
; 6D:       F8               CLC
; 6E:       5D               POP RBP
; 6F:       C3               RET
; 70:       CC10             BREAK 16                         ; Invalid argument count trap

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file
* (disassemble #'test)

; disassembly for TEST
; Size: 78 bytes. Origin: #x1005E14074
; 74:       498B4C2460       MOV RCX, [R12+96]                ; thread.binding-stack-pointer
                                                              ; no-arg-parsing entry point
; 79:       48894DF8         MOV [RBP-8], RCX
; 7D:       BB02000000       MOV EBX, 2
; 82:       31C9             XOR ECX, ECX
; 84:       EB28             JMP L1
; 86:       660F1F840000000000 NOP
; 8F:       90               NOP
; 90: L0:   48895DF0         MOV [RBP-16], RBX
; 94:       488BD1           MOV RDX, RCX
; 97:       488BFB           MOV RDI, RBX
; 9A:       41BBC0010020     MOV R11D, 536871360              ; GENERIC-+
; A0:       41FFD3           CALL R11
; A3:       488BCA           MOV RCX, RDX
; A6:       488B5DF0         MOV RBX, [RBP-16]
; AA:       4883C302         ADD RBX, 2
; AE: L1:   4881FB00943577   CMP RBX, 2000000000
; B5:       7ED9             JLE L0
; B7:       488BD1           MOV RDX, RCX
; BA:       488BE5           MOV RSP, RBP
; BD:       F8               CLC
; BE:       5D               POP RBP
; BF:       C3               RET
; C0:       CC10             BREAK 16                         ; Invalid argument count trap
NIL

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

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

Поэтому и говорю, что количество процессорных циклов, видимо, зависит от внутрипроцессорного оптимизатора

Хм, ну значит таки AMD рулит.

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

Или оптимизатор в SBCL с тех пор сильно подкрутили

334,223,993,248 bytes consed

30.912 seconds GC time

Вангую, что подкрутили аллокатор и gc.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

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

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

Кстати, ты с pycket не игрался? По идее трассирующий джит на таком коде должен оптимальный результат показать и выдать производительность на уровне сишки +-.

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

Кстати, ты с pycket не игрался? По идее трассирующий джит на таком коде должен оптимальный результат показать

Не игрался. Посмотрю.

Так в Racket вроде и так JIT. GNU Lightning

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

Спасибо за интересную ссылку. :-) Это всё хорошо, только непонятно, почему тянут с новым релизом Racket. Обещали, вроде как, ещё в марте, а до сих пор 6.1.1. :-)

anonymous
()
Ответ на: комментарий от anonymous
$ sbcl
This is SBCL 1.2.11-1.fc22, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (time (loop for i from 1 to 1000000000 sum i))

Evaluation took:
  4.201 seconds of real time
  4.199278 seconds of total run time (4.199278 user, 0.000000 system)
  99.95% CPU
  4,191,043,090 processor cycles
  0 bytes consed
  
500000000500000000

$ uname -a
Linux gravicappa 4.0.4-303.fc22.x86_64 #1 SMP Thu May 28 12:37:06 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 61
model name	: Intel(R) Core(TM) M-5Y10c CPU @ 0.80GHz
stepping	: 4
microcode	: 0x18
cpu MHz		: 2000.156
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 20
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap xsaveopt
bugs		:
bogomips	: 1995.41
clflush size	: 64
cache_alignment	: 64
address sizes	: 39 bits physical, 48 bits virtual
power management:
mv ★★★★★
()
Ответ на: комментарий от mv

Вот интересненько...

(defun sum (n)
  (declare (fixnum n) (optimize (speed 3) (safety 0)))
  (loop for i from 1 to n sum i into s fixnum))

(disassemble 'sum)
(time (sum 1000000000))
(quit)
; disassembly for SUM
; Size: 37 bytes. Origin: #x1002DD21A5
; A5:       B801000000       MOV EAX, 1                       ; no-arg-parsing entry point
; AA:       31C9             XOR ECX, ECX
; AC:       EB0C             JMP L1
; AE:       6690             NOP
; B0: L0:   488D1400         LEA RDX, [RAX+RAX]
; B4:       4801D1           ADD RCX, RDX
; B7:       48FFC0           INC RAX
; BA: L1:   4839D8           CMP RAX, RBX
; BD:       7EF1             JLE L0
; BF:       BA17001020       MOV EDX, 537919511
; C4:       488BE5           MOV RSP, RBP
; C7:       F8               CLC
; C8:       5D               POP RBP
; C9:       C3               RET
Evaluation took:
  0.503 seconds of real time
  0.503052 seconds of total run time (0.502880 user, 0.000172 system)
  100.00% CPU
  502,084,822 processor cycles
  0 bytes consed
#include <stdio.h>

unsigned long long foo(long to)
{
	unsigned long long s;
	long i;

	for (i = 1, s = 0; i <= to; i++)
		s += i;

	return s;
}

int main()
{
	printf("%lld\n", foo(1000000000));

	return 0;
}
$ gcc -o sum -O2 sum.c
$ objdump -S foo
...
0000000000400570 <foo>:
  400570:       48 85 ff                test   %rdi,%rdi
  400573:       7e 19                   jle    40058e <foo+0x1e>
  400575:       48 83 c7 01             add    $0x1,%rdi
  400579:       ba 01 00 00 00          mov    $0x1,%edx
  40057e:       31 c0                   xor    %eax,%eax
  400580:       48 01 d0                add    %rdx,%rax
  400583:       48 83 c2 01             add    $0x1,%rdx
  400587:       48 39 d7                cmp    %rdx,%rdi
  40058a:       75 f4                   jne    400580 <foo+0x10>
  40058c:       f3 c3                   repz retq 
  40058e:       31 c0                   xor    %eax,%eax
  400590:       c3                      retq   
  400591:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  400598:       00 00 00 
  40059b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
...
$ perf stat ./sum
500000000500000000

 Performance counter stats for './sum':

          0.730554      task-clock (msec)         #    0.494 CPUs utilized          
                 0      context-switches          #    0.000 K/sec                  
                 1      cpu-migrations            #    0.001 M/sec                  
                47      page-faults               #    0.064 M/sec                  
           576,008      cycles                    #    0.788 GHz                    
                 0      stalled-cycles-frontend   #    0.00% frontend cycles idle   
                 0      stalled-cycles-backend    #    0.00% backend  cycles idle   
           473,790      instructions              #    0.82  insns per cycle        
            93,163      branches                  #  127.524 M/sec                  
             3,983      branch-misses             #    4.28% of all branches        

       0.001480047 seconds time elapsed

Разница - всего 6%, и при этом лиспокод достаточно идеоматичен.

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

Разница - всего 6%, и при этом лиспокод достаточно идеоматичен.

Не понимаю я эти высосанные непонятно из какой части сознания догму, или сказ, или повесть, или просто задротство, именуемое в дальнейшем «идиоматичностью». Что вы как задроты какие-то, в самом то деле? Ну есть официальный стандарт ANSI Common Lisp. Люди работали, старались, договаривались, спорили на протяжении декады, наконец-таки выпустили достойный документ, который чётко объясняет как использовать язык Common Lisp. Таким образом, программист может спокойно использовать всё богатство языка, описанное в стандарте. Но нет, появляются остебятники, которые выдумывают какие-то свои идиомы и «стандарты» программирования, навязывая заморочки себе и своим коллегам. Нет никаких «идеоматичностей», кроме как тех, что живут в замороченных умах замороченного сообщества. Есть стандарт ANSI Common Lisp, а всё что выше этого - это уже ничего не стоящие заморочки унылых задротов, любящих свои догмы, и свои проблемы.

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

Ну, в принципе, не совсем честно, ибо сишечная программа вся целиком замеряется, но всё же.

У тебя китайский gcc, мой выдал:

	movabsq	$500000000500000000, %rdx
	movl	$.LC3, %esi
	movl	$1, %edi
	xorl	%eax, %eax
	call	__printf_chk
anonymous
()
Ответ на: комментарий от anonymous

У тебя китайский gcc, мой выдал:

Я специально сделал так, чтобы в константу не дооптимизировалось.

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

Я специально сделал так, чтобы в константу не дооптимизировалось.

Дык я твой пример и скопировал один в один.

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

Интересно... Федора 22, gcc-5.чётотам.

.ident «GCC: (Ubuntu 5.1.1-6ubuntu1) 5.1.1 20150519»

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

идеоматичен
(safety 0)

Ну это несерьезно.

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

Если ты собираешься на CL писать текучую парашу в стиле сишки, то зачем тебе CL? Пиши на сишке.

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

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

Чего ты мне тут заливаешь про идиоматичность по стандарту, а? Стандарте описан синтаксис loop, который предусматривает указание типов для переменных цикла, так что код

(time (loop with i fixnum = 1 and s fixnum = 1 while (< i 1000000000) do (progn (incf i) (incf s i)) finally (return s)))
является кодом, соответствующим стандарту. Давай до свидания со своими вымышленными идиомами, заливай студентоте.

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

FFI не стандартен, удобней всё на лиспе писать, если портабельность нужна. Особенно, межосёвая. Аннотации типов довольно часто встречаются. Локальный safety 0, debug 0 тоже иногда.

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

Есть стандарт ANSI Common Lisp, а всё что выше этого - это уже ничего не стоящие заморочки унылых задротов

То есть в Common Lisp нет потоков, нет слабых ссылок, нет TCO? Тогда всё ещё грустнее :-(

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

То есть в Common Lisp нет потоков, нет слабых ссылок, нет TCO? Тогда всё ещё грустнее :-(

Да что уж там, даже FFI нет в ANSI Common Lisp, хотя, казалось бы, что ведь могли бы его включить в стандарт, ибо C уже тогда применялся массово. Отсюда вывод - Common Lisp - язык старый и специфический, не универсальный. Испольвание потоков, FFI и т.д. не является стандартным использованием Common Lisp. А отсюда можно сделать вывод, что Common Lisp в настоящее время является, прежде всего, языком для прототипирования, особенно, с учётом отличной производительности. Можно, конечно, использовать трэды, FFI. Можно использовать Common Lisp в продакшене. Но тогда и не нужно париться с дутой «идиоматичностью», потому как в этом случае всё равно придётся использовать конкретную реализацию Common Lisp. И там уж точно не зазорно применять декларации и описатели типов.

PS. И макросы чтения я тоже приветствую, и чихать я хотел на задротов, которые ИБЕГАЮТ ИХ ИСПОЛЬЗОВАНИЯ!!!11

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

То есть в Common Lisp нет потоков, нет слабых ссылок, нет TCO? Тогда всё ещё грустнее :-(

В каком-то абстрактном Common Lisp много чего нет. У меня в LispWorks есть все из перечисленного и даже больше. :) Все равно приходится разрабатывать для конкретной комбинации ОС+железо и затем тюнить финальный продукт для продакшена используя все фичи по-максимум конкретной реализации. Остальные юзкейсы мне просто не интересны и времени у меня для этого нет.

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

а что пилите на лиспе, если не секрет?

Уже несколько лет приложения (сервер сайд) для телекома.

Для собственных поделок тоже использую (сейчас на винде и маке).

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

Ты gensym штоле? Я-то думал нуб какой-то новый.

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

приложения (сервер сайд) для телекома

очень интересно! а подробнее нигде не описывали? может быть у вас были выступления на эту тему? (где именно применяется? сколько человек разрабатывает? какая нагрузка? почему лисп, а не другая технология? технические подробности?)

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