Проще взять что-то вроде Lua, интерпретатор которого является _библиотекой_. И никаких пайпов не надо.
Передача функции через строку
Модератор: Модераторы разделов
-
/dev/random
- Администратор
- Сообщения: 5457
- ОС: Gentoo
Re: Передача функции через строку
Проще взять что-то вроде Lua, интерпретатор которого является _библиотекой_. И никаких пайпов не надо.
Спасибо сказали:
-
AsMasteR
- Сообщения: 93
- ОС: GNU/Linux Ubuntu 9.04
Re: Передача функции через строку
но если вам неймется, вы не боитесь трудностей, вам не жалко собственные нервы - пишите все с использованием асма.
да я же сказал, это был мой вариант решения данной задачи.. я сформулировал алгоритм только чтобы показать, что это не бред..
мало того, что вам придется анализировать строку на количество в ней чисел, потом расчитывать количество необходимого объма памяти для всех неопходимых ассемблерных команд,
расчитывать не прейдётся, я планировал резирвировать для этих целей строку фиксированной длины, а место после рабочих команд занупить,
предварительно позаботившись о способе возвращения из шелла итогового значения,
перед переходом в асм вставку записываваем адрес ячейки памяти, а последняя команда в строке jmp адрес+1 (образно т.к. будет разница при работе с 16,32,64 системами)
А что хоть одна прога на асме работающая с регистрами обходится без этого??регистры нужно будет сохранить
Проще взять что-то вроде Lua, интерпретатор которого является _библиотекой_. И никаких пайпов не надо.
Респект!! Действительно хороший вариант, это позволит легко расширять функционал программы, в отличии от самодельного интерпритатора на си, который я собственно сейчас и пишу..
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Передача функции через строку
Эээ... Стоит всё же определиться. Передача функции через строку
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача функции через строку
что-то я тоже не пойму чего надо автору - то его не устраивает использование интерпретаторов(а LUA - интерпретируемый язык), то он радуется совету их использовать.
в общем, AsMasteR, определитесь чего вам надо.
в общем, AsMasteR, определитесь чего вам надо.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Передача функции через строку
классическая задача, K&R это конечно описание языка, но эта задача там как пример(вроде-бы)
реализация проста - строится дерево, например (a + b) * c
----*
---/--\
--+---c
-/--\
a---b
ну и обходите его по всякому(в зависимости от обхода будет и прямая, и обратная нотация)
обходить можно функциями, узлы хранить в структурах.. В общем классика. В самом языке Си такого нет, в х86 ассемблере - тоже. Про Java не знаю.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Передача функции через строку
хорошо. сделайте массив указателей на функции(каждая функция - действие(умножение, сложение), или число(переменная).
далее
Код: Выделить всё
for(;;)
{
f = *a++;//получаем указатель на текущую функцию
if(!f) break;//если это NULL, то расчёт закончен
f();//выполняем текущий оператор
}операторы между действиями нужно хранить в стеке.
к примеру (a + b) * с
a ------- push()
b ------- push()
+ ------- sum()
c ------- push()
* ------- mul()
надеюсь идея понятна
в отличие от вышеперечисленного это С, а не что-то другое.
Спасибо сказали:
-
AsMasteR
- Сообщения: 93
- ОС: GNU/Linux Ubuntu 9.04
Re: Передача функции через строку
Да, по этому поводу у меня сомнения. Действительно я не хотел прибегать к интерпритаторам, и возможно в последствии вынужден буду отказаться от этой идеи.. Но простота этого метода позволит выстроить красивую модель программы в целом. Вчера прочитал спецификацию луа. Некоторые моменты в спецификации языка меня неустраивают (В частности работа оператора # и отсутствие типизации при объявлении..) но это поправимо. Скорость работы (не смотря на то что разработчики заявляют, что это самый быстрый инт. язык ) оставляет желать лучшего.. Но(!) самореализация интерпритатора под си, будет работать ещё медленнее(опять же со слов на форуме Луа).
в отличие от вышеперечисленного это С, а не что-то другое.
идея хорошая. что то подобное делал, когда пытался писать свою ос(в итоге увидел, что все мои идеи уже реализовал Линус
системные функции работать будут быстрее, чем просто си. только увы программа потеряет свою наглядность, а на этапе проектирования архетектуры программы, нужна наглядность. Когда алгоритм программы будет окончательно разработан и протестирован, скорее всего прибегну к этому методу. (А именно буду испоьзовать системные функции)
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Передача функции через строку
системные функции работать будут быстрее, чем просто си. только увы программа потеряет свою наглядность, а на этапе проектирования архетектуры программы, нужна наглядность. Когда алгоритм программы будет окончательно разработан и протестирован, скорее всего прибегну к этому методу.
А одно другому мешает? Кажется kamre и я упоминали, что можно строить дерево вычислений на основе выражения, записанного налядным образом. А затем считать быстро, не разбирая строк. Таким образом исходные данные - нагляды, вычисления - быстрые. Затраты на написание + отладку - 3 чел*часов, если не отвлекаться особо, 1 чел*день, если в релаксе.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Передача функции через строку
почему системные? я про ваши функции. идея следующая:
разбиваем строку на кусочки, строим дерево. потом обходим дерево, причём каждый терм записываем в линейный массив. а потом этот массив "выполняем", точнее выполняем каждый терм из массива
-
AsMasteR
- Сообщения: 93
- ОС: GNU/Linux Ubuntu 9.04
Re: Передача функции через строку
почему системные? я про ваши функции
а похоже на системную интерпритацию аппаратных прерываний..
"выполняем"
не совсем понятно как здесь работает команда push() при том, что а в с переменные, а не константы..
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
-
/dev/random
- Администратор
- Сообщения: 5457
- ОС: Gentoo
Re: Передача функции через строку
С точки зрения скорости _выполнения_ это действительно самый быстрый интерпретируемый не-JIT язык, но немаленькое время уходит на конвертацию скрипта в байткод. Поэтому, если возможно, это стоит сделать один раз, а потом вызывать уже сконвертированную функцию (если, конечно, у вас одна и та же функция вызывается несколько раз).
-
frp
- Сообщения: 1445
- ОС: Debian Squeeze
Re: Передача функции через строку
Синтаксический анализатор можно написать на голом C или C++ за десять минут. Если что, то могу скинуть код с комментариями.
-
Serg79
- Сообщения: 153
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача функции через строку
AsMasteR, советую обратить внимание на QScript - скорость работы на достойном уровне, отсутствует типизация переменных, к плюсам можно отнести чрезвычайную простоту использования.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Передача функции через строку
читаем очередной указатель на функцию, и вызываем эту функцию(никаких прерываний, железа и системы!)
для каждого действия своя функция(умножение, сложение, и т.д.)
вот тут от задачи зависит. можно просто затолкать формулу в дерево, затем развернуть в массив и "выполнить", а можно поступить иначе, преобразовать дерево. например:
X * 0
---*------------0
-/---\---- =>
X---0
ну и многие другие правила(штук 5), тогда мы упростим формулу, и будем по неё быстрее считать. (хотя дольше преобразовывать).
и push() в данном случае будет работать по разному, если мы берём простой метод, без упрощения, то на этапе выполнения, константа 7 и переменная X равная 7 эквивалентны(X псевдоним 7), а если мы упрощаем, то заталкиваемое X в стек может быть не только константой, но и функцией(той-же самой, только рекурсивной). Вобщем задачка вовсе не на 5 минут, это видно хотя-бы по числу принципиально разных решений в этой теме. Самое смешное, что тут нет лучшего, они все хороши, каждый в своём случае.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Передача функции через строку
Вот переписал по-быстрому. Почти не тестил, так что отсутствие ошибок не гарантирую.
PS там и дерево строится, для дерево исходный парсер уже не нужен, вызывать обсчет дерева можно сколько угодно раз, переменные хранятся по указателям. дерево не оптимизируется - как написано, такое и строит.
PS там и дерево строится, для дерево исходный парсер уже не нужен, вызывать обсчет дерева можно сколько угодно раз, переменные хранятся по указателям. дерево не оптимизируется - как написано, такое и строит.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача функции через строку
NickLion писал(а): ↑05.04.2009 21:01Вот переписал по-быстрому. Почти не тестил, так что отсутствие ошибок не гарантирую.
PS там и дерево строится, для дерево исходный парсер уже не нужен, вызывать обсчет дерева можно сколько угодно раз, переменные хранятся по указателям. дерево не оптимизируется - как написано, такое и строит.
а можно архив не .rar? лучше .tab.gz или .tar.bz2 .
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Передача функции через строку
Вообще-то, это 7z, но он не прикрепляется, посему добавляю .rar в конец имени 
-
Serg79
- Сообщения: 153
Re: Передача функции через строку
NickLion писал(а): ↑05.04.2009 21:01Вот переписал по-быстрому. Почти не тестил, так что отсутствие ошибок не гарантирую.
PS там и дерево строится, для дерево исходный парсер уже не нужен, вызывать обсчет дерева можно сколько угодно раз, переменные хранятся по указателям. дерево не оптимизируется - как написано, такое и строит.
А какие выражения может вычислять данный код?
-
Женя Подсыпальников
- Сообщения: 482
Re: Передача функции через строку
О... Это всегда интересно - обойтись безо интерпретаторовых...
Коли есть Редактор твоего приложения (процесс 1) -
можно даже скомпилить неки функции (формулы) в неку библиотеку их -
для Исполнения твоего приложения (процесс 2),
подобно тому, как это бывает в некоторых известных продуктах,
запускающих некоторый компилятор (к примеру, редактор Анюта) -
для других, использующих компилят (к примеру, строка консоли, запускающаяя процесс с параметрами) ...
А в Исполнении - пусть будет функция обращения к редактированным и компилированным формулам -
по имени ли индексу... Некоторые процесс или функция, ведь, умеют возвращать ответы.
Одним из безопасных примеров -
является техника позднего связывания в СОМ, например, конечно...
А шобы не крякало попусту - поместить замес в try{...} - всегда хорошо
Пойдём на рыбалку !
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача функции через строку
Женя Подсыпальников писал(а): ↑06.04.2009 11:28О... Это всегда интересно - обойтись безо интерпретаторовых...
Коли есть Редактор твоего приложения (процесс 1) -
можно даже скомпилить неки функции (формулы) в неку библиотеку их -
для Исполнения твоего приложения (процесс 2),
подобно тому, как это бывает в некоторых известных продуктах,
запускающих некоторый компилятор (к примеру, редактор Анюта) -
для других, использующих компилят (к примеру, строка консоли, запускающаяя процесс с параметрами) ...
А в Исполнении - пусть будет функция обращения к редактированным и компилированным формулам -
по имени ли индексу... Некоторые процесс или функция, ведь, умеют возвращать ответы.
Одним из безопасных примеров -
является техника позднего связывания в СОМ, например, конечно...
А шобы не крякало попусту - поместить замес в try{...} - всегда хорошо
чего уж мелочиться, давайте напишем виртуальную машину считающую формулы...
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Передача функции через строку
Бинарные + - * / ^ (степень), унарные + -, круглые скобки, функции - любые
Женя Подсыпальников писал(а): ↑06.04.2009 11:28О... Это всегда интересно - обойтись безо интерпретаторовых...
(skipped)
Одним из безопасных примеров -
является техника позднего связывания в СОМ, например, конечно...
А шобы не крякало попусту - поместить замес в try{...} - всегда хорошо
COM построено на технологии виртуалных вызовов, а не динамической компиляции. А try от доступа по левому, но корректному адресу не спасет. В общем такое использовать - в крайнем случае, для особо критичных мест. А еще лучше сделать так, чтобы такого не требовалось.
PS если Вы про динамически подключаему библиотеку, а не динамический код, то извините
-
kamre
- Сообщения: 243
- ОС: Win7/Ubuntu 11.10
Re: Передача функции через строку
Так уже есть такие виртуальные машины
Вот пример на .NET, считающий формулы: Частые вычисления по неопределенной формуле!!!
И он уделал пример на C++ в 20 раз
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Передача функции через строку
Уж не знаю в каких попугаях считают на RSDN, но последние лет пять у них всегда и во всём C# и .NET уделывает любые другие языки и платформы... Не смотря на это уделывание, их шарповым клиентом RSDN@Home, ещё во времена начала эпохи уделывания, я так пользоваться и не смог, по причине его МЕГАтормознутости, по сравнению со всеми другими приложениями, включая веб-браузеры.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача функции через строку
kamre писал(а): ↑06.04.2009 21:51
Так уже есть такие виртуальные машины![]()
Вот пример на .NET, считающий формулы: Частые вычисления по неопределенной формуле!!!
И он уделал пример на C++ в 20 разА все потому, что на C++ формулы считались интерпретатором (вроде того, что выше предлагали), а в .NET варианте свое дело сделал JIT компилятор, получился native code, и уже он вычислял значения формулы. И все это в runtime.
в этом ничего удивительного - интерпретирование всегда медленнее чем JIT-компиляция. думаю, если бы вычисления производились с помощью Java, то они были бы быстрее .NET'овских раз в 20 =)))
-
Женя Подсыпальников
- Сообщения: 482
Re: Передача функции через строку
Еслив я клиент библиотеки формул
некоторого свободного написания их кода,
то кто-то-сь - наверняка знает, "как оно там всё сделано"...
Пойдём на рыбалку !
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Передача функции через строку
Женя Подсыпальников писал(а): ↑07.04.2009 10:08Еслив я клиент библиотеки формул
некоторого свободного написания их кода,
то кто-то-сь - наверняка знает, "как оно там всё сделано"...
Извините, но можно на русском это же сказать? Или на украинском, английском
-
Женя Подсыпальников
- Сообщения: 482
Re: Передача функции через строку
Простите...
(Оно - просто,) попробую ещё так:
динамически подгружаемый код формулы
мог быть скомпилирован (раз он существует),
но текст формулы к компиляции делан, возможно, не мною...
Вот почему - я бы запускал такой код в try{..}
Пойдём на рыбалку !