Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
AndreyMironenko
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 6
#1

Компиляция заданного кода в exe через программу - C++

07.03.2013, 12:43. Просмотров 1040. Ответов 16
Метки нет (Все метки)

Хочу узнать поподробнее, как реализовать компиляцию некого заданного кода в exe для windows через самописную программу. Ведь как-то писали компиляторы для других ЯП-ов.
Например, есть код (предположим, паскалеподобный):
Pascal
1
2
3
begin
print'HELLO!'
exit
Мне нужно, чтобы через мою прогу он переводился (компилировался) в exe-файл, который запускался бы через windows и выполнял то, что написано в коде.
Мне важен сам принцип создания exe через программу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2013, 12:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Компиляция заданного кода в exe через программу (C++):

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

Компиляция библиотеки через make.exe - C++
Скачал исходный код библиотеки oglft-0.9, скачал make-3.81.exe, не могу понять как скомпилировать, подскажите. В папке есть файлы ...

Компиляция C++ кода через консоль - C++
Есть простенький код: #include <iostream> #include <vector> int main(int argc, char *argv){ std::vector<int> vec; int num=1;...

Компиляция exe - C++
Как скомпилировать .exe чтобы он работал на других машинах, писал с использованием OpenGL от этого проблемы при работе с другими машинами...

Компиляция в EXE файл - C++
Помогите пожалуйста откомпилировать в EXE файл или хотя бы как правильно запустить его. Зарание очень буду очень благодарен.

Компиляция кода Freeglut - C++
Здравствуйте. Стоит Ubuntu 12.10, компилятор g++ , библиотеку freeglut поставил из репозитория, после чего инклуды появились нужном месте в...

16
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,834
Записей в блоге: 1
07.03.2013, 12:46 #2
Цитата Сообщение от AndreyMironenko Посмотреть сообщение
Мне нужно, чтобы через мою прогу он переводился (компилировался) в exe-файл, который запускался бы через windows и выполнял то, что написано в коде.
а почему тебе так принципиально его компилировать в exe?
чем тебя интерпретатор не устраивает?
0
AndreyMironenko
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 6
07.03.2013, 12:48  [ТС] #3
Тем, что для работы нужен интерпретатор. А так - всё компилиуется и запускается где угодно.

Спрашиваю больше для самообразования, но и попытаться реализовать тоже интересно.
0
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,834
Записей в блоге: 1
07.03.2013, 12:55 #4
Цитата Сообщение от AndreyMironenko Посмотреть сообщение
Тем, что для работы нужен интерпретатор. А так - всё компилиуется и запускается где угодно.
А какая разница?
а так для работы нужен компилятор.
иначе смысл преобразовывать какой-то текст программы, если можно на своём компе её на си написать и вручить кому хочешь уже экзешник.
0
AndreyMironenko
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 6
07.03.2013, 12:59  [ТС] #5
Я же говорю, мне просто интересно, как это реализовать. Если не знаешь, можешь не писать.
0
Kuzia domovenok
2130 / 1959 / 197
Регистрация: 25.03.2012
Сообщений: 6,834
Записей в блоге: 1
07.03.2013, 13:09 #6
Цитата Сообщение от AndreyMironenko Посмотреть сообщение
Я же говорю, мне просто интересно, как это реализовать. Если не знаешь, можешь не писать.
Ясно. Тогда иди читай Dragon Book
http://www.amazon.com/dp/0321486811/?tag=stackoverfl08-20
А в форумном сообщении про написание компиляторов тебе много не расскажут.
1
AndreyMironenko
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 6
07.03.2013, 14:12  [ТС] #7
Интересно. Найду ещё что-нибудь в инете. Спасибо.
0
Croessmah
Ушел
13783 / 8033 / 928
Регистрация: 27.09.2012
Сообщений: 19,803
Записей в блоге: 3
Завершенные тесты: 1
07.03.2013, 14:17 #8
Транслируйте код в ассемблер и запускайте ассемблер.
0
XRuZzz
Антикодер
1299 / 629 / 32
Регистрация: 15.09.2012
Сообщений: 2,589
07.03.2013, 14:20 #9
я не эксперт по компиляторам, но думаю вам этот код
Код
begin
print'HELLO!'
exit
для начала нужно перекодировать в ассемблер.
но begin - exit лучше заменить на {} ведь они короче или на /* */ тогда комментарии в C++ можно интерпретировать как программу( я не говорю, что так нужно сделать, но может на этой идее у вас появится более продвинутая идея)

после перекодирования в ассемблер стоит использовать готовый компилятор для ассемблера.

ещё нужно изучить регулярные выражения, без них очень сложно будет понять, как разобрать строку на операторы, переменные и прочее
0
AndreyMironenko
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 6
07.03.2013, 14:22  [ТС] #10
Croessmah, я не понял тебя, что ты сказал? В смысле транслировать в компилятор ассемблера?

Добавлено через 57 секунд
Цитата Сообщение от XRuZzz Посмотреть сообщение
я не эксперт по компиляторам, но думаю вам этот код
Код
begin
print'HELLO!'
exit
для начала нужно перекодировать в ассемблер.
но begin - exit лучше заменить на {} ведь они короче или на /* */ тогда комментарии в C++ можно интерпретировать как программу( я не говорю, что так нужно сделать, но может на этой идее у вас появится более продвинутая идея)

после перекодирования в ассемблер стоит использовать готовый компилятор для ассемблера.
Мне нужен свой компилятор, а не компилятор ассемблера.
0
XRuZzz
Антикодер
1299 / 629 / 32
Регистрация: 15.09.2012
Сообщений: 2,589
07.03.2013, 14:34 #11
Вам нужно почитать основы о том как работает процессор. Если вы хотите сразу транслировать в машинный код никто не мешает. Но ассемблерные команды позволяют работать с машинным кодом более просто.
после компиляции у вас будет бинарный файл, который можно легко транслировать в ассемблер.

то есть ассемблер предназначен для того чтобы генерировать такие бинарные файлы более простым способом.

То есть алгоритм такой
читаем строку 1 - пусто
читаем строку 2 - begin
проверяем есть ли в строке ключевые слова вашего языка
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch (keyword)
{
case 'begin':
пишем в файл asm код ассемблера для начала программы
break;
case 'exit':
как бы begin- а ещё не было выдаём сообщение об ошибке
(если был пишем в файл asm код ассемблера для конца программы)
break;
case 'print':
проверяем что после print и если всё верно оформлено , то пишем в файл asm вывод на экран на ассемблере
}
далее аналогично вызываем функцию в которой находится switch
0
kamre
127 / 131 / 4
Регистрация: 25.12.2011
Сообщений: 443
07.03.2013, 14:39 #12
Цитата Сообщение от AndreyMironenko Посмотреть сообщение
нужно, чтобы через мою прогу он переводился (компилировался) в exe-файл, который запускался бы через windows и выполнял то, что написано в коде
Можно компилировать в байткод под .NET, должно быть куда проще и готовых инструментов под это больше. На выходе будет готовый exe-файл.
0
XRuZzz
Антикодер
1299 / 629 / 32
Регистрация: 15.09.2012
Сообщений: 2,589
07.03.2013, 15:00 #13
если у вас возникают такие вопросы то начинать нужно с Литература C++ раздел "Основы программирования и синтаксис языка"
там представлены достойные книги, которые быстро приведут вас к цели

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

Добавлено через 9 минут
ну и по традиции дам ссылки на вики
Машинный код
Ассемблер_(язык_программирования)
Компилятор

цитата из последней ссылки(раз уж вы никому не верите)
Некоторые компиляторы переводят программу с языка высокого уровня не прямо в машинный код, а на язык ассемблера. Это делается для упрощения части компилятора, отвечающей за кодогенерацию, и повышения его переносимости (задача окончательной генерации кода и привязки его к требуемой целевой платформе перекладывается на ассемблер), либо для возможности контроля и исправления результата компиляции программистом.
там кстати и про байткод есть, но не думаю, что он будет выдавать оптимальные программы для конкретной архитектуры процессора.

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

Не по теме:


под каждым сообщением есть волшебная кнопка "Спасибо"

0
Tolias28
206 / 126 / 2
Регистрация: 18.08.2010
Сообщений: 1,009
07.03.2013, 15:05 #14
Цитата Сообщение от kamre Посмотреть сообщение
Можно компилировать в байткод под .NET, должно быть куда проще и готовых инструментов под это больше
Кстати да. Если для вас сам язык не принципиален, а нужно лишь получать из кода(любого языка программирвоания) говотовый exe-файл, тогда посмотрите в сторону .NET-языков, например C#. Там есть встроенные средства для компиляции исходного кода программы. Вот пример:
C#
1
2
3
4
5
6
CSharpCodeProvider csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } }); //Указываем версию .NET Framework компилируемой программы
string[] assemblyNames = new[] { "mscorlib.dll", "System.Core.dll", "System.Runtime.Serialization.dll" }; //Указываем нужные dll, которые используются в программе
CompilerParameters parameters = new CompilerParameters(assemblyNames, "MeCompiledProgram.exe", false); //во втором параметре имя программы
parameters.GenerateExecutable = true; //указываем, что нам нужно скомпилировать экзешник, а не DLL-файл
CompilerResults results = csc.CompileAssemblyFromSource(parameters, code); //сама компиляция. В переменной code должен присутствовать код, из которого скомпилируется программа
List<CompilerError> listOfErrors = results.Errors.Cast<CompilerError>().ToList(); //если в коде присутствовали ошибки, тогда мы их здесь получим в списке listOfErrors
и все! Всего несколько строк позволяют создать такой же exe-файл, как это делает при компиляции Visual Studio
0
XRuZzz
07.03.2013, 15:22     Компиляция заданного кода в exe через программу
  #15

Не по теме:

Цитата Сообщение от Tolias28 Посмотреть сообщение
и все! Всего несколько строк позволяют создать такой же exe-файл, как это делает при компиляции Visual Studio
помоему это мнимая легкость

0
07.03.2013, 15:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2013, 15:22
Привет! Вот еще темы с ответами:

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

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

Компиляция кода... не могу сообразить. - C++
Доброго времени суток уважаемые форумчане! Прошу помочь с решением проблемы: есть исходники memtest86+, скачал чтоб разобраться как...

Компиляция кода с ромбовидным наследованием - C++
Здравствуйте. Я написал элементарное наследование. На VS 2015 всё компилится, а на CLion нет. В чём может быть проблема? class A { ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru