LINUX.ORG.RU

[FFI] CL крут

 


1

3

В каком высокоуровневом языке еще есть такой FFI, или хотя бы возможность его создания?

http://github.com/Lovesan/virgil

//gcc -std=c99 -shared -o virgil_examples[.dll/.so] virgil_examples.c
#include <stdio.h>

typedef void (*matrix_callback)(float* matrix, int m, int n, void* param);

void print_matrix(float* matrix, int m, int n)
{
    for(int i = 0; i<m; ++i)
    {
        for(int j = 0; j<n; ++j)
            printf("%g ", matrix[i*n+j]);
        printf("\n");
    }
}

void foo (float* matrix, int m, int n, matrix_callback f, void* param)
{
    print_matrix(matrix, m, n);
    f(matrix, m, n, param);
}
(deftype matrix () '(simple-array single-float (* *)))

(define-foreign-library virgil-examples
  (t (:default "virgil_examples")))

(use-foreign-library virgil-examples)

(define-external-function "foo"
    (:cdecl virgil-examples)
  (void)
  (matrix (& (simple-array single-float) :inout))
  (m int :aux (array-dimension matrix 0))
  (n int :aux (array-dimension matrix 1))
  (callback pointer)
  (param (& float :in t) :optional void))

(define-callback add-number
    void ((data pointer) (m int) (n int) (param (& float :in t)))
  (with-value (matrix data `(simple-array single-float (,m ,n)) :inout)
    (let ((param (if (voidp param) 0.0 param)))
      (dotimes (i m)
        (dotimes (j n)
          (incf (aref matrix i j) param))))))

(defun main (matrix)
  (declare (type matrix matrix))
  (format t "~&Matrix:~%~a~%" matrix)
  (force-output *standard-output*)
  (foo matrix (get-callback 'add-number) 1.0)
  (format t "~&After processing:~%~a" matrix))
* (defparameter *matrix* (make-array '(4 4) :element-type 'single-float
                           :initial-contents '((1.0  2.0  3.0  4.0)
                                               (5.0  6.0  7.0  8.0)
                                               (9.0  10.0 11.0 12.0)
                                               (13.0 14.0 15.0 16.0))))
;;==> *MATRIX*

* (main *matrix*)
;;на stdout ==>
Matrix:
#2A((1.0 2.0 3.0 4.0)
    (5.0 6.0 7.0 8.0)
    (9.0 10.0 11.0 12.0)
    (13.0 14.0 15.0 16.0))
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
After processing:
#2A((2.0 3.0 4.0 5.0)
    (6.0 7.0 8.0 9.0)
    (10.0 11.0 12.0 13.0)
    (14.0 15.0 16.0 17.0))
Даже питоновский ctypes и рядом не валялся, особенно в плане производительности.

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

> Вообще-то, размер тестов в хороших библиотеках, которыми приятно

пользоваться, сравним с количеством основного кода.


Да, конечно, в той же cl-closure-template тестов где-то 800 строк кода, т.е. лишь не намного меньше, чем кода релаизации. Но... Тесты это не код. Они делаются по другому и их размер в строчках код абсолютно ни о чём не говорит.

примеров и т.п.,

Но на это тоже было потрачено время.


Конечно, но это просто моя добровольная инициатива. Без этого всё бы тоже прекрасно работало. Т.е. это не вынужденная трата времени, а сугубо добровольная.

Но их теперь нужно поддерживать, это же правильные CL библиотеки,

не as-is поделки, я верно понимаю?



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

Черт, после этой фразы начинается классический лиспосрач.

Пожалуй, нужно остановиться.



А лисп здесь вообще особо не при чём. Я специально занимался изучением популярных решений на PHP, Ruby и Python и делал своё на основе собственного понимания веб-разработки. Веб-разработка это вообще ведь очень просто, тут на самом деле не нужны раздутые решения, это ведь не Win32 API.

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

А где ответ? Про говно из жопы что-ли?

Например, задающий вопрос «Сколько еще мы будем терпеть эту несправедливость?» не ожидает ответа, а хочет подчеркнуть, что «Мы терпим несправедливость.»

Же.

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

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

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

А автор книги Practical Common Lisp пишет что решил на CL задачу, которую не мог решить на Java несколько лет. И такие отзывы о CL я слышал уже не раз.

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

У-у, мизантроп. За хорошие деньги я и сам с удовольствием попишу на лиспе.

На лиспе прикладнуху ровно так же пишут. У нас девочка железячникам ваяет софт со standalone гуйнёй на лиспворксе для тестирования их железок.

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

а что ты понимаешь под лиспом?

Дефолтный лисп == Коммон Лисп.

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

Очевидно CL, на я думал что это и так понятно из контекста.

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

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

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

>А автор книги Practical Common Lisp пишет что решил на CL задачу, которую не мог решить на Java несколько лет. И такие отзывы о CL я слышал уже не раз.

)) что-то мне подсказывает, что это просто дешёвые понты.
Равно как и программная реализация (на ассемблере) триггера на 10 мегагерц. Да, это можно сделать. но ненужно и не доказывает крутость ассемблера.


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

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

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

> В любом случае, я рад, что у вас все хорошо и удалось отделаться

малой кровью. Такие истории успеха единичны.


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

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

Но регулярно ведущиеся разговоры об «элитарности» (и т.п.) с одной стороны отталкивают многих вменяемых и толковых разработчиков (ибо неадекват), а с другой привлекают много не достаточно адекватных людей, которым CL нужен для чего угодно, но только не для реальной разработки. Поэтому наблюдается ощутимый дисбаланс между реальными разработками и количеством пустого (но не безобидного) трёпа на тему. Хотя может в USA ситуация иная, но это надо у mv уточнить.

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

Ценно ли мнение невежд?

Мы говорили об очевидности ответа, а не его ценности.

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

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

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

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

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

>Посему фанатичные заявления о невероятной скорости CL, опираясь только на один аспект, по меньшей мере некорректы.
Ты хоть строчку на CL написал, и сравнил с Сями теми же? Я подозреваю, что нет.

а после таких заявлений мне даже не интересно дальше дискутировать.

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

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

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

Ты не поверишь, всё языки попадают под определение «обычные» ;)

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

Про melange спасибо, надо посмотреть.
Кстати, я интерфейс к COM в doors
https://github.com/Lovesan/doors/tree/master/com/
писал основываясь как раз на публикацию об оном интерфейсе в Harlequin Dylan.
http://www.google.com/search?hl=ru&biw=1152&bih=762&q=%22modern+languages+and...

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

Причём, когда дело доходит до рукопашной, то на цл ваять и быстрей, и приятней

Решает же опыт в конце-концов. Я набил руку на питоне. Ведь не будет так: сел за CL и через неделю 70 строчек/час кода вылетает.

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

Сначала биндинг к DirectX, потом на его основе гуй по типу WPF и, м.б, тридэдвижок.

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

А ты не подумал, что данные в массиве и так могут быть выровнены по 4 байтам(а заголовок по 3 соответственно)? Мозгов не хватило подумать?

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

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

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

Решает же опыт в конце-концов. Я набил руку на питоне. Ведь не будет так: сел за CL и через неделю 70 строчек/час кода вылетает.

У меня опыта по цл раз в 10 меньше, чем в сях, но на лиспе я в 10 раз быстрее пишу, чем на сях. Разницы между питоном и цл, конечно, меньше, но если набить руку на обоих, то на лиспе всё равно быстрее ваяться в общем случае будет.

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

> Ты не поверишь, всё языки попадают под определение «обычные» ;)

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

Есть люди, которые позиционируют некоторые языки (не только CL) как более «интеллектуальные», а себя, как знакомых с этими языками, тоже относят к какой-то другой категории. Все эти разговоры про быдлокодниг и миллионы мух. Естественно, это имеет очень негативные последствия, ибо есть основания полагать, что самые толковые разработчики реально пишут на C++, а те же программисты на PHP создали огромное количество замечательных систем. Высокомерие, опирающееся на не доказанную (и часто просто отсутствующую) компетентность, производит особенно негативное впечатление, впечатление психушки, где сидят Наполены и прочие «замечательные» личности.

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

Будет, но попожа.
Я занят другими задачами, влом перемыкать мозги.)

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

>А ты не подумал, что данные в массиве и так могут быть выровнены по 4 байтам(а заголовок по 3 соответственно)? Мозгов не хватило подумать?

Дарагой друк! Вероятность того, что твои данные выровнены так, как надо, составляет 0 целых хрен десятых, потому как структуры данных обычно выравниваются по «хорошим» границам. Если твоя структура начинается с «хорошей» границы. то +1 явно бьет по 32-битным словам.

И, да, ты можешь лично убедиться в том, что CL обосрался в очередной раз под отладчиком, который покажет, что EDI делится на 4, а то и на 16 нацело.

P. S. таких смелых предположений о выравнивании не делает даже gcc, когда генерирует код для memcpy из одного статического буфера в другой.

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

Аналог позже набросаю, когда до дома доберусь

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

Выучить, наконец, CL для тебя - принципиальная невозможность? Печально.

Принципиальное отсутствие мотивации. Деньги значимым мотивирующим фактором не является, как, например, в жабе, где любой е#онат может начать получать профит немедленно, не становясь общепризнанным гуру, которого любой гуголь нанять рад. Интерес изучать новое чисто из чистого любопытства есть далеко не у всех. У тех, кого нет, но тролли таки доводят до того, что человек с неохотой открывает букварь и смотрит, что же там такого, то при первой ненравящейся им фигне они с негодованием отметают букварь в самый пыльный угол и срут в комментах, в какое же говно они наступили. И библиотек нет, и качества они плохого, и каждая вторая уже год не обновлялась, и лямбды ваши теперь и в крестах есть, и вообще где красивое IDE, мать вашу?

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

>структуры данных обычно выравниваются по «хорошим» границам. Если твоя структура начинается с «хорошей» границы. то +1 явно бьет по 32-битным словам.
Какие нахер «структуры данных». Ты что, знаком с политикой выделения памяти в SBCL? Нихера ты не знаком. Тогда с каких оснований несешь весь этот бред?

И, да, ты можешь лично убедиться в том, что CL обосрался в очередной раз под отладчиком, который покажет, что EDI делится на 4, а то и на 16 нацело.


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

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

Потому что вонючий GCC генерирует код для вонючего Си. Врубаешься в идею?

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

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

Назови по никам толковых лоровцев, которые не стали изучать лисп из-за неадекватности лиспотроллей? А я назову по никам тех, кто про лисп узнали из лиспосрачей, и даже начаяли чего-то там изучать :)

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

Есть люди, которые позиционируют некоторые языки (не только CL) как более «интеллектуальные», а себя, как знакомых с этими языками, тоже относят к какой-то другой категории. Все эти разговоры про быдлокодниг и миллионы мух. Естественно, это имеет очень негативные последствия, ибо есть основания полагать, что самые толковые разработчики реально пишут на C++, а те же программисты на PHP создали огромное количество замечательных систем. Высокомерие, опирающееся на не доказанную (и часто просто отсутствующую) компетентность, производит особенно негативное впечатление, впечатление психушки, где сидят Наполены и прочие «замечательные» личности.

Значешь, Бетховен «Лунную сонату» мог бы и на перевёрнутой кастрюле похоже настучать, но лучше бы ему фортепиано дать...

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

>Ты что, знаком с политикой выделения памяти в SBCL?

Охуенная политика, да: просим 2 гига у операционки и поганим их по мере необходимости. RSS, единожды поднявшись до 2Gb никогда не упадет. Фантастическая политка!

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

Ну так посмотри содержимое регистра EDI в этой точке.

Потому что вонючий GCC генерирует код для вонючего Си.

Ты так ненавидишь C и C++, что можно подумать, будто тебя в подворотне изнасиловали Керниган и Ричи, а Столлман с Шилдтом снимали это видео на камеру.

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

> Назови по никам толковых лоровцев, которые не стали изучать лисп из-за неадекватности лиспотроллей?

предлагаешь ему воспользоваться телепатическими способностями? а толковые люди на ЛОР заходят - правда они не рекламируют себя, что я вот такой вот крутой, абсолютно наоборот - шума много от неучей, и разве что наблюдая за интересными проектами, можно в changelog или списке рассылки встретить знакомое имя, которое видел на ЛОРе

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

предлагаешь ему воспользоваться телепатическими способностями? а толковые люди на ЛОР заходят - правда они не рекламируют себя, что я вот такой вот крутой, абсолютно наоборот - шума много от неучей, и разве что наблюдая за интересными проектами, можно в changelog или списке рассылки встретить знакомое имя, которое видел на ЛОРе

Если человек толковый, то он, не глядя на троллей, полистав одно только оглавление Cltl2, не может не понять, что язычёк-с то с изюминкой. Даже со стаканом изюма.

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

> Назови по никам толковых лоровцев, которые не стали изучать лисп

из-за неадекватности лиспотроллей?


Вон, tailgunner сидит и пишет себе на Python ;) А так затрудняюсь ответить и даже не знаю из чего исходить. Впрочем, я ведь на ЛОРе фактически меньше года активно присутствую и то, только в срачах про CL.

А я назову по никам тех, кто про лисп узнали из лиспосрачей,

и даже начаяли чего-то там изучать :)



Большинство людей с которыми я знаком и которые реально пишут на CL на ЛОР вообще (почти) не ходят. Собственно, для меня в основном интересны люди, которые не просто «чего-то там изучают», а которые пишут код, так что им можно воспользоваться или которые могу прислать патч на что-то. Я ведь тоже PHP для общего развития изучал, но только толку от меня для PHP-сообщества ноль.

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

Значешь, Бетховен «Лунную сонату» мог бы и на перевёрнутой кастрюле похоже настучать, но лучше бы ему фортепиано дать...

4.2 нормальным композиторам (а не «крутым» всяким) вообще-то инструмент только мешается, они сочиняют в голове и записывают нотками и для того чтобы «услышать» произведение им достаточно посмотреть в ноты

и тот же приведённый Вами в качестве примера Бетховен, который оглох в конце пути, но таки дописал, этому прекрасная иллюстрация

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

>Ну так посмотри содержимое регистра EDI в этой точке.

Мне даже вонючий EDI смотреть не надо:

(defvar *v* (make-array 4 :element-type 'single-float))

(print (mod (sb-sys:sap-int (sb-sys:vector-sap *v*)) 4))
;;==> 0

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

Ну с cl-gtk2 такое вполне можно сделать. В чем смысл?

Надо сначала сделать байндинги для gtksourceview. Вот где печаль и тоска.

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