Передача функции через строку

Модератор: Модераторы разделов

Аватара пользователя
/dev/random
Администратор
Сообщения: 5457
ОС: Gentoo

Re: Передача функции через строку

Сообщение /dev/random »

RasenHerz писал(а):
03.04.2009 02:37
проще уж организовать пайп с каким-нибудь интерпретатором (можно взять Python) и передать эту строку ему, получить и обработать результат.

Проще взять что-то вроде Lua, интерпретатор которого является _библиотекой_. И никаких пайпов не надо.
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

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

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

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

перед переходом в асм вставку записываваем адрес ячейки памяти, а последняя команда в строке jmp адрес+1 (образно т.к. будет разница при работе с 16,32,64 системами)
регистры нужно будет сохранить
А что хоть одна прога на асме работающая с регистрами обходится без этого??
Проще взять что-то вроде Lua, интерпретатор которого является _библиотекой_. И никаких пайпов не надо.

Респект!! Действительно хороший вариант, это позволит легко расширять функционал программы, в отличии от самодельного интерпритатора на си, который я собственно сейчас и пишу..
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Передача функции через строку

Сообщение serzh-z »

AsMasteR писал(а):
03.04.2009 13:54
Респект!! Действительно хороший вариант, это позволит легко расширять функционал программы, в отличии от самодельного интерпритатора на си, который я собственно сейчас и пишу..
Эээ... Стоит всё же определиться. Передача функции через строку
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Передача функции через строку

Сообщение RasenHerz »

что-то я тоже не пойму чего надо автору - то его не устраивает использование интерпретаторов(а LUA - интерпретируемый язык), то он радуется совету их использовать.
в общем, AsMasteR, определитесь чего вам надо.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Передача функции через строку

Сообщение drBatty »

AsMasteR писал(а):
02.04.2009 18:13
Дональда Кнута давно уже читал, было помню.. дык там алгоритмы, а алгоритм я вроде вверху написал, мне синтаксис нужен. А K&R не что иное как спецификация (если ошибаюсь, прошу прощенья)..
Нет, я конечно могу ассемблерную вставку сделать, но неудобно будет.

классическая задача, K&R это конечно описание языка, но эта задача там как пример(вроде-бы)
реализация проста - строится дерево, например (a + b) * c
----*
---/--\
--+---c
-/--\
a---b

ну и обходите его по всякому(в зависимости от обхода будет и прямая, и обратная нотация)
обходить можно функциями, узлы хранить в структурах.. В общем классика. В самом языке Си такого нет, в х86 ассемблере - тоже. Про Java не знаю.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Передача функции через строку

Сообщение drBatty »

AsMasteR писал(а):
03.04.2009 13:54
да я же сказал, это был мой вариант решения данной задачи.. я сформулировал алгоритм только чтобы показать, что это не бред..

хорошо. сделайте массив указателей на функции(каждая функция - действие(умножение, сложение), или число(переменная).
далее

Код: Выделить всё

for(;;)
{
 f = *a++;//получаем указатель на текущую функцию
 if(!f) break;//если это NULL, то расчёт закончен
 f();//выполняем текущий оператор
}

операторы между действиями нужно хранить в стеке.
к примеру (a + b) * с
a ------- push()
b ------- push()
+ ------- sum()
c ------- push()
* ------- mul()

надеюсь идея понятна

в отличие от вышеперечисленного это С, а не что-то другое.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

RasenHerz писал(а):
03.04.2009 22:11
что-то я тоже не пойму чего надо автору - то его не устраивает использование интерпретаторов(а LUA - интерпретируемый язык), то он радуется совету их использовать.
в общем, AsMasteR, определитесь чего вам надо.

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


в отличие от вышеперечисленного это С, а не что-то другое.

идея хорошая. что то подобное делал, когда пытался писать свою ос(в итоге увидел, что все мои идеи уже реализовал Линус :laugh: )..
системные функции работать будут быстрее, чем просто си. только увы программа потеряет свою наглядность, а на этапе проектирования архетектуры программы, нужна наглядность. Когда алгоритм программы будет окончательно разработан и протестирован, скорее всего прибегну к этому методу. (А именно буду испоьзовать системные функции)
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

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

А одно другому мешает? Кажется kamre и я упоминали, что можно строить дерево вычислений на основе выражения, записанного налядным образом. А затем считать быстро, не разбирая строк. Таким образом исходные данные - нагляды, вычисления - быстрые. Затраты на написание + отладку - 3 чел*часов, если не отвлекаться особо, 1 чел*день, если в релаксе.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Передача функции через строку

Сообщение drBatty »

AsMasteR писал(а):
04.04.2009 09:16
системные функции работать будут быстрее, чем просто си.
почему системные? я про ваши функции. идея следующая:
разбиваем строку на кусочки, строим дерево. потом обходим дерево, причём каждый терм записываем в линейный массив. а потом этот массив "выполняем", точнее выполняем каждый терм из массива
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

почему системные? я про ваши функции

а похоже на системную интерпритацию аппаратных прерываний..
"выполняем"
не совсем понятно как здесь работает команда push() при том, что а в с переменные, а не константы..
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5457
ОС: Gentoo

Re: Передача функции через строку

Сообщение /dev/random »

AsMasteR писал(а):
04.04.2009 09:16
Скорость работы (не смотря на то что разработчики заявляют, что это самый быстрый инт. язык ) оставляет желать лучшего..

С точки зрения скорости _выполнения_ это действительно самый быстрый интерпретируемый не-JIT язык, но немаленькое время уходит на конвертацию скрипта в байткод. Поэтому, если возможно, это стоит сделать один раз, а потом вызывать уже сконвертированную функцию (если, конечно, у вас одна и та же функция вызывается несколько раз).
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Передача функции через строку

Сообщение frp »

Синтаксический анализатор можно написать на голом C или C++ за десять минут. Если что, то могу скинуть код с комментариями.
Спасибо сказали:
Serg79
Сообщения: 153

Re: Передача функции через строку

Сообщение Serg79 »

frp писал(а):
04.04.2009 22:56
Синтаксический анализатор можно написать на голом C или C++ за десять минут. Если что, то могу скинуть код с комментариями.

Ты его к своему посту прикрепи в виде архива, может кому понадобиться.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Передача функции через строку

Сообщение RasenHerz »

AsMasteR, советую обратить внимание на QScript - скорость работы на достойном уровне, отсутствует типизация переменных, к плюсам можно отнести чрезвычайную простоту использования.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Передача функции через строку

Сообщение drBatty »

AsMasteR писал(а):
04.04.2009 18:15
а похоже на системную интерпритацию аппаратных прерываний..
"выполняем"
читаем очередной указатель на функцию, и вызываем эту функцию(никаких прерываний, железа и системы!)
для каждого действия своя функция(умножение, сложение, и т.д.)


AsMasteR писал(а):
04.04.2009 18:15
не совсем понятно как здесь работает команда push() при том, что а в с переменные, а не константы..
вот тут от задачи зависит. можно просто затолкать формулу в дерево, затем развернуть в массив и "выполнить", а можно поступить иначе, преобразовать дерево. например:
X * 0

---*------------0
-/---\---- =>
X---0

ну и многие другие правила(штук 5), тогда мы упростим формулу, и будем по неё быстрее считать. (хотя дольше преобразовывать).
и push() в данном случае будет работать по разному, если мы берём простой метод, без упрощения, то на этапе выполнения, константа 7 и переменная X равная 7 эквивалентны(X псевдоним 7), а если мы упрощаем, то заталкиваемое X в стек может быть не только константой, но и функцией(той-же самой, только рекурсивной). Вобщем задачка вовсе не на 5 минут, это видно хотя-бы по числу принципиально разных решений в этой теме. Самое смешное, что тут нет лучшего, они все хороши, каждый в своём случае.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

Вот переписал по-быстрому. Почти не тестил, так что отсутствие ошибок не гарантирую.

PS там и дерево строится, для дерево исходный парсер уже не нужен, вызывать обсчет дерева можно сколько угодно раз, переменные хранятся по указателям. дерево не оптимизируется - как написано, такое и строит.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Передача функции через строку

Сообщение RasenHerz »

NickLion писал(а):
05.04.2009 21:01
Вот переписал по-быстрому. Почти не тестил, так что отсутствие ошибок не гарантирую.

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

а можно архив не .rar? лучше .tab.gz или .tar.bz2 .
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

Вообще-то, это 7z, но он не прикрепляется, посему добавляю .rar в конец имени :)
Спасибо сказали:
Serg79
Сообщения: 153

Re: Передача функции через строку

Сообщение Serg79 »

NickLion писал(а):
05.04.2009 21:01
Вот переписал по-быстрому. Почти не тестил, так что отсутствие ошибок не гарантирую.

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

А какие выражения может вычислять данный код?
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Передача функции через строку

Сообщение Женя Подсыпальников »

NickLion писал(а):
02.04.2009 18:55
AsMasteR писал(а):
02.04.2009 18:47
MiK13 писал(а):
02.04.2009 18:36
А что может дать ассемблерная вставка такого, что не позволит сделать сам си?

возможность выполнять динамический код

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


О... Это всегда интересно - обойтись безо интерпретаторовых... :)

Коли есть Редактор твоего приложения (процесс 1) -
можно даже скомпилить неки функции (формулы) в неку библиотеку их -
для Исполнения твоего приложения (процесс 2),

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

А в Исполнении - пусть будет функция обращения к редактированным и компилированным формулам -
по имени ли индексу... Некоторые процесс или функция, ведь, умеют возвращать ответы.

Одним из безопасных примеров -
является техника позднего связывания в СОМ, например, конечно...

А шобы не крякало попусту - поместить замес в try{...} - всегда хорошо :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Передача функции через строку

Сообщение RasenHerz »

Женя Подсыпальников писал(а):
06.04.2009 11:28
О... Это всегда интересно - обойтись безо интерпретаторовых... :)

Коли есть Редактор твоего приложения (процесс 1) -
можно даже скомпилить неки функции (формулы) в неку библиотеку их -
для Исполнения твоего приложения (процесс 2),

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

А в Исполнении - пусть будет функция обращения к редактированным и компилированным формулам -
по имени ли индексу... Некоторые процесс или функция, ведь, умеют возвращать ответы.

Одним из безопасных примеров -
является техника позднего связывания в СОМ, например, конечно...

А шобы не крякало попусту - поместить замес в try{...} - всегда хорошо :)


чего уж мелочиться, давайте напишем виртуальную машину считающую формулы...
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

Serg79 писал(а):
06.04.2009 08:50
А какие выражения может вычислять данный код?

Бинарные + - * / ^ (степень), унарные + -, круглые скобки, функции - любые :) уже прописаны - стандартные математические (sqrt, pow, ln, lg, sin, cos, tg, ctg, ... ).

Женя Подсыпальников писал(а):
06.04.2009 11:28
О... Это всегда интересно - обойтись безо интерпретаторовых... :)
(skipped)
Одним из безопасных примеров -
является техника позднего связывания в СОМ, например, конечно...

А шобы не крякало попусту - поместить замес в try{...} - всегда хорошо :)


COM построено на технологии виртуалных вызовов, а не динамической компиляции. А try от доступа по левому, но корректному адресу не спасет. В общем такое использовать - в крайнем случае, для особо критичных мест. А еще лучше сделать так, чтобы такого не требовалось.
PS если Вы про динамически подключаему библиотеку, а не динамический код, то извините :) Я не против динамически подключаемых либ (в настройках имя либы+имя функции), но против динамического кода (допустимо как антиотладочный прием, полиморфный движок, но не в данном случае).
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Передача функции через строку

Сообщение kamre »

RasenHerz писал(а):
06.04.2009 17:28
чего уж мелочиться, давайте напишем виртуальную машину считающую формулы...

Так уже есть такие виртуальные машины :)
Вот пример на .NET, считающий формулы: Частые вычисления по неопределенной формуле!!!
И он уделал пример на C++ в 20 раз :) А все потому, что на C++ формулы считались интерпретатором (вроде того, что выше предлагали), а в .NET варианте свое дело сделал JIT компилятор, получился native code, и уже он вычислял значения формулы. И все это в runtime.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Передача функции через строку

Сообщение serzh-z »

kamre писал(а):
06.04.2009 21:51
Вот пример на .NET, считающий формулы: Частые вычисления по неопределенной формуле!!!
Уж не знаю в каких попугаях считают на RSDN, но последние лет пять у них всегда и во всём C# и .NET уделывает любые другие языки и платформы... Не смотря на это уделывание, их шарповым клиентом RSDN@Home, ещё во времена начала эпохи уделывания, я так пользоваться и не смог, по причине его МЕГАтормознутости, по сравнению со всеми другими приложениями, включая веб-браузеры.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Передача функции через строку

Сообщение RasenHerz »

kamre писал(а):
06.04.2009 21:51
RasenHerz писал(а):
06.04.2009 17:28
чего уж мелочиться, давайте напишем виртуальную машину считающую формулы...

Так уже есть такие виртуальные машины :)
Вот пример на .NET, считающий формулы: Частые вычисления по неопределенной формуле!!!
И он уделал пример на C++ в 20 раз :) А все потому, что на C++ формулы считались интерпретатором (вроде того, что выше предлагали), а в .NET варианте свое дело сделал JIT компилятор, получился native code, и уже он вычислял значения формулы. И все это в runtime.

в этом ничего удивительного - интерпретирование всегда медленнее чем JIT-компиляция. думаю, если бы вычисления производились с помощью Java, то они были бы быстрее .NET'овских раз в 20 =)))
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Передача функции через строку

Сообщение Женя Подсыпальников »

NickLion писал(а):
06.04.2009 19:37
А еще лучше сделать так, чтобы такого не требовалось.


Еслив я клиент библиотеки формул
некоторого свободного написания их кода,

то кто-то-сь - наверняка знает, "как оно там всё сделано"... :)
Пойдём на рыбалку !
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

Женя Подсыпальников писал(а):
07.04.2009 10:08
Еслив я клиент библиотеки формул
некоторого свободного написания их кода,

то кто-то-сь - наверняка знает, "как оно там всё сделано"... :)

Извините, но можно на русском это же сказать? Или на украинском, английском ;) ?
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Передача функции через строку

Сообщение Женя Подсыпальников »

NickLion писал(а):
08.04.2009 11:22
Извините, но можно на русском это же сказать? Или на украинском, английском ;) ?


Простите... :)
(Оно - просто,) попробую ещё так:

динамически подгружаемый код формулы
мог быть скомпилирован (раз он существует),

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

Вот почему - я бы запускал такой код в try{..} :)
Пойдём на рыбалку !
Спасибо сказали: