Раньше я думал, что Java можно декомпилировать, потому что он компилируется в байт-код, а не в объектный код. Это неверно, потому что неявное предположение о том, что байт-код «более читабелен», чем объектный код. Почему программы, написанные на Java, могут быть так легко декомпилированы и даже иметь одинаковые идентификаторы (имена переменных)? Я слышал, что в C / C ++ он может быть разобран только на ассемблер, но не декомпилирован в исходный код, почему так?
Компиляторы Java хранят большую часть исходной информации и очень мало оптимизируют при создании байт-кода. Задача компилятора — проверить код, чтобы он мог быть динамически оптимизирован. Примечание: Excelisor компилируется в собственный код и представляет, что декомпилировать будет сложно (по крайней мере, так говорит их маркетинг;)
C / C ++ максимально компилируется и оптимизируется, отбрасывая много исходной информации. (За исключением отладочной информации) Это значительно усложняет распутывание в разумный C или C ++.
Примечание: это особенности компиляторов, обычно используемых для этих языков. Не особенности самих языков.
С точки зрения различий в языках все, что вы можете сказать, это то, что Java относительно бедна по сравнению с C ++. Меньше возможностей делает меньше скомпилированных шаблонов для понимания и обратного проектирования.
Других решений пока нет …