2011-04-19 3 views
3

Groovy, Scala와 같은 JVM 언어를 초기 형식으로 디 컴파일 할 수 있습니까?JVM 언어 디 컴파일

4 행의 Groovy 클래스를 디 컴파일하면 약 20 행의 디 컴파일 된 Java 코드가 생성됩니다.

실용적인 것보다 이론적 인 질문이 더 많습니다. 시장에 그런 디 컴파일러가 없기 때문입니다.

감사합니다.

+0

컴파일러 _는 원본을 다시 얻을 수 없도록 재구성 할 수없는 정보를 버립니다. –

답변

3

예, 자바 디 컴파일러가 관리 할 수있는 유사한 충실도가 가능합니다 (즉, 코드는 유사하지만 반드시 동일하지는 않습니다).

그러나 각 언어에 대해 전용 디 컴파일러가 필요합니다.

편집 : for (지역 변수의

  • 이름이 나
  • 루프 유형을 잘못 해석 될 수 재현 할 수 없습니다 수 있습니다 : 나는 충실도의 수준을 내가 기대 명확히 필요가 있다고 생각 while, ...)
  • 보다 일반적인 대체 ... 잘못 해석
  • 수 있습니다 유사한 두 가지 방법으로 수행 할 수있는 것들

이들 모두는 바이트 코드에서 Java 소스 코드로의 연관성이 1 : 1이 아니기 때문에 자바 코드의 디 컴파일 링에서도 발생하는 오류입니다. 당신은 전용 그루비 디 컴파일러가있는 경우

그러나 그때는 지금까지 할 수 있었던 자바 디 컴파일러보다 컴파일 그루비 코드를 디 컴파일에서 훨씬 더 읽을 수있는 코드를 생성하는 의심을 강하게.

+0

실제로 매우 낙관적 인 가정입니다. – Ingo

+0

@Ingo : 나는 이것이 낙관적 인 방법을 보지 못했다. 유능한 Java 디 컴파일러에 의해 생성 된 코드는 원본 소스와의 기본적인 유사성을 가지고 있습니다. 컴파일시'.class' 파일에 명시 적으로 포함되지 않는 한 로컬 변수 이름은 일반적으로 손실되며 사용되는 특정 유형의 루프도 잘못 표현됩니다 ('for'루프를 'while'루프로 대체). –

+1

내 게시물에 nmy 다른 의견을 말했습니다. – Ingo

0

글쎄, 내가 생각할 수있는 유일한 것들은 컴파일러 최적화와 코멘트의 문제이다. 주석은 바이트 코드 (고맙게도)에 보존되지 않으며 컴파일러는 더 나은 성능을위한 소스 코드를 변경할 수 있습니다.

+0

나는 코멘트에 대해 걱정하지 않는다. 근데 어떻게 이걸 지울거야? this.metaClass = ((MetaClass) ScriptBytecodeAdapter.castToType (tmp12_9, $ get $$ class $ groovy $ lang $ MetaClass()))); tmp12_9; while (true) return; –

+2

@Alexandru : 그것은 바이트 코드가 아닙니다. 이것이 ** Java 언어 디 컴파일러 **가 Java 언어 코드를 컴파일하여 생성되지 않은 바이트 코드를 해석하는 방법입니다. 이것은 이상한 결과를 가져올 수밖에 없지만 올바른 언어를위한 전용 디 컴파일러는 "이상한"바이트 코드 구조를 인식하고 그것이 나타내는 언어 구성을 알고 있습니다. –

+0

@ Joachim, 당신은 맞습니다. 그것은 바이트 코드가 아니기 때문에 그것이라고 말하지 않았습니다. Groovy가 생성 한 클래스 파일을 처리하는 것을 알고 있다면 Java 생성 클래스 파일과 다르게 처리해야한다는 것을 알아야합니다. –

1

반드시 필요한 것은 아닙니다. 예를 들어, 언어는 되돌릴 수없는 방식으로 이름을 조작 할 수 있습니다. 또한 소스 언어의 여러 구문을 단일 Java 언어 구문에 매핑 할 수 있습니다.

그러나 자바 언어 (JVM 바이트 코드와 비교)는 소스 언어의 특정 개념이나 구조를 구체화 할 수있을만큼 강력하지 못합니다. 자바와 JVM 바이트 코드의 경우 이미 그렇습니다. 자바와 JVM 바이트 코드는 제네릭을 표현할 수 없습니다.

+0

이었습니다. Groovy에 의해 생성 된 Java 바이트 코드를 Java로 다시 변환하겠다는 의미는 아니지만 Groovy로 되돌려 둡니다. –

+0

@Alexandru - 정확히 요점은 - Groovy에 대해 모르지만 정보를 잃지 않고 바이트 코드로 컴파일 할 수없는 특정 기능이 있다고 상상할 수 있습니다. 바이트 코드로 컴파일 할 때 정보를 잃어버린 langhuage의 한 예는 아이러니 컬하게도 Java 자체이므로 다른 언어의 경우가 더 많을 것이라고 가정하는 것이 안전합니다. – Ingo