Декомпилатор: Разлика между версии

Изтрито е съдържание Добавено е съдържание
Kratoz333 (беседа | приноси)
Редакция без резюме
Kratoz333 (беседа | приноси)
Редакция без резюме
Ред 1:
= Какво е това? =
Декомпилатор е [[компютърна програма]], която изпълнява обратната операция на тази на [[компилатор]]. Това е превеждането на програмен код от относително ниско ниво на абстракция (често проектиран да бъде четен от компютри, а не от хора) ввъв форма, която има по-голямо ниво на абстракция (проектирана за четенето от хора). Декомпилаторите обикновено не реконструират перфектно оригиналния [[сорс код]]. Декомпилаторите са важен инструмент в софтуерното обратно инженерство.
 
= Как работи? =
Декомпилация е действието от използването на декомпилатор, но може да се има в предвид и самия резултат от декомпилатора. Успехът на декомпилацията зависи от количеството информация, предоставено от кодъткода, който се декомпилира и начина, по който се анализира от декомпилатора. Биткод формат използван от много виртуални машини (като [[Java Virtual Machine]] и от [[.NET Framework]] [[Common Language Runtime]]) често съдържат
метаданни и функции на високо ниво, които правят декомпилацията лесно осъществима. Присъствието на дебъг данни предоставятпредоставя възможност да се възпроизвеждат оригиналните имена на променливите и на структурите, дори и номерацията на редовете. Код без такива метаданни и дебъг данни е много по-труден за декомпилиране.
 
=== Етапи на Декомпилация ===
Ред 10:
 
==== Зареждане ====
Първата етап зарежда машинния код или междинния език на програмата. Би трябвало да открие основни факти за зададената програма, като архитектурата (Pentium, PowerPC, и други) и входната точка.
 
==== Преобразуване ====
Ред 20:
 
==== Анализ на програма ====
Различни анализи на програма могат да се прилага на IR. По-специално, изразно събиране комбинира семантиките на няколко инструкции в по -сложен израз. Резултатът е повече като език на високо ниво.
 
==== Анализ на потокът данни ====
Местата, където различните регистри се дефинират и използват, трябва да бъдат проследени с анализ на потокът данни. Същия анализ трябва да бъде приложен на места, които се използват за временни и локални данни. Различни имена могат да се формират за всеки свързан набор от стойностни дефиниции и употреби. Възможно е едно и също място в паметта да се използва за повече от една променлива в различни части от програмата. Анализът може да покаже дори, ако определена променлива се използва за две различни цели, но тази логика да е имплементирана от компилатора, а не от разработчика.
==== Анализ на типове ====
Ред 29:
 
==== Структуриране ====
Предпоследния етап включва структуриране на IR в конструкции от високо ниво, като while цикли и if/then/else условни конструкции.
 
==== Генерация на код ====