2013-07-22 3 views
1

Когда я пишу код на C++ и компилирую с помощью Visual Studio (компилятор Microsoft), результирующая сборка делает некоторую оптимизацию для моего кода.Скомпилировать код C++, а затем скомпилировать его?

Я хотел создать программу для обучения (или учить других), который принимает C++ код, компилирует его, а затем преобразует его в оптимизированный код обратно в C++, чтобы показать, что был оптимизирован (через программу сравнения)

Это возможно? Если да, то как?

+1

Google «дизассемблер» – Angew

+1

Вам нужен * unpiler *. Хотя я не уверен, что существует. –

+0

Возможный дубликат [Opensource C/C++ decompiler] (http://stackoverflow.com/questions/711220/opensource-cc-decompiler) –

ответ

5

Нет сопоставления 1: 1 между C++ и оптимизированным кодом, поэтому полученный код, вероятно, всегда будет выглядеть иначе, чем вы ожидаете. Одна вещь, которую вы можете сделать, - дать команду компилятору вывести исходный код сборки (-S option) и посмотреть, что сделал компилятор. Сначала без оптимизации, а затем с включенными функциями, чтобы вы могли видеть различия.

+0

Это похоже на лучшее решение. По-видимому, я не могу вернуться в обратном направлении, но с VS я могу хотя бы выплюнуть не оптимизированный и оптимизированный код, и там, там, там, где все понимают сборку! – MintyAnt

+0

Да, это лучший способ пойти, потому что у вас есть полный контроль над prpocess и можно увидеть различия. Вы можете начать с небольшой четко определенной функции, а затем вы можете увидеть, как изменяется результат при изменении. В целях обучения вы даже можете написать простой графический интерфейс, который вызывает компилятор, а затем показывает различия друг с другом. – Devolus

2

Это невозможно. Никто никогда не создавал такой инструмент.

В целом оптимизированный код не может быть преобразован обратно в C++. Оптимизация работает с промежуточным представлением, которое выглядит как ассемблер. Например, оптимизатор может объединять части функций, если они выглядят одинаково. Как вы можете представить это на C++? Если вы дублируете объединенные части, это не будет истинным представлением кода. Существует несколько других подобных случаев с временными переменными, контроль потоков (переходы с if-else и т.п.), исключения подвыражений и другие.

Лучшее, что вы можете сделать, это распечатать ассемблер и попытаться понять, что происходит в коде. Я бы рекомендовал вам играть с небольшими 3-5-строчными функциями и сравнивать списки ассемблеров после небольшой модификации вашей функции. Сравнение различий в функции с разницей в коде ассемблера часто говорит о многом.

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

+0

Черт! Вы знаете, почему это невозможно? Является ли сборка генерировать только не что-нибудь, что C++ понимает, как в очень специфическом для сборки? – MintyAnt

+1

@MintyAnt, потому что между исходным кодом C++ и кодом сборки нет однозначного сопоставления. Это сопоставление «много-к-одному» или «много-ко-многим». – juanchopanza

+0

Несчастливо, но я считаю, что это имеет смысл. Вы знаете, что я могу исследовать, чтобы увидеть несколько примеров этой оптимизации? @kirill вы упомянули о слиянии функций, я бы с удовольствием посмотрел, как выглядит код c по сравнению с сборкой, если такая статья существует! – MintyAnt

Смежные вопросы