Форум программистов, компьютерный форум CyberForum.ru

Компиляция исходного кода в работающей программе - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:21     Компиляция исходного кода в работающей программе #1
Привет.

Подскажите, как можно скомпилировать код, и использовать полученный результат в запущенной программе, если этот самый код находится, в компоненте (memo, list итд - неважно) этой запущенной пргораммы.

Я нашел 1 вариант - это сохранение этого кода в файл и компиляция в отдельном процессе.
Это правильный вариант? и есть ли еще пути решения?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 16:21     Компиляция исходного кода в работающей программе
Посмотрите здесь:

Компиляция кода... не могу сообразить. C++
нет исходного кода C++
Исправить ошибку в программе, работающей с дробями C++
C++ Компиляция кода Freeglut
C++ Компиляция кода Source Engine 2013
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
07.07.2014, 16:35     Компиляция исходного кода в работающей программе #2
То есть вы хотите написать компилятор? С графической оболочкой, где Memo и так далее? То есть вы хотите написать среду разработки.
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
07.07.2014, 16:38     Компиляция исходного кода в работающей программе #3
Цитата Сообщение от vlinx Посмотреть сообщение
Это правильный вариант?
Это будет работать.
Цитата Сообщение от vlinx Посмотреть сообщение
Есть ли еще пути решения?
Интерпретация и JIT.
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:39  [ТС]     Компиляция исходного кода в работающей программе #4
SatanaXIII ,
не не, это мне не по силам.

я хочу не компилятор написать, а узнать способ выполнения кода (и использования его результата в программе) в работающем приложении.
Хотябы вариант, который я написал - возможен?
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
07.07.2014, 16:42     Компиляция исходного кода в работающей программе #5
vlinx, вполне возможен.
Если компилятор поддерживает функции встраивания, то можно использовать их. Например в Clang такое есть. Еще можно посмотреть сюда.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
07.07.2014, 16:43     Компиляция исходного кода в работающей программе #6
В приложении создаете процесс с вызовом компилятора и передачей ему посредством командной строки файла с текстом программы. Мыслится так
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:48  [ТС]     Компиляция исходного кода в работающей программе #7
Nick Alte, Интерпретация - это вариант с написанием своего компилятора так понимаю? тогда не подходит.

про JIT в с++ надо мне почитать, ничего про это не знаю

Добавлено через 56 секунд
Ilot, еще один момент - как в основную программу возвратить результат?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
07.07.2014, 16:52     Компиляция исходного кода в работающей программе #8
Цитата Сообщение от vlinx Посмотреть сообщение
Ilot, еще один момент - как в основную программу возвратить результат?
Ну так любая не void функция возвращает результат, верно?
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:54  [ТС]     Компиляция исходного кода в работающей программе #9
Ilot, да.
Ладно, надо попробовать - меньше вопросов будет)
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
07.07.2014, 17:05     Компиляция исходного кода в работающей программе #10
Цитата Сообщение от vlinx Посмотреть сообщение
Интерпретация - это вариант с написанием своего компилятора так понимаю?
Не обязательно. По моей ссылке есть пример как раз использования готового интерпретатора С.
JIT - это из той же оперы, только компиляция, а не интерпретация. У некоторых компиляторов есть инструментарий для встраивания в приложения. По сути это библиотеки, которые предоставляют набор API для организации процесса сборки.

Добавлено через 8 минут
Вот еще по ссылочка по теме.
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
07.07.2014, 17:07     Компиляция исходного кода в работающей программе #11
Цитата Сообщение от vlinx Посмотреть сообщение
Интерпретация - это вариант с написанием своего компилятора так понимаю?
Свой писать долго, лучше взять готовый. Такой вариант даёт наибольшую свободу.
По поводу JIT можно сказать, что это усиленный вариант интерпретации, когда вся программа или некоторые её фрагменты преобразуются в машинный код.

А если мы говорим об использовании решения с компилятором, то лучше всего встраивать введённый код в шаблон DLL, которую затем можно будет загружать и вызывать.
Renji
1535 / 983 / 241
Регистрация: 05.06.2014
Сообщений: 2,965
07.07.2014, 17:08     Компиляция исходного кода в работающей программе #12
Nick Alte, Интерпретация - это вариант с написанием своего компилятора так понимаю?
Только парсера. Программа сама разбирает текст, сама же его и исполняет. Код для процессора при этом не генерируется. Запуск кода скорее всего произойдет быстрее (не нужно гонять по нему оптимизаторы и прочую муть), но сам код будет тормознутее. Впрочем, не факт что вы это заметите (была миллисекунда, стало десять).

Ну и если идти этим путем, проще прикрутить интерпретатор Перла/Питона и не парить себе мозг.
nmcf
4326 / 3747 / 1262
Регистрация: 14.04.2014
Сообщений: 14,710
07.07.2014, 17:11     Компиляция исходного кода в работающей программе #13
А для чего это нужно? Может просто использовать иное решение?
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
07.07.2014, 17:14     Компиляция исходного кода в работающей программе #14
vlinx, Вот отличная статья на тему встраивания этого интерпретатора. Как раз показано как вернуть результат интерпретируемой функции в основную программу.
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 18:03  [ТС]     Компиляция исходного кода в работающей программе #15
Собрал предложенные варианты:

1) Создание процесса, и вызов компилирования строки(кода).
2) JIT
3) встраивать введённый код в шаблон DLL
4) Использование стороннего интерпретатора(Ch)

Поробовал 1) - но пока не получилось возвратить результат в программу.

Больше всего мне нравится 3).
Впринципе, делать dll и запускать их умею. Nick Alte, тут речь идет не про шаблоны c++? Если нет, то где почитать про процесс встраивания кода в шаблон dll?

Добавлено через 47 секунд
DrOffset, Ваш вариант попробую позже

Добавлено через 8 минут
@nmcf , хочу сделать некий генератор тестовых данных. Продумал систему классов, наследование, композиция и все такое. И вот один из типов(классов) генераторов будет - генерация по введенному пользователем алгоритму, который будет принимать в качестве параметра строку - код, и возвращать строку - значение.

Добавлено через 5 минут
Renji, с питоном пробовал, нормально. Теперь хочу сделать не с питоном
DrOffset
6462 / 3836 / 887
Регистрация: 30.01.2014
Сообщений: 6,631
07.07.2014, 18:18     Компиляция исходного кода в работающей программе #16
Цитата Сообщение от vlinx Посмотреть сообщение
но пока не получилось возвратить результат в программу.
Без специальных ухищрений и не получится (ну кроме целочисленного результата из main).

Если я правильно понял, то вариант 3) - это как раз модифицированный вариант 1). Компилятор вызывается, собирает код в dll, потом эта dll загружается в приложение и вызывается функция. Шаблон здесь конечно же не С++. Я думаю имелось в виду, что имена функций в dll и их сигнатура должны быть типовыми (т.е. строится по шаблону), иначе мы не будем знать что же нам вызывать в итоге.

Добавлено через 5 минут
А, и да. К четвертому варианту надо бы еще добавить и это. Там есть пример (main.cpp).
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
07.07.2014, 19:08     Компиляция исходного кода в работающей программе #17
Цитата Сообщение от vlinx Посмотреть сообщение
Если нет, то где почитать про процесс встраивания кода в шаблон dll?
Цитата Сообщение от DrOffset Посмотреть сообщение
Компилятор вызывается, собирает код в dll, потом эта dll загружается в приложение и вызывается функция. Шаблон здесь конечно же не С++. Я думаю имелось в виду, что имена функций в dll и их сигнатура должны быть типовыми (т.е. строится по шаблону), иначе мы не будем знать что же нам вызывать в итоге.
Коллега DrOffset совершенно верно пояснил эту идею вплоть до деталей.
AlexVRud
414 / 143 / 36
Регистрация: 04.07.2014
Сообщений: 415
07.07.2014, 19:55     Компиляция исходного кода в работающей программе #18
Подкину ещё идею. Можно посмотреть в сторону встраивания скриптовых языков в программу, например Lua. Делается это намного проще.
vlinx
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 74
08.07.2014, 13:10  [ТС]     Компиляция исходного кода в работающей программе #19
Цитата Сообщение от DrOffset Посмотреть сообщение
Если я правильно понял, то вариант 3) - это как раз модифицированный вариант 1). Компилятор вызывается, собирает код в dll, потом эта dll загружается в приложение и вызывается функция. Шаблон здесь конечно же не С++. Я думаю имелось в виду, что имена функций в dll и их сигнатура должны быть типовыми (т.е. строится по шаблону), иначе мы не будем знать что же нам вызывать в итоге.
Руками собрал и скомпилил dll при помощи mingw, а вот с помощью CreatProcess не создается файл example_dll.o

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    //string path_compiler = "C:\\strawberry\\c\\bin\\g++.exe g++";
   // string cmd1 = "g++ -c -DBUILDING_EXAMPLE_DLL example_dll.cpp";
 
    STARTUPINFO siForNotepad = {sizeof(siForNotepad)};
    PROCESS_INFORMATION piForNotepad;
    TCHAR czCommandLine[] = "C:\\strawberry\\c\\bin\\g++ -c -DBUILDING_EXAMPLE_DLL D:\\example_dll.cpp";//Запоминаем имя приложения в параметре командной строки
 
    if(CreateProcess(NULL, czCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &siForNotepad, &piForNotepad))
    {
        cout << "Process " << czCommandLine << " successfully!\n";
        cout << "Descriptor process: " << piForNotepad.hProcess << endl;
        cout << "Id process: " << piForNotepad.dwProcessId << endl;
    }
 
    //*
    if(TerminateProcess(piForNotepad.hProcess, 0))
         cout << "Process successfully done!!!\n";
    //*/
 
    return 0;
}
в чем может быть проблема?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2014, 13:17     Компиляция исходного кода в работающей программе
Еще ссылки по теме:

Компиляция C++ кода через консоль C++
Загрузка исходного кода и компиляция *.exe C++
C++ Компиляция исходного кода C++ ubuntu если нет компилятора g++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AlexVRud
414 / 143 / 36
Регистрация: 04.07.2014
Сообщений: 415
08.07.2014, 13:17     Компиляция исходного кода в работающей программе #20
Цитата Сообщение от vlinx Посмотреть сообщение
не создается файл example_dll.o
Попробуй задать полное имя выходного файла через ключ -o
Yandex
Объявления
08.07.2014, 13:17     Компиляция исходного кода в работающей программе
Ответ Создать тему
Опции темы

Текущее время: 15:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru