PyPy용 확장 모듈 작성하기¶
이 문서는 PyPy Python 인터프리터를 외부 라이브러리와 인터페이스하는 방법을 설명합니다.
현재 PyPy Python 인터프리터에 서드파티 모듈을 제공하는 방법으로는 다음과 같은 것들이 있습니다(PyPy에서 가장 직접적으로 유용한 것부터 사용하기 가장 번거로운 것 순서입니다):
- 순수 Python으로 작성하고 CFFI를 사용하십시오.
- 순수 Python으로 작성하고 ctypes를 사용하십시오.
- C++로 작성한 뒤 Cling을 사용하여 cppyy를 통해 바인딩하십시오.
- RPython Mixed Modules로 작성하십시오.
CFFI¶
권장되는 방법은 CFFI입니다. CFFI는 C 라이브러리에 접근하는 순수 Python 코드를 작성하는 방법입니다. 핵심 아이디어는 C에 대한 ABI 수준 접근과 API 수준 접근 중 어느 쪽이든 지원하는 것입니다. 따라서 C 구조체의 정확한 필드 순서나 모든 상수의 숫자 값 같은 세부 사항에 의존하지 않고도 C 라이브러리에 무리 없이 접근할 수 있습니다. CFFI는 CPython(별도로 python -mpip install cffi로 설치)과 기본으로 포함되어 있는 PyPy 모두에서 동작합니다.
PyPy의 JIT는 CFFI를 사용해 C 함수를 호출하거나 C 포인터를 조작하는 Python 코드를 상당히 잘 처리합니다. (PyPy 2.2.1 기준으로 아직 개선의 여지는 있지만, 이미 충분히 좋은 수준입니다.)
여기에서 문서를 확인하십시오.
CTypes¶
PyPy의 ctypes 모듈은 CPython ctypes 버전과 최대한 호환되는 것을 목표로 합니다. pyglet과 같은 대규모 예제에서도 동작합니다. PyPy의 구현은 CPython과 엄밀하게 100% 호환되지는 않지만, 대부분의 경우에는 충분히 가깝습니다. 더 많은(다만 오래된) 정보는 여기에서 확인할 수 있습니다. 또한 ctypes의 성능은 CFFI만큼 좋지 않습니다.
PyPy는 ctypes를 _rawffi와 _rawffi.alt라는 두 내장 모듈을 감싸는 순수 Python 코드로 구현하며, 이 두 모듈은 C 라이브러리 libffi에 대한 매우 저수준의 바인딩을 제공합니다. 오늘날에는 이 두 모듈을 직접 사용하는 것을 권장하지 않습니다.
cppyy¶
C++의 경우, _cppyy_는 PyPy와 CPython 모두에서 사용할 수 있는 자동 바인딩 생성기입니다. _cppyy_는 C++ 헤더 파일의 선언을 바탕으로 이에 대응하는 Python 클래스, 함수, 변수 등을 동적으로 생성합니다. 대규모 프로그램에서 사용하도록 설계되었으며 최신 C++를 지원합니다. PyPy에서는 내장 _cppyy 모듈을 활용하므로 JIT가 언어 간 오버헤드를 대부분 제거할 수 있습니다.
설치하려면 <pypy> -mpip install cppyy를 실행하십시오. 자세한 내용은 full documentation에서 확인할 수 있습니다.
RPython 혼합 모듈(Mixed Modules)¶
이것은 PyPy에서 내장 확장 모듈을 작성하는 내부 방식입니다. 서드파티 모듈에서는 이 방식을 사용할 수 없습니다. 확장 모듈은 독립적으로 로드할 수 있는 DLL이 아니라 내장되어 있기 때문입니다.
이는 특수한 경우를 위해 남겨 둔 방식입니다. 예를 들어 JIT의 세부 사항에 직접 접근할 수 있게 해 주므로, JIT가 사용자 코드와 상호 작용하는 방식을 조정할 수 있습니다. numpy 모듈도 이 방식으로 개발되고 있습니다.