2012-09-16 4 views
48

그래서 Java 코드를 디 컴파일하는 것이 얼마나 쉬운 지 깨달았습니다. 나는 그물 주변을 수색 해왔다. 그리고 내가 알아낼 수 없다. 그것의 이렇게 쉬운. 때마다 "Google은 왜 내가 demodilple 파일을 .class 파일을 구글처럼?" 또는 "왜 자바가 그렇게 쉽게 디 컴파일되지 않는가?"라는 질문을 받으면, 코드를 쉽게 디 컴파일 할 수있는 소프트웨어에 대한 링크 만 제공됩니다. 그래서 당신에게로 돌아갑니다 StackOverflow : C++과 다른 언어가 디 컴파일에 매우 친숙하지는 않지만 Java가 쉽게 읽을 수있는 소스 코드로 다시 변환 될 수있는 이유는 무엇입니까? 조립보다 소스에Java 코드를 디 컴파일하는 것이 왜 그렇게 쉬운가요?

감사

+23

Java는 실제로 C++과 같은 방식으로 "컴파일"되지 않습니다. (적어도 JIT가 시작될 때까지) – Mysticial

+2

이것을 더 어렵게 만들고 싶다면 ZKM과 같은 적절한 obfuscater를 사용하십시오. 제어 흐름 난독 화는 디 컴파일러가 코드를 디 컴파일 할 수 없게합니다. 사용자는 먼저 ZKM 및 바이트 코드 엔지니어링에 대한 높은 지식을 요구하는 코드를 훼손해야합니다. – LanguagesNamedAfterCofee

+2

하지만 모든 클래스를 디 컴파일 할 수 없으며 모든 디 컴파일 된 클래스를 수정하지 않고 컴파일 할 수 있습니다. –

답변

55

자바 바이트 코드 가까이 (더 유사)이기 때문입니다.

는 특히, .class 파일 등 클래스 이름, 메소드 이름에 대한 메타 데이터 필드 & 매개 변수 유형을 포함 ...
모든 자바 (또는 닷넷) 디 컴파일러는 각 메소드 본문의 지시에 보면됩니다 할 필요가, 그것들을 적절한 구문 구조로 바꾸십시오.

대조적으로 C++와 같은 모국어에는 메타 데이터가 전혀 포함되어 있지 않으므로 디 컴파일러는 모든 것을으로 재구성해야합니다.

+9

또한 자바 바이트 코드는 실행시 코드를 최적화하기 위해 JITter를 사용하기 때문에 네이티브 코드의 방식으로 최적화되지 않습니다. – Dan

21

자바는 원래 자바 코드 내에 포함 된 많은 양의 정보를 유지하는 중간 형태 JVM 바이트 코드로 컴파일된다. C++과 같은 언어는 원래 코드와 많이 다른 모양으로 어셈블리 코드로 컴파일되므로 되돌리기가 더 어렵습니다.

+5

+1. 따라서 요점은 Java가 아니라 바이트 코드입니다. Java는 x86 명령어 (http://www.excelsior-usa.com/jet.html, http://gcc.gnu.org/java/)로 컴파일 된 다음 C++로 디 컴파일하기가 어려울 수 있습니다. –

+1

@AlexeiKaigorodov 결과 코드가 여전히 리플렉션을 허용하는 경우, 많은 메타 데이터가 유지되기 때문에 디 컴파일하는 것이 C++보다 쉽습니다. – Dave

+0

@Dave : 메소드/클래스 수준의 정보에 해당됩니다. 메소드 내부의 실제 * 명령어는'.class' 파일보다 디 컴파일하기가 더 어려울 것입니다. –

관련 문제