PyPy\ 를 위한 확장 모듈 작성하기 ================================ 이 문서는 PyPy 파이썬 인터프리터를 외부 라이브러리와 연동하는 방법을 설명하고자 합니다. 현재, PyPy 파이썬 인터프리터에 서드파티 모듈을 제공하는 방법에는 다음과 같은 가능성들이 있습니다(PyPy에서 사용하기에 가장 직접적으로 유용한 순서부터 가장 지저분한 순서까지): * 순수 Python으로 작성하고 CFFI_\ 를 사용하십시오. * 순수 Python으로 작성하고 ctypes_\ 를 사용합니다. * C++로 작성하고 Cling을 사용하는 cppyy_\ 를 통해 바인딩합니다. * `RPython 혼합 모듈(Mixed Modules)`_\ 로 작성하십시오. CFFI ---- CFFI__\ 는 권장되는 방법입니다. C 라이브러리에 접근하는 순수 Python 코드를 작성하는 방법입니다. 핵심 아이디어는 C에 대한 ABI 또는 API 수준 접근을 지원하는 것입니다 --- 그래서 C 구조체의 정확한 필드 순서나 모든 상수의 숫자 값과 같은 세부사항에 의존하지 않고도 C 라이브러리에 안전하게 접근할 수 있습니다. CPython(별도로 ``python -mpip install cffi``\ 로 설치)과 PyPy(기본으로 포함됨) 모두에서 동작합니다. PyPy의 JIT은 CFFI로 C 함수를 호출하거나 C 포인터를 조작하는 Python 코드에 대해 상당히 합리적인 성능을 보입니다. (PyPy 2.2.1 기준으로 아직 개선의 여지는 있지만, 이미 훌륭한 수준입니다.) 문서는 여기__\ 에서 확인하십시오. .. __: https://cffi.readthedocs.org/ .. __: https://cffi.readthedocs.org/ CTypes ------ PyPy의 ctypes 모듈의 목표는 `CPython ctypes`_\ 버전과 최대한 호환되는 것입니다. pyglet과 같은 대규모 예제에서도 동작합니다. PyPy의 구현은 CPython과 엄격하게 100% 호환되지는 않지만, 대부분의 경우에는 충분히 가깝습니다. 더 많은(다만 오래된) 정보는 :doc:`여기 `\ 에서 확인할 수 있습니다. 또한, ctypes의 성능은 CFFI만큼 좋지 않습니다. .. _CPython ctypes: https://docs.python.org/library/ctypes.html PyPy는 ``_rawffi``\ 와 ``_rawffi.alt``\ 라는 두 개의 내장 모듈을 중심으로 순수 파이썬 코드로 ctypes를 구현하며, 이 모듈들은 C 라이브러리 libffi_\ 에 대한 매우 저수준의 바인딩을 제공합니다. 오늘날에는 이 두 모듈을 직접 사용하는 것이 권장되지 않습니다. .. _libffi: https://sourceware.org/libffi/ cppyy ----- C++의 경우, _cppyy_\ 는 PyPy와 CPython 모두에서 사용할 수 있는 자동 바인딩 생성기입니다. _cppyy_\ 는 C++ 헤더 파일의 선언에 의존하여 Python에 대응하는 클래스, 함수, 변수 등을 동적으로 생성합니다. 대규모 프로그램에서 사용할 수 있도록 설계되었으며, 최신 C++을 지원합니다. PyPy에서는 내장된 ``_cppyy`` 모듈을 활용하여, JIT가 언어 간 오버헤드 대부분을 제거할 수 있게 합니다. 설치하려면 `` -mpip install cppyy``\ 를 실행합니다. 자세한 내용은 `full documentation`_\ 에서 확인할 수 있습니다. .. _`full documentation`: https://cppyy.readthedocs.org/ .. _yeokja-doc-e5902fbb65244a53-target-2668: RPython 혼합 모듈(Mixed Modules) -------------------------------- 이것은 PyPy에서 내장 확장 모듈을 작성하는 내부적인 방법입니다. 이는 어떤 서드파티 모듈도 사용할 수 없습니다: 확장 모듈은 독립적으로 로드 가능한 DLL이 아니라 *내장(built-in)*\ 되어 있는 것이기 때문입니다. 이것은 특수한 경우를 위해 예약되어 있습니다: 예를 들어 JIT의 세부 사항에 직접 접근할 수 있게 해주어, 사용자 코드와의 상호작용을 조정할 수 있게 합니다. 이것이 numpy 모듈이 개발되고 있는 방식입니다.