이 프로젝트의 목표는 프로젝트의 설계 문서에 자세히 설명 된 것처럼 잘 정의 된 인터페이스를 통해 상호 작용하는 독립적 인 구성 요소로 구성된 디 컴파일 파이프 라인을 구현하는 것입니다.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...자세한 내용은 예제/데모의 예제 사용 및이 주석을 참조하십시오.
높은 수준의 관점에서, 디 컴파일 파이프 라인의 구성 요소는 개념적으로 세 가지 모듈로 그룹화됩니다. 첫째, 프론트 엔드는 소스 언어 (예 : x86 어셈블리)를 LLVM IR로 변환합니다. 플랫폼 독립적 인 저수준 중간 표현. 둘째, 중간 부분은 높은 수준의 제어 흐름 프리미티브 (예 : 사전 테스트 루프, 2 방향 조건부)를 식별함으로써 LLVM IR을 구조화합니다. 마지막으로, 백엔드는 구조화 된 LLVM IR을 고급 대상 프로그래밍 언어 (예 : GO)로 변환합니다.
다음 포스터는 독립적 인 구성 요소의 구성을 사용하여 LLVM IR을 번역하는 데 사용하여 디 컴파일 파이프 라인의 현재 기능을 요약합니다.
기계 코드 (예 : x86 어셈블리)를 LLVM IR로 번역하십시오.
타사 프론트 엔드 구성 요소.
LLVM IR에 대한 제어 흐름 분석을 수행하여 고급 제어 흐름 프리미티브 (예 : 사전 테스트 루프)를 식별하십시오.
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
제어 흐름 그래프 생성 도구.
llvm ir 어셈블리에서 제어 흐름 그래프를 생성합니다 ( *.ll-> *.dot).
https://godoc.org/github.com/decomp/decomp/cmd/restructure
제어 흐름 복구 도구.
제어 흐름 그래프에서 제어 흐름 프리미티브를 복구하십시오 ( *.dot-> *.json).
구조화 된 LLVM IR을 높은 수준의 목표 언어 (예 : GO)로 번역하십시오.
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
코드 생성 도구로 이동하십시오.
LLVM IR 어셈블리를 소스 코드로 연결하십시오 ( *.ll-> *.go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
후 처리 도구로 이동하십시오.
후 프로세스는 소스 코드를 사용하여보다 관용적으로 만듭니다 ( *.go -> *.go).
버전 0.2의 주요 초점 : 프로젝트 전체 컴파일 속도 .
대충 구성 요소를 개발하는 것은 재미 있어야합니다.
거대한 C ++ 라이브러리에 의존하는 것과 디 컴파일 구성 요소 개발을 즐기는 사이에는 역 상관 관계가있는 것 같습니다.
디 컴파일 파이프 라인의 버전 0.2는 Pure Go로 작성된 LLVM IR 라이브러리를 활용 하여이 문제를 해결하기 위해 노력합니다. 이 릴리스 전에 프로젝트 전체 편집은 완료하는 데 몇 시간이 걸릴 수 있습니다. 이제 그들은 1 분 이내에 완료되었습니다. 모든 향후 릴리스에 대한 확립 된 하드 한도 입니다.
초기 릴리스.
버전 0.1의 주요 초점 : 구성 대결 .
디 컴파일러는 합성 가능하고 오픈 소스 여야합니다.
코 컴파일 파이프 라인은 각각 단일 목적과 잘 정의 된 입력 및 출력을 가진 개별 구성 요소로 구성되어야합니다.
Decomp Project의 버전 0.1은 독립적 인 구성 요소에서 통화 파이프 라인을 구성 할 수있는 타당성과 해당 구성 요소를 최종 사용자에게 노출시킬 수있는 가능성을 탐색합니다.
추가 배경을 보려면 LLVM IR 설계 문서를 사용한 구성 소환을 참조하십시오.
버전 0.3의 주요 초점 : 타입 인식 이진 리프팅 .
디 컴파일러는 고품질 이진 리프팅에 의존합니다.
바이너리 리프팅 프론트 엔드의 출력 IR의 품질은 기본적으로 전체 디 컴파일 파이프 라인의 출력 품질을 결정합니다.
버전 0.3은 유형 인식 바이너리 리프팅 프론트 엔드를 구현하여 출력 LLVM IR의 품질을 향상시키는 것을 목표로합니다.
버전 0.4의 주요 초점 : 제어 흐름 분석 .
디 컴파일러는 높은 수준의 제어 흐름 프리미티브를 복구해야합니다.
저수준 어셈블리와 높은 수준의 소스 코드의 주요 차이점 중 하나는 고급 제어 흐름 프리미티브를 사용하는 것입니다. 예를 들어, 1 방향, 2 방향 및 N- 웨이 조건부 ( if - if-else 및 switch ), 사전 및 사후 테스트 루프 ( while and do-while ).
버전 0.4는 강력한 제어 흐름 분석 알고리즘을 사용하여 고급 제어 흐름 프리미티브를 복구하려고합니다.
버전 0.5의 주요 초점 : 결함 공차 .
디 컴파일러는 강력해야합니다.
계산 구성 요소는 예상치 못한 상태 및 불완전한 분석에 잘 대응해야합니다.
버전 0.5는 안정성에 중점을두고 반 실질적인 월드 소프트웨어를 사용하여 대결 파이프 라인을 스트레스 테스트하려고합니다 (Challenge Issue Series 참조).
버전 0.6의 주요 초점 : 데이터 흐름 분석 .
버전 0.7의 주요 초점 : 유형 분석 .