C++ 컴파일러가 바이너리 내 텍스트를 생성한다!
C++ 컴파일러를 활용하여 컴파일 타임(Compile Time)에 텍스트를 생성하는 기술이 소개됨
빅그램 마르코프 체인(Bigram Markov Chain)을 활용하여 텍스트를 생성하며, 런타임 오버헤드(Runtime Overhead)가 없음
컴파일러의 결정적 특성(Deterministic Nature)을 활용하여, 매 빌드마다 다른 텍스트를 생성
MSVC 컴파일러에서 테스트되었으며, GCC 및 Clang에서도 작동할 가능성이 있음
컴파일 타임 추론(Compile-Time Inference)의 원리
본 프로젝트는 C++ 컴파일러를 추론 엔진(Inference Engine)으로 활용하여 텍스트를 생성한다. 핵심은 constexpr로 구현된 빅그램 마르코프 체인(Bigram Markov Chain)이다. 외부에서 학습된 전이 확률을 정적 상수 행렬로 인코딩하여, 컴파일 시점에 텍스트를 생성하고 바이너리에 직접 포함시킨다. 이는 런타임 시 추가적인 계산 없이 미리 계산된 결과를 사용함으로써 제로 런타임 오버헤드(Zero Runtime Overhead)를 달성한다.
결정적 특성(Deterministic Nature) 활용
컴파일러의 결정적 특성(Deterministic Nature)을 활용하여 매 빌드마다 다른 텍스트를 생성한다. __TIME__ 및 __DATE__ 매크로를 FNV-1a 알고리즘으로 해싱하여 고유한 시드를 생성하고, 이를 constexpr Xorshift32 생성기(Xorshift32 Generator)에 시딩한다. 이 과정을 통해 컴파일 시점에 난수 기반 텍스트 생성(Random Text Generation)이 가능하며, 바이너리의 내용이 매번 달라진다. 이는 컴파일러가 단순한 코드 최적화 도구를 넘어, 코드 생성기(Code Generator)로 활용될 수 있음을 보여준다.
MSVC 컴파일러 호환성 및 확장성
본 프로젝트는 MSVC(cl.exe) 컴파일러에서 테스트되었으며, C++17 표준의 constexpr 및 템플릿 기능을 사용하므로 GCC 및 Clang에서도 작동할 가능성이 있다. 다만, 복잡한 템플릿 인스턴스화를 위한 충분한 재귀 깊이(Recursion Depth) 지원이 필요하다. 기술적으로 보면, 컴파일러의 템플릿 메타프로그래밍(Template Metaprogramming) 능력을 극대화하여, 런타임이 아닌 컴파일 타임에 복잡한 연산을 수행하는 방식을 보여준다.
트레이드오프(Trade-offs) 및 활용 가능성
이 기술은 런타임 성능을 극대화하지만, 컴파일 시간 증가라는 트레이드오프(Trade-offs)를 가진다. 특히, 템플릿 메타프로그래밍의 복잡성으로 인해 코드 유지보수가 어려울 수 있다. 하지만, 정적 분석(Static Analysis) 및 코드 생성(Code Generation) 분야에서 잠재적인 활용 가능성을 제시한다. 예를 들어, 특정 상황에 맞는 최적화된 코드(Optimized Code)를 컴파일 시점에 생성하여 런타임 성능을 향상시킬 수 있다.