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도 선택적으로 받습니다.