컴퓨팅에서 이진 변환 또는 바이너리 변환(binary translation)은 명령어를 원본(source) 명령어 집합에서 대상(target) 명령어 집합으로 변환하는 바이너리 재컴파일의 일종이다. 명령어 집합 시뮬레이션 등의 경우에 대상 명령어 집합은 원본 명령어 집합과 동일할 수 있으며 명령어 추적, 조건문 브레이크포인트, 핫스팟 감지 등 테스트 및 디버깅 기능을 제공한다.

2가지 주된 유형으로 정적 이진 변환과 동적 이진 변환이 있다. 변환은 하드웨어 수준에서 수행될 수 있고(예: CPU의 회로를 통해) 아니면 소프트웨어 수준에서 수행될 수도 있다.(예: 런타임 엔진, 정적 재컴파일러, 에뮬레이터)

동기 편집

이진 변환이 생겨난 동기는 대상 플랫폼의 바이너리 부재, 대상 플랫폼에서 컴파일할 소스 코드의 부재, 대상 플랫폼에서 소스 컴파일의 어려움 등으로 인한 것이다.

정적 재컴파일된 바이너리들은 개별적으로 에뮬레이트되는 바이너리들보다 잠재적으로 속도가 더 빠른 편인데, 에뮬레이션의 부하가 제거되었기 때문이다. 이는 대체적으로 인터프리트 방식의 프로그램과 컴파일된 프로그램 간의 성능 차이와 비견된다.

정적 이진 변환 편집

정적 이진 변환을 사용하는 변환기는 실행 파일 코드 전체를 (동적 이진 변환에서 이루어지듯 코드를 먼저 실행할 필요 없이) 대상 아키텍처에서 실행되는 코드로 변환하는 것이 목적이다. 이를 매우 정확히 수행하는 일은 매우 어려운데, 모든 코드가 변환기에 의해 감지되지는 않기 때문이다. 이를테면 실행 파일의 특정 부분은 오직 간접 분기를 통해서만 접근이 가능하며 그 값은 런타임 시에만 알 수 있다.

동적 이진 변환 편집

동적 이진 변환(Dynamic binary translation, DBT)은 일반적으로 단일 기본 블록의 순서대로 코드의 짧은 시퀀스를 확인한 다음 이를 변환한 이후 그 결과가 되는 시퀀스를 캐시 처리한다. 코드는 발견 및 사용이 가능할 때에만 변환이 이루어지며 이미 변환되어 저장된 코드(메모이제이션)에 대한 분기 명령어가 만들어진다.

동적 이진 변환은 변환 시간 중 상당한 부하를 일으키는 단순한 에뮬레이션(주된 성능 병목 요소인 에뮬레이터의 주 읽기-디코드-실행 루프를 제거하는 것)과는 구별된다. 변환된 코드 시퀀스를 여러 차례 실행시키므로 이 부하는 다행히 분할된다.

같이 보기 편집

참고 자료 편집