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 и рядом не валялся, особенно в плане производительности.

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

> И конкретно сейчас я занят переводом системы с 1С на Delphi/Firebird, хорошо видно, что эта задача трудно поддаётся автоматизации ввиду очень больших отличий в рантайме.

блин, а я изобретаю неспешно похожий велосипед для себя, на коленке, Just for Fun. С точки зрения грамматики: пишу себе парсер на ANTLR языка сабжа, он через AST.toStringTree() выдаёт дерево в виде S-выражений (только форматирование кривое). Эти S-выражения конечно ещё не нормальные лисп-формы, поэтому пишется пакет-«платформа», который включает пакет-«язык» с макросами, переводящими токен For в dotimes или iter или loop, Function в defun, и т.п. . Через сколько-то итераций имеем GUI REPL на ECL+Qt (но пока ещё не решил, может и схемы хватит), и затычку вместо «платформы» с заглушками.

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


в восьмёрке код может исполняться на сервере, в семёрке — не может, только на клиенте. Нужны какие-то аннотации в тексте, что разумно куда вынести.
Ещё, часть кода есть в хранимках, часть кода есть в платформе.

Кроме того, в подобных системах код - это далеко не вся спецификация программы.


есть метаданные, .dd. Структуре метаданных соответствует распарсенный .md (если мы про семёрку). Погугли про gcomp, скачай и поиграйся с декомпиляцией/компиляцией — увидишь все языки которые там реально используются (моксель с макетами, формы, с-понтом-orm, скрипты (код), дока и т.п.). Некоторые gcomp юзают для того чтобы в vcs ложить не блоб .md, а распарсенные тексты с кодом.

В 1С есть язык запросов, он мощнее, чем SQL и я не возьмусь написать автоматический транслятор с него на SQL (тем более, что и структура базы отличается).


это не нужно: гугли про 1C++ и его «метапарсер»

Имеются ещё экранные формы и формы отчётов, в неописанном формате.


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

И например, есть проблема такого рода: в 1С идентификаторы в кириллице, произвольной длины, в Firebird - в кириллице, небольшой и ограниченной длины, в Delphi - только латиница.


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

Т.е., основные проблемы в переводе с языка на язык - вовсе не в грамматике.


в семантике «платформы». Просто переведя код с языка на язык ты получишь всё тот же убогий бейсик с его однопоточной моделью. Нужно глубже мыслить, аспектами, контекстами, слоями архитектуры.
Мой поинт с elcs/лиспом в том, что лисп как метаязык позволяет унифицированно все слои описать сразу. Что-то близкое к идее STELLA.

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

Новый генератор (который fbody, постил выше), даёт такую возможность в 80% случаев.


а чего для 100% не хватает? нормального AST вместо S-exprs?

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


если это работает, это здорово

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

den73

Во, Stella - это интересно, хотя мёртвый язык вызывает опасения. И такие эпические масштабы - не для меня. Вообще, мне более интересно встроить incremental development именно в саму программу на конечном языке и похоже, что это возможно в случае С и Паскаля, хотя ограничения и трудности будут.

anonymous
()
Ответ на: den73 от anonymous

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

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

den73

> gcomp неплохо парсит что .md что .ert

Во, огромное спасибо! (Забавно, что в топике про лисп обсуждается 1С. Я представляю себе выражение лица лиспоправославных).

Проблемнее то, что по идее, дельфя должна с уникодом работать в идентификаторах.

Ну, это смотря, какая дельфя, у меня старая. Можно попробовать обновить.

такое решается простой заменой.

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

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

Да, я именно это и хотел, только уж жить в эту пору прекрасную...

а чего для 100% не хватает?

Просто отлаженности, а также следования спецификации при применении.

В принципе, я готов делиться исходниками, мне не жалко, только это будет довольно трудоёмко. Мой адрес:

(concatenate 'string (loop for x across «bde7@alr» for y across «udn3mi.u» append `(,x ,y)))

anonymous
()

лисп не знаю, но взглянув на этот, если можно так назвать это нагромождение скобок, ЛИСТИНГ, очень рад, что не довелось... лисп не нужен =D

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

> Плюнул и написал проект на Scala. У меня есть сроки

И какие же были сроки? ИМХО если вы работаете над проектом, ну скажем, год, то потратить пару недель на обработку напильником того, что вас не устраивает - не проблема. А если сроки неделя-две, то какая разница на чем писать - взял готовое решение и подогнал под требуемое.

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

> Просто взял и переквалифицировался в веб-разработчика ибо это самый простой способ использовать CL на практике Ну, может и я там буду когда-нибудь. Хотя у меня давно нет пафоса именно «использовать CL». Скорее - есть стремление, чтобы вложенные в освоение CL силы не пропали зря. А какими инструментами и библиотеками пользуешься (лисповыми и не только)? Какого рода проекты реализуешь?

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

> А какими инструментами и библиотеками пользуешься

(лисповыми и не только)?


http://github.com/archimag/
http://restas.lisper.ru/

Какого рода проекты реализуешь?


Да вроде уже много раз рассказывал:
http://lisper.ru/
http://www.youtube.com/watch?v=f6b0sQpDGVM

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

> И какие же были сроки? ИМХО если вы работаете над проектом, ну скажем, год, то потратить пару недель на обработку напильником того, что вас не устраивает - не проблема. А если сроки неделя-две, то какая разница на чем писать - взял готовое решение и подогнал под требуемое.

Пару месяцев. На допиливание времени небыло.

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

Ну, за lisper.ru тебе вряд ли платят, что-нибудь есть из коммерческих проектов в вебе? Да и lisper.ru - ничего особенного, мне пришлось чуть-чуть поучаствовать в разработке https://github.com/lnostdal/SymbolicWeb - вот это было да!

То, что на видео - выглядит более интересно, но на сайте я про это мало что нашёл. Можно ли увидеть в вебе?

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

> https://github.com/lnostdal/SymbolicWeb - вот это было да!

SymbolicWeb, как и большинство существующих веб-фреймворков для CL, это просто дурь какая-то.

То, что на видео - выглядит более интересно, но на сайте я про

это мало что нашёл. Можно ли увидеть в вебе?



В данный момент это внутри-корпоративная разработка, может быть через год будет в веб, а может и нет.

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

den73

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

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

> мне пришлось чуть-чуть поучаствовать в разработке https://github.com/lnostdal/SymbolicWeb - вот это было да!

ларс, конечно, клевый чувак, но то, что он делает далеко от промышленного программирования. И в частности symbolic web - это глубоко экспериментальный проект, который в реальной жизни не сможет выжить, потому что на нем будут хорошо и красиво писаться очень простые вещи, реальные приложения - криво и кособоко. Пихать те же шаблоны в лисп код - это безумие и показатель того, что человек никогда в своей жизни не писал в команде за деньги веб-приложения.

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

den73

может быть и так. Я от веб-программирования далёк. Мне не понравилось в symbolicweb полная асинхронность и отсутствие каких-либо методов синхронизации. Я всего лишь хотел сказать, что уровень сложности и навороченности AJAX приложения намного выше, чем то, что я увидел на сайте у archimag-а.

Может быть, я что-то недопонимаю.

anonymous
()
Ответ на: den73 от anonymous

> Я всего лишь хотел сказать, что уровень сложности и навороченности AJAX приложения намного выше, чем то, что я увидел на сайте у archimag-а.

да ты верно шутишь, swchat сложнее форума с викой, подсветкой синтаксиса и рсс-аггрегатором?

paranonymous
()
Ответ на: den73 от anonymous

> Реально нужен словарь перевода и соответствующая инфраструктура и процедура работы.

да хоть в транслит перевести.
http://www.softtime.ru/scripts/translit.php
По идее да, словарь, translation memory или хотя бы poedit/gettext/.po/.mo etc :)

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

> На допиливание времени небыло

Ага, а навелосипедить с нуля - было?

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