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