.. _rffi: RPython을 위한 외부 함수 인터페이스(Foreign Function Interface) =============================================================== 목적 ---- 이 문서는 C와 같은 저수준 백엔드에 중점을 두어 RPython 언어를 위한 FFI를 설명합니다. RPython 수준에서 저수준(C) 함수를 선언하고 호출하는 방법을 설명합니다. 저수준 외부 함수 선언 --------------------- RPython에서 외부 C 함수를 선언하는 것은 쉽지만, 저수준 함수는 (lltype.Signed나 lltype.Array 같은) :ref:`low level types `\ 를 받아들이며 메모리 관리는 수동으로 해야 한다는 점을 기억해야 합니다. 함수를 선언하려면 다음과 같이 작성합니다.:: from rpython.rtyper.lltypesystem import rffi external_function = rffi.llexternal(name, args, result) 여기서: * name - 함수의 C 레벨 이름(어떻게 표현되는지) * args - args의 저수준 타입들 * result - 결과의 로우 레벨 타입 선택적인 ``compilation_info`` 매개변수를 전달함으로써, C 수준의 인클루드, 라이브러리, 소스에 관한 추가 정보를 전달할 수 있습니다.:: from rpython.rtyper.lltypesystem import rffi from rpython.translator.tool.cbuild import ExternalCompilationInfo info = ExternalCompilationInfo(includes=[], libraries=[]) external_function = rffi.llexternal( name, args, result, compilation_info=info ) ExternalCompilationInfo에 대한 더 자세한 정보는 :source:`cbuild `\ 를 참고하십시오. 형(型) ------ CCHARP(char*), SIZE_T(size_t) 등과 같이 C 구조체를 위해 선언된 다양한 타입이 :source:`rffi `\ 에 있습니다. 자세한 내용은 파일을 참고하십시오. 비원시(non-primitive) 타입의 인스턴스는 lltype.malloc 호출로 직접 할당해야 하고 lltype.free로 해제해야 하며, 이때 둘 다 키워드 인자 flavor='raw'를 사용합니다. string -> char* 변환기 같은 여러 헬퍼가 있으니, 자세한 내용은 소스를 참고하십시오. 외부 함수로 함수 등록하기 ------------------------- 외부 함수의 저수준 구현을 제공했다면, os.open과 같은 라이브러리 함수 호출을 그러한 호출로 감싸면 좋을 것입니다. 이를 위해 :source:`extfunc.py `\ 에 위치한 `register_external`\ 이라는 루틴이 있으며, 이 루틴은 그러한 함수들을 선언하기 위한 훌륭한 API를 제공하는데, llimpl을 인자로 전달하고 llinterp가 수행하는 테스트를 위한 가짜 저수준 구현으로서 llfakeimpl을 최종적으로 전달합니다.