| Цитата(Shadowlord @ 10.6.2009, 08:02) | | xvr, можно чуть по подробней про средний метод |
Можно. Например, пользователь вводит функцию в файле в таком виде:
| Код | x,y,z x*x+3.123*pow(y,3)+z
|
Первая строка - список переменных, вторая - собственно формула Система генерит файл следующего содержания (wrap.cpp)
| Код | #include <math.h> extern "C" double user_func(double* _args) { // Эта часть генерится из описания переменных double x=_args[0]; double y=_args[1]; double z=_args[2]; // А это собственно вычисление return x*x+3.123*pow(y,3)+z; }
|
Далее вызывается компилятор, - VC: cl /LD wrap.cpp
- gcc: g++ -shared wrap.cpp -o wrap.so
- mingw: g++ -mdll wrap.cpp -o wrap.dll
Далее в своей программе полученная библиотека загружается и извлекается адрес функции user_func (см LoadLibrary, GetProcAddress для Windows, или dlopen,dlsym для Linux) Т.к. прототип функции известен и фиксирован, то ее можно вызвать одним и тем же способом, вне зависимости от того, что в нее напишет пользователь
kamre:
| Цитата | Почему интерпретатор (без всяких там JIT) самый сложный? Мне кажется это достаточно стандартная задачка, что-то вроде калькулятора.
|
Если есть готовый и скорость его работы устраивает, то милости просим А вот писать специально для этого свой собственный явно не стоит (если конечно ты не съел собаку на написании компиляторов, и способен написать еще один даже не просыпаясь )
| Цитата | А с генерацией файла, компиляцией и динамической загрузкой - это какой-то "извращенный" способ smile
|
Нормальный способ, некоторые умудряются даже коммерческие продукты так делать
| Цитата | Это ж компилятор с собой придется таскать.
|
Да. Пример - Xilinx, ISE (среда программирования для их FPGA/CPLD), ихний симулятор (симулирует программы на Verilog & VHDL). Бесплатная и коммерческая версия отличаются только файлом лицензии. Симулятор преобразует исходный код в программу на C++, и компилирует ее вместе со своими библиотеками в exe (gcc входит в состав дистрибутива ISE). Полученный exe запускают под оболочкой симулятора.
|