LINUX.ORG.RU

Кодогенерация LISP → C


1

3

Вот тут все говорят, что дескать лисп не предназначен для крутых вычислений, что лучше дескать «программа на лиспе напишет программу на Си/Фортране/whatever». Интересно знать, а как это реализуется на практике? Вот, скажем, есть выражение (sin (+ (* x x) 1). Как будет выглядеть макрос, переводящий эту форму в строку «sin(x*x+1)»? Пускай рассматривается коммон лисп и его подмножество: арифметика, векторы (aref должно переводится в сишную индексацию с квадратными скобками), а также функции соответствующие сишному <math.h>.


Крайнюю (и наиболее развитую) форму этого подхода смотри на примере Mathematica.

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

Да мне бы самую простую, достаточно арифметики и работы с массивами-векторами. Не буду же я ради частного случая тащить Mathematica к себе в программу.

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

Ну и функций из math.h конечно же. Этого хватит.

Ndulu
() автор топика

лисп не предназначен для крутых вычислений

Почему?

программа на лиспе напишет программу на Си/Фортране/whatever

И охота стока гемороя иметь?

Как будет выглядеть макрос

Макросы в данном случае вообще не при чём.

archimag ★★★
()

Либо ты сильно переврал про всех, либо эти «все» на самом деле совсем не все и не совсем в теме.

А так если брать CL, посмотри на ECL. Он что-то такое и делает.

aref должно переводится в сишную индексацию с квадратными скобками

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

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

Почему?

За что купил, за то и продаю

И охота стока гемороя иметь?

Пожалуйста, ответьте на задачу, если можете

Макросы в данном случае вообще не при чём.

Ну так как мне тогда перевести лисп-форму (sin (+ (* x x) 1)) в строку «sin(x*x+1)»?

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

А зачем?

Вы можете ответить на задачу?

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

Есть математическая модель, заданная на лиспе. Надо при помощи лиспа перевести эту модель в исходный код на другом языке. Как это - «причем тут особенно лисп»?

Тут будет больше специфики имеено твоих представлений как именно должен выглядеть выходной код

Выходной код должен выглядеть как код на Си. Стандарт описан. Что не так?

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

код разбора, FORMAT на выходе.

Парсить S-выражение? Не проще ли обрабатывать уже распарсенное ридером AST? А для этого вроде есть макросы. Я неправ?

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

вернее, «лисповые макросы как раз и предназначенны именно для этого: для манипуляцией AST»

Ndulu
() автор топика

«программа на лиспе напишет программу на Си/Фортране/whatever»

Lisp в качестве whatever подойдет?

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

Lisp в качестве whatever подойдет?

Нет.
Можете ответить по исходной задаче?

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

А для этого вроде есть макросы. Я неправ?

Неа, не прав. Макрос - это для создания новой семантику внутри лиспа. Для парсинга и трансляции тебе надо сделать (quote s-expr) и передать это в свою my-super-translate-func. Макрос тут можно применить для автоматического цитирования s-expr, дропа результата трансляции в файл и т.п. вспомогательных телодвижений.

Norgat ★★★★★
()

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

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

Вы можете ответить на задачу?

Я много чего могу, но я не уверен что я точно понимаю твою задачу и что ты понимаешь о чем спрашиваешь.

Есть математическая модель, заданная на лиспе. Надо при помощи лиспа перевести эту модель в исходный код на другом языке.

Это именно код на лиспе? Или нечто в скобках от фонаря? Если просто код то ECL сможет сделать из этого C-код и скормить его С-компилятору. Это если просто собрать.

Выходной код должен выглядеть как код на Си. Стандарт описан. Что не так?

мм... Есть принципиальная разница между получить С-код по стандарту и получиь человекочитаемый С-код с точки зрения конкретного читателя.

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

Неа, не прав. Макрос - это для создания новой семантику внутри лиспа. Для парсинга и трансляции тебе надо сделать (quote s-expr) и передать это в свою my-super-translate-func.

А если транслировать надо не s-expr, а существующую лисп-функцию?

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

s-expr и есть готовый AST, в этом вся прелесть и кроется.

Norgat ★★★★★
()

в строку «sin(x*x+1)»?

Ты упоролся? А потом компилятор C распарсит её обратно в дерево (sin (+ (* x x) 1)? Лучше сразу писать на Лиспе :-P

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

А если транслировать надо не s-expr, а существующую лисп-функцию?

Если своя - то код у тебя есть, если чужая - я не знаю, в лиспе сильно не копался, идеи, где его можно применить есть, времени нету :(

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

Парсить S-выражение? Не проще ли обрабатывать уже распарсенное ридером AST?

Разбор не означает именно ковыряние в тектовом представлении скобок, скорее в сивольно-cons-овом.

Ты честно скажи тебе решение нужно как стунденту для препода, что б заработало и препод отвязался или по делу?

А для этого вроде есть макросы. Я неправ?

Ты про небоскребы из дуба в интернетах читал?

Скажем так не совем, проблема несколько шире. или уже.

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

Я много чего могу, но я не уверен что я точно понимаю твою задачу

Ну, сейчас постараюсь получше донести. Я был уверен, что описал задачу проще некуда.

и что ты понимаешь о чем спрашиваешь.

Я-то понимаю, не сомневайтесь.

Это именно код на лиспе?

Да, это код на лиспе. Пример я приводил. Функция от одной (или нескольких) переменных, ограничивающаяся арифметикой, работой с массивами и <math.h>.

Или нечто в скобках от фонаря?

Нет, не нечто в скобках от фонаря.

Если просто код то ECL сможет сделать из этого C-код и скормить его С-компилятору.

Я не хочу затачиваться под конкретную имплементацию CL. Я хочу уметь это делать самостоятельно. К тому же, в перспективе может потребоваться не просто С-код, а с vendor-specific расширениями. Такого ECL точно не сгенерирует.

Есть принципиальная разница между получить С-код по стандарту и получиь человекочитаемый С-код с точки зрения конкретного читателя.

Нужен С-код по стандарту. Человекочитаемый С-код с точки зрения конкретного читателя не нужен.

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

Окей, в любом случае спасибо за инфу :)

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

А если транслировать надо не s-expr, а существующую лисп-функцию?

Если ты не хочшь выковыривать машкод или ассемблер (что в принципе возможно) то за исключенем ECL (и ему подобных предшествеников) никак.

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

А так если брать CL, посмотри на ECL. Он что-то такое и делает.

Кстати, а не подскажешь, никто не озадачивался написанием транслятором CL\Other Lisp -> CUDA C?

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

Пожалуйста, если не можете ответить по задаче

Генерация кода на С с помощью CL ничем не отличается от генерация кода на C с помощью Python. Вот и весь ответ.

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

Функция от одной (или нескольких) переменных, ограничивающаяся арифметикой, работой с массивами и <math.h>

В таком объеме некоторое количество строк кода и все или ты хочешь что бы за тебя написали? Или я тебя не понимаю.

Я хочу уметь это делать самостоятельно

Что мешает это сделать? незнание лиспа?

не просто С-код, а с vendor-specific расширениями. Такого ECL точно не сгенерирует.

ECL также умет «сырой» код на C. Это я так слову.

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

Если ты не хочшь выковыривать машкод или ассемблер (что в принципе возможно) то за исключенем ECL (и ему подобных предшествеников) никак.

Даже если функция определена defun'ом где-то в другой части моей программы? Ситуация именно такая.

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

Спасибо, кажется то, что нужно, нашёл этот проект на гитхабе, гляну, когда время свободное будет)

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

Генерация кода на С с помощью CL ничем не отличается от генерация кода на C с помощью Python. Вот и весь ответ.

Т.е. лисп в этом смысле ничем не лучше Питона? Но почему? Ведь в лиспе можно сразу оперировать AST-деревом. А в питоне надо будет парсить питоном питоновское выражение. Разве это проще?

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

Даже если функция определена defun'ом где-то в другой части моей программы? Ситуация именно такая.

Если этот defun писал ты, то есть смысл перехватывать это определение. Как вопос технический, зависит от твоего понимания CL. Или ты реверсишь кем-то написаный код без исходников?

antares0 ★★★★
()

лисп не предназначен для крутых вычислений

4.2, например, реализация больших чисел в Gambit Scheme долгое время была самой быстрой в мире (до тех пор, пока libgmp не допилили до лучшей производительности).

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

В таком объеме некоторое количество строк кода и все или ты хочешь что бы за тебя написали?

Не распарсил. Не потрудитесь ли излагать свои мысли понятнее? У меня есть некоторое количество функций, написанных на лиспе. Математическая модель. Они все ограничиваются работой с векторами, арифметикой и математическими функциями (sin, cos, exp, log и так далее). Третий раз уже объясняю. Все они определены в моей программе defun'ами. Я хочу при помощи лиспа же оттранслировать их в аналогичный C-код. Больше ничего.

Что мешает это сделать? незнание лиспа?

Я думал, что здесь есть люди, более продвинутые в лиспе, чем я, и что у них мой простенький примерчик получится быстрее чем у меня. Но, похоже, был неправ. :(

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

Ведь в лиспе можно сразу оперировать AST-деревом.

Под AST-деревом в контексте лиспа обычно подразумевается тупо список из символов, строк, чисел. Точно такой же список можно получить и в Python, за тем исключением, что там нет такого типа данных, как «символ», но его легко определить самостоятельно.

А в питоне надо будет парсить питоном питоновское выражение.

Какая разница? Если хочешь, то можешь парсить на Python и s-выражения. Или просто взять http://docs.python.org/library/ast.html и вперёд.

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

у них мой простенький примерчик получится быстрее чем у меня.

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

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

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

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

А теперь понятно. Так бы сразу. Можно ненаучно затенить defun, sin и.т.д пакетным shadow. И набросать трансляторы в с-кодные аналоги.

и что у них мой простенький примерчик получится быстрее чем у меня

Вечером в пятницу. Не мне спать. спать.

Если в пн. еще будет надо постучи по теме.

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

Спасибо, спокойной ночи :) Идею понял. По результатам напишу.

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

Пойми, что ты просишь за тебя написать комплиятор лиспа в C.

А что, неужели это так сложно? К тому же не всего лиспа, а очень узкого подмножества.
Просто у меня сложилось впечатление (по результатам чтения тредов в /development/), что для местных гуру это раз плюнуть. Выходит, что это не совсем так. Увы.

Ndulu
() автор топика

Чё за бред?

В sbcl вообще VOP'ы хоть на ассемблере пиши, так там и сделан какой-то пакет для линейной алгебры.

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

Это по поводу «язык не для вычислений», ясное дело. По остальному ничего не скажу - не занимаюсь такой фигней

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

Просто у меня сложилось впечатление (по результатам чтения тредов в /development/), что для местных гуру это раз плюнуть. Выходит, что это не совсем так. Увы.

У местных гуру семьи, дети, работа. Писать тупой код ради мотивации какого-то мутного типа они не будут.

Местные гуру вообще что-то расползлись...

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

У местных гуру семьи, дети, работа. Писать тупой код ради мотивации какого-то мутного типа они не будут.

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

Местные гуру вообще что-то расползлись...

Да, вот это уже более похоже на истину. :(

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

В sbcl вообще VOP'ы хоть на ассемблере пиши, так там и сделан какой-то пакет для линейной алгебры.

И как он по сравнению с MKL?

По остальному ничего не скажу - не занимаюсь такой фигней

Ну, если для вас задача кодогенерации для использования лиспа в HPC - фигня, то мы вряд ли сможем понять друг друга

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

Арчимаг тут, ты тут, ловсанчик, Dmitry_Vk. Кто тама ещё? Пойду щас распечатаю список и повешу на стену для красоты

Кстати, я не ошибаюсь, что CFFI groveler как раз только и делает, что кодогенерирует, ТС, посмотри его

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

Кстати, я не ошибаюсь, что CFFI groveler как раз только и делает, что кодогенерирует, ТС, посмотри его

Спасибо, посмотрю.

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