마이크로소프트(MS)의 x86-32 에뮬레이터가 실행 중인 프로그램의 '나쁜 코드'를 스스로 감지하고 더 효율적인 코드로 대체하여 성능을 높인 사례가 공개되어 화제입니다. 이 에뮬레이터는 x86-32가 아닌 다른 프로세서에서 x86-32 코드를 실행하기 위해 바이너리 변환(binary translation) 방식을 사용하는데, 이 과정에서 특정 프로그램의 비효율적인 스택 초기화 코드를 발견하고 이를 최적화된 형태로 수정했습니다.
문제의 코드는 약 64KB의 스택 메모리를 할당하고 초기화하는 과정에서 발생했습니다. 일반적으로는 스택 프로브(stack probe) 후 스택 포인터를 줄이고 짧은 루프를 통해 메모리를 초기화하는 것이 효율적입니다. 하지만 해당 코드를 컴파일한 컴파일러는 루프 대신 65,536개의 개별 '메모리에 바이트 쓰기' 명령을 생성했습니다. 각 명령이 4바이트이므로, 64KB 데이터를 초기화하는 데 무려 256KB의 코드가 필요했던 것입니다. 이는 과도한 루프 언롤링(loop unrolling)으로 인해 발생한 비효율적인 코드 패턴이었습니다. 에뮬레이터 팀은 이 비효율적인 함수를 감지하는 특수 코드를 번역기에 추가했고, 감지 시 이를 동등한 동작을 수행하는 짧은 루프 코드로 대체하도록 처리했습니다.
이 사례는 에뮬레이터가 단순히 원본 코드를 다른 아키텍처에서 실행 가능하도록 번역하는 것을 넘어, JIT(Just-In-Time) 컴파일러처럼 동작하며 코드의 품질까지 개선할 수 있음을 보여줍니다. 개발자들 사이에서는 에뮬레이터가 원본 코드를 '수정'하는 것이 적절한지에 대한 논쟁이 있었지만, MS 팀의 접근 방식은 극단적으로 비효율적인 코드를 개선하여 사용자 경험을 향상시켰다는 점에서 긍정적인 평가를 받고 있습니다. 이는 소프트웨어 최적화와 에뮬레이션 기술의 경계가 모호해지며 발전하는 흥미로운 지점이며, 미래의 시스템 소프트웨어 개발 방향에도 시사하는 바가 큽니다.