RPython을 위한 외부 함수 인터페이스(Foreign Function Interface)¶
목적¶
이 문서는 C와 같은 저수준 백엔드에 중점을 두어 RPython 언어를 위한 FFI를 설명합니다. RPython 수준에서 저수준(C) 함수를 선언하고 호출하는 방법을 설명합니다.
저수준 외부 함수 선언¶
RPython에서 외부 C 함수를 선언하는 것은 쉽지만, 저수준 함수는 (lltype.Signed나 lltype.Array 같은) 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에 대한 더 자세한 정보는 cbuild를 참고하십시오.
형(型)¶
CCHARP(char*), SIZE_T(size_t) 등과 같이 C 구조체를 위해 선언된 다양한 타입이 rffi에 있습니다. 자세한 내용은 파일을 참고하십시오. 비원시(non-primitive) 타입의 인스턴스는 lltype.malloc 호출로 직접 할당해야 하고 lltype.free로 해제해야 하며, 이때 둘 다 키워드 인자 flavor=’raw’를 사용합니다. string -> char* 변환기 같은 여러 헬퍼가 있으니, 자세한 내용은 소스를 참고하십시오.
외부 함수로 함수 등록하기¶
외부 함수의 저수준 구현을 제공했다면, os.open과 같은 라이브러리 함수 호출을 그러한 호출로 감싸면 좋을 것입니다. 이를 위해 extfunc.py에 위치한 register_external이라는 루틴이 있으며, 이 루틴은 그러한 함수들을 선언하기 위한 훌륭한 API를 제공하는데, llimpl을 인자로 전달하고 llinterp가 수행하는 테스트를 위한 가짜 저수준 구현으로서 llfakeimpl을 최종적으로 전달합니다.