Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
1 / 1 / 1
Регистрация: 27.06.2014
Сообщений: 74
1

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

07.07.2014, 16:21. Показов 3298. Ответов 47
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет.

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

Я нашел 1 вариант - это сохранение этого кода в файл и компиляция в отдельном процессе.
Это правильный вариант? и есть ли еще пути решения?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2014, 16:21
Ответы с готовыми решениями:

Загрузка исходного кода и компиляция *.exe
Помогите разобраться как в Visual Studio 2010 загрузить исходный код для компиляции программы?

Компиляция исходного кода C++ ubuntu если нет компилятора g++
как запустить кода C++ в ubuntu если нет компилятора g++. код набран в текстовых файлах main.cpp ...

Исправить ошибку в программе, работающей с дробями
#include <iostream> using namespace std; int main(){ int a,b,c,d,e,f; cout << "Введите первую...

Компиляция кода Freeglut
Здравствуйте. Стоит Ubuntu 12.10, компилятор g++ , библиотеку freeglut поставил из репозитория,...

47
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
07.07.2014, 16:35 2
То есть вы хотите написать компилятор? С графической оболочкой, где Memo и так далее? То есть вы хотите написать среду разработки.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.07.2014, 16:38 3
Цитата Сообщение от vlinx Посмотреть сообщение
Это правильный вариант?
Это будет работать.
Цитата Сообщение от vlinx Посмотреть сообщение
Есть ли еще пути решения?
Интерпретация и JIT.
1
1 / 1 / 1
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:39  [ТС] 4
SatanaXIII ,
не не, это мне не по силам.

я хочу не компилятор написать, а узнать способ выполнения кода (и использования его результата в программе) в работающем приложении.
Хотябы вариант, который я написал - возможен?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
07.07.2014, 16:42 5
vlinx, вполне возможен.
Если компилятор поддерживает функции встраивания, то можно использовать их. Например в Clang такое есть. Еще можно посмотреть сюда.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
07.07.2014, 16:43 6
В приложении создаете процесс с вызовом компилятора и передачей ему посредством командной строки файла с текстом программы. Мыслится так
0
1 / 1 / 1
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:48  [ТС] 7
Nick Alte, Интерпретация - это вариант с написанием своего компилятора так понимаю? тогда не подходит.

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

Добавлено через 56 секунд
Ilot, еще один момент - как в основную программу возвратить результат?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
07.07.2014, 16:52 8
Цитата Сообщение от vlinx Посмотреть сообщение
Ilot, еще один момент - как в основную программу возвратить результат?
Ну так любая не void функция возвращает результат, верно?
0
1 / 1 / 1
Регистрация: 27.06.2014
Сообщений: 74
07.07.2014, 16:54  [ТС] 9
Ilot, да.
Ладно, надо попробовать - меньше вопросов будет)
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
07.07.2014, 17:05 10
Цитата Сообщение от vlinx Посмотреть сообщение
Интерпретация - это вариант с написанием своего компилятора так понимаю?
Не обязательно. По моей ссылке есть пример как раз использования готового интерпретатора С.
JIT - это из той же оперы, только компиляция, а не интерпретация. У некоторых компиляторов есть инструментарий для встраивания в приложения. По сути это библиотеки, которые предоставляют набор API для организации процесса сборки.

Добавлено через 8 минут
Вот еще по ссылочка по теме.
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.07.2014, 17:07 11
Цитата Сообщение от vlinx Посмотреть сообщение
Интерпретация - это вариант с написанием своего компилятора так понимаю?
Свой писать долго, лучше взять готовый. Такой вариант даёт наибольшую свободу.
По поводу JIT можно сказать, что это усиленный вариант интерпретации, когда вся программа или некоторые её фрагменты преобразуются в машинный код.

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

Ну и если идти этим путем, проще прикрутить интерпретатор Перла/Питона и не парить себе мозг.
0
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
07.07.2014, 17:11 13
А для чего это нужно? Может просто использовать иное решение?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
07.07.2014, 17:14 14
vlinx, Вот отличная статья на тему встраивания этого интерпретатора. Как раз показано как вернуть результат интерпретируемой функции в основную программу.
1
1 / 1 / 1
Регистрация: 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, с питоном пробовал, нормально. Теперь хочу сделать не с питоном
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
07.07.2014, 18:18 16
Цитата Сообщение от vlinx Посмотреть сообщение
но пока не получилось возвратить результат в программу.
Без специальных ухищрений и не получится (ну кроме целочисленного результата из main).

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

Добавлено через 5 минут
А, и да. К четвертому варианту надо бы еще добавить и это. Там есть пример (main.cpp).
1
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.07.2014, 19:08 17
Цитата Сообщение от vlinx Посмотреть сообщение
Если нет, то где почитать про процесс встраивания кода в шаблон dll?
Цитата Сообщение от DrOffset Посмотреть сообщение
Компилятор вызывается, собирает код в dll, потом эта dll загружается в приложение и вызывается функция. Шаблон здесь конечно же не С++. Я думаю имелось в виду, что имена функций в dll и их сигнатура должны быть типовыми (т.е. строится по шаблону), иначе мы не будем знать что же нам вызывать в итоге.
Коллега DrOffset совершенно верно пояснил эту идею вплоть до деталей.
2
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
07.07.2014, 19:55 18
Подкину ещё идею. Можно посмотреть в сторону встраивания скриптовых языков в программу, например Lua. Делается это намного проще.
0
1 / 1 / 1
Регистрация: 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;
}
в чем может быть проблема?
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
08.07.2014, 13:17 20
Цитата Сообщение от vlinx Посмотреть сообщение
не создается файл example_dll.o
Попробуй задать полное имя выходного файла через ключ -o
0
08.07.2014, 13:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2014, 13:17
Помогаю со студенческими работами здесь

Компиляция кода в приложении
Можно каким-либо образом скомпилировать код в работающем приложении. Т.е. приложение работает, в...

Компиляция кода в командной строке
на паре нам показывали как работать с прогой, написанной на ассемблере - cmd-&gt; выбор директории -&gt;...

Компиляция кода с ромбовидным наследованием
Здравствуйте. Я написал элементарное наследование. На VS 2015 всё компилится, а на CLion нет. В чём...

Компиляция кода под конкретную ОС
Есть ОС Windows, Linux, Android. Хочу понять базовые знание по тому как делается библиотека...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru