RPython용 외부 함수 인터페이스(Foreign Function Interface)¶
목적¶
이 문서는 C와 같은 저수준 백엔드를 중심으로 RPython 언어를 위한 FFI를 설명합니다. RPython 수준에서 저수준(C) 함수를 선언하고 호출하는 방법을 설명합니다.
저수준 외부 함수 선언¶
RPython에서 외부 C 함수를 선언하는 것은 쉽지만, 저수준 함수는 (lltype.Signed나 lltype.Array 같은) 저수준 타입을 받으며 메모리 관리는 직접 해야 한다는 점을 기억해야 합니다. 함수를 선언하려면 다음과 같이 작성합니다:
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에 대한 자세한 내용은 cbuild를 참조하십시오.
타입¶
rffi에는 CCHARP(char*), SIZE_T(size_t) 등 C 구조체를 위해 선언된 다양한 타입이 있습니다. 자세한 내용은 해당 파일을 참고하십시오. 원시 타입이 아닌 타입의 인스턴스는 lltype.malloc을 호출해 직접 할당하고 lltype.free로 해제해야 하며, 두 경우 모두 키워드 인자 flavor=’raw’를 지정해야 합니다. 문자열 -> char* 변환기 같은 여러 헬퍼가 있으니 자세한 내용은 소스를 참고하십시오.
함수를 외부 함수로 등록하기¶
외부 함수의 저수준 구현을 제공했다면, 어떤 라이브러리 함수(예: os.open)에 대한 호출을 그러한 호출로 감싸는 것이 좋습니다. 이를 위해 extfunc.py에 register_external 루틴이 있습니다. 이 루틴은 그러한 함수를 선언하기 위한 편리한 API를 제공하며, llimpl을 인자로 받고 llinterp가 수행하는 테스트를 위한 가짜 저수준 구현으로 llfakeimpl도 선택적으로 받습니다.