This decompiler is written entirely from scratch. For most instructions the process is simply done by keeping track of the stack and more complicated decompilation is done through the use of control flow graphs. The aim of this is to teach myself a basic overview of how decompilation works and before attempting to build decompilers for binary executables.
compile with:
javac main.java parser/*.java parser/ast/*.java parser/cfg/*.java parser/cfg/types/*.java parser/statement/*.java parser/cfg/helpers/*.java
run with:
java Main
Purpose: convert class file into abstract expressions operating on constants. The aim is to get it into a format that can be easily parsed.
This is done by tracking the stack.
Currently partially decompiles: if, do-while, while
Need to complete support for: for, if-else
This would add support for: n-way conditionals (switch, (if, else-if, else)), break/continue in loops, and potentially first class functions
Hopefully when this is completed I can write some basic tutorials explaining how Java decompilation works and updating as I gain more knowledge.
Identifying Loops In Almost Linear Time - Ganesan Ramalingam
Nesting of Reducible and Irreducible Loops - Paul Havlak
Depth-First Search and Linear Graph Algorithms - Robert Tarjan
Reverse Compilation Techniques - Cristina Cifuentes
Static Single Assignment for Decompilation - Michael James Van Emmerik
Backer Street - Giampiero Caprino
JD-Core - Emmanuel Dupuy
Vineflower