# 어디서나 실행할 수 있도록 Python을 컴파일하기

> Clean Markdown view of GeekNews topic #23367. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=23367](https://news.hada.io/topic?id=23367)
- GeekNews Markdown: [https://news.hada.io/topic/23367.md](https://news.hada.io/topic/23367.md)
- Type: news
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-09-30T10:04:01+09:00
- Updated: 2025-09-30T10:04:01+09:00
- Original source: [blog.codingconfessions.com](https://blog.codingconfessions.com/p/compiling-python-to-run-anywhere)
- Points: 13
- Comments: 1

## Summary

**순수 Python 코드**를 **사전 컴파일(AOT)** 해 **크로스 플랫폼 실행 파일**로 변환하는 컴파일러 설계 사례를 다룹니다. **심볼릭 트레이싱**과 **중간 IR, C++ 코드 생성, 멀티 타깃 컴파일** 파이프라인을 통해, **타입 주석과 AI 코드 생성**으로 Numpy·OpenCV·PyTorch 등 폭넓은 **라이브러리 호출**을 지원하며 다양한 하드웨어에서 효율적으로 최적화된 **경험적 성능 탐색** 전략을 적용합니다. 컨테이너 오버헤드 없이 **작고 빠른 바이너리**로 패키징해 **서버·데스크톱·모바일·웹 등 어디서나 실행** 가능하다는 점에서, **이식성과 배포, AI 워크로드 최적화**에 관심 있는 개발자들에게 유의미한 인사이트를 제공합니다.

## Topic Body

- 이 글은 **순수 Python 코드**를 **사전 컴파일(AOT)** 하여 **크로스 플랫폼 실행 파일**로 바꾸려는 시도와 설계를 사례 중심으로 설명함  
- 핵심 아이디어는 JIT을 새로 만들거나 C++로 다시 쓰지 않고, **심볼릭 트레이싱→IR→C++ 코드 생성→다중 타깃 컴파일** 파이프라인으로 **최적화 커널**을 산출하는 방식  
- **PEP 484 타입 주석**으로 타입 전파를 시드하고, **AI 코드 생성**으로 수백 개의 **C++ 오퍼레이터**를 자동 구현해 Numpy·OpenCV·PyTorch 등 **폭넓은 라이브러리 호출**을 커버함  
- 동일한 Python 함수에 대해 다양한 구현 경로를 **대량 생성·배포**하고 **실측 텔레메트리**로 **가장 빠른 변종**을 고르는 **경험적 성능 최적화** 전략을 채택  
- 목표는 컨테이너에 의존하지 않는 **작고 빠른 이식 가능한 바이너리**를 제공해 서버·데스크톱·모바일·웹까지 **어디서나 실행**하는 배포 단위로 삼는 것  
  
---  
### Foreword  
- Python의 단순성과 생산성은 장점이나, **고부하 워크로드에서 성능·이식성 한계**가 존재함  
- 게스트 필자인 Yusuf Olokoba의 이 글은 **원본 Python 유지** 상태에서 **빠르고 휴대 가능한 실행 파일**을 만드는 컴파일러 설계를 소개하는 것  
- **JIT 추가나 전면 C++ 리라이트 없이** 파이프라인을 구성해 **커널 최적화**를 달성하려는 접근임  
  
### Introduction  
- 목표는 **수정 없는 Python**을 **완전 AOT**로 컴파일해 **인터프리터 없이 동작**하며 **C/C++에 가깝게 빠르고** **모든 플랫폼**에서 실행되게 하는 것  
- 기존 시도들(Jython, RustPython, Numba, PyTorch, Mojo 등)과 달리 **언어·런타임 치환**이 아닌 **코드 변환과 커널 생성**을 택함  
- 이 컴파일된 Python 함수들은 이미 **매달 수천 대 장치**에서 사용 중  
  
### Containers Are the Wrong Way to Distribute AI  
- 실무 배포에서 **컨테이너는 과도한 페이로드**(인터프리터·패키지·OS 스냅샷)를 동반해 **시작 지연·이식성 제약**을 야기함  
- 대안은 **모델만 담은 자급자족 실행 파일**로, **더 작고 빠른 시작**과 **서버·데스크톱·모바일·웹** 전반의 실행 가능성 제공  
- 요지는 **배포 단위**를 OS 스냅샷이 아닌 **자체 실행 바이너리**로 전환하는 전략임  
  
### Arm64, Apple, and Unity: How It All Began  
- Apple의 **arm64 전환** 당시 Unity가 **IL2CPP**로 CIL을 C++로 변환해 **모든 타깃에 컴파일** 가능하게 한 사례를 벤치마킹  
- 동일한 발상을 **Python에 적용**해 **어디서나 돌 수 있는** 코드 경로를 확보하려는 비전 설정  
  
### Sketching Out a Python Compiler  
- 상위 설계는 **Python 입력 → 심볼릭 트레이스(IR) → C++ 생성 → 멀티 타깃 컴파일** 단계로 구성  
- IR에서 바로 오브젝트 코드로 가지 않고 **C++을 중간 산출물**로 택한 이유는 **CUDA·MLX·TensorRT·AMX 등 가속 경로**를 최대한 활용하기 위함  
- 목표는 **하드웨어별 최적 경로**를 끼워 넣기 쉬운 **확장성 있는 설계** 확보  
  
### Building a Symbolic Tracer for Python  
- 초기 PyTorch FX 기반 트레이싱은 **실행 필요성**과 **PyTorch 연산 한정성** 때문에 한계가 있었음  
- 대신 **AST 파싱 기반 심볼릭 트레이서**를 구축해 **제어 흐름·호출 해석**을 IR로 변환함  
- 현재 트레이서는 **정적 분석, 부분 평가, 샌드박스 기반 라이브 값 관찰** 등 기능을 제공함  
  
### Lowering to C++ via Type Propagation  
- Python의 **동적 타이핑**을 C++의 **정적 타이핑**으로 다리를 놓기 위해 **타입 전파**를 사용함  
- 입력 인자 타입이 주어지면 **중간 변수 타입**을 **연산자 정의**에 따라 **결정적으로 추론** 가능함  
- 각 Python 연산을 **대응하는 C++ 구현**으로 매핑하며 **함수 전반에 타입을 전파**함  
  
### Seeding the Type Propagation Process  
- 타입 전파의 시드로 **PEP 484 타입 주석**을 사용함  
- 이는 **원본 코드 비수정 원칙**과 상충하지만, **간결한 인터페이스·호환성**을 위해 **허용 가능한 타협**으로 판단함  
- 또한 **함수 시그니처의 타입 수 제한** 등 제약을 둬 **간단한 소비 인터페이스**를 보장함  
  
### Building a Library of C++ Operators  
- 모든 함수를 C++로 직접 구현하지 않고, **추적 불가한 리프 연산**만 **수기/자동 구현**이 필요함  
- 다수의 Python 코드는 **소수의 기본 연산 조합**으로 구성되므로, **커버해야 할 오퍼레이터 집합**은 상대적으로 작음  
- **LLM 기반 코드 생성**과 **제한·테스트·조건부 컴파일 인프라**로 **Numpy·OpenCV·PyTorch** 등 **수백 개 함수 구현**을 자동화함  
  
### Performance Optimization via Exhaustive Search  
- 성능 최적화는 **항상 경험적**이라는 교훈에 따라, **여러 구현 변종을 전부 산출**해 **실측 비교**로 최적을 선택함  
- 예: Apple Silicon에서 **리사이즈**만 해도 **Accelerate, vImage, Core Image, Metal** 등 **여러 경로**를 생성하고 **동일 기능의 다중 바이너리**를 배포함  
- **세밀한 텔레메트리**로 **경로별 지연**을 수집해 **통계 모델**로 **가장 빠른 변종**을 예측·선택함  
- 효과는 사용자 입장에서 **시간이 지날수록 자동으로 빨라지는** 실행 경험 제공임  
  
### Designing a User Interface for the Compiler  
- 개발자 경험을 **학습 곡선 제로**에 가깝게 하기 위해 **PEP 318 데코레이터 `@compile`** 을 인터페이스로 채택함  
- CLI는 데코레이터를 **엔트리포인트**로 삼아 **의존 코드 그래프**를 탐색하고 컴파일함  
- 데코레이터 인자로 **tag·description·sandbox·metadata**를 받아 **환경 재현·백엔드 지정(ONNXRuntime, TensorRT, CoreML, IREE, QNN 등)** 을 지원함  
  
### Closing Thoughts  
- 예외·람다·재귀·클래스 등은 **부분 지원/미지원**으로, 특히 **복합 타입·고차 타입**에서 **타입 전파 확장**이 필요함  
- **디버깅 경험**은 최적화 컴파일로 심볼 정보가 줄어 **추적 난이도**가 높아지는 과제임  
- **C++20**의 `std::span`, concepts, coroutines가 핵심 기반이며, **C++23**의 `std::generator`, `&lt;stdfloat&gt;`, `&lt;stacktrace&gt;`는 **스트리밍·half/bfloat16·예외 추적**에 기여 예정임  
- 최종 목표는 **컨테이너 없이 작은·빠른·안전한 실행 파일**로 **임베딩/감지 등 AI 워크로드**를 **어디서나 실행** 가능한 배포 단위를 확립하는 것

## Comments



### Comment 44415

- Author: secret3056
- Created: 2025-09-30T10:32:08+09:00
- Points: 1

APE 같은건줄 알았는데 그건 아니네요.
