외부 기능 인터페이스

Foreign function interface

Foreign Function Interface(FFI; 외부 함수 인터페이스)는 하나의 프로그래밍 언어로 작성된 프로그램이 루틴을 호출하거나 다른 언어로 작성된 서비스를 사용할 수 있는 메커니즘입니다.

명명

이 용어는 Common Lisp의 사양에서 유래했습니다.이 [1]규격은 언어간 호출을 위한 언어 기능을 명시적으로 나타냅니다.해스켈,[2] [3]러스트파이썬 프로그래밍 [4]언어에서도 공식적으로 사용되고 있습니다.다른 언어들은 다른 용어를 사용한다: Ada 프로그래밍 언어는 "언어 바인딩"에 대해 말하는 반면, Java는 FFI를 JNI(Java Native Interface) 또는 JNA(Java Native Access)라고 부른다.외부 기능 인터페이스는 이러한 서비스를 제공하는 메커니즘의 총칭이 되었습니다.

작동

외부 함수 인터페이스의 주요 기능은 하나의 프로그래밍 언어(호스트 언어 또는 FFI를 정의하는 언어)의 의미론 및 호출 규칙을 다른 언어(게스트 언어)의 의미론 및 규칙과 조합하는 것입니다.이 프로세스에서는 양쪽 모두의 런타임 환경 및/또는 애플리케이션 바이너리 인터페이스도 고려해야 합니다.이것은, 다음의 몇개의 방법으로 실시할 수 있습니다.

  • 호스트 언어 호출이 가능한 게스트 언어 함수를 특정 방법으로 지정 또는 구현하도록 요구하며, 대부분의 경우 일종의 호환성 라이브러리를 사용합니다.
  • 도구를 사용하여 게스트 언어 기능을 적절한 글루 코드로 자동으로 "랩"하여 필요한 변환을 수행합니다.
  • 래퍼 라이브러리 사용
  • 여러 언어를 사용할 수 있는 호스트 언어 기능 세트 제한예를 들어, C에서 호출된 C++ 함수는 (일반적으로) 기준 매개 변수를 포함하거나 예외를 발생시키지 않을 수 있습니다.

FFI는, 다음의 점에 의해 복잡해질 가능성이 있습니다.

  • 한쪽 언어가 Garbage Collection(GC; 가비지 컬렉션)을 지원하고 다른 한쪽 언어가 지원하지 않는 경우 GC 이외의 언어 코드가 다른 쪽 언어에서 GC를 실패시키는 원인이 되지 않도록 주의해야 합니다.예를 들어 JNI에서는 Java로부터 받은 오브젝트 참조를 유지하는 C코드는 이 사실을 Java 런타임 환경(JRE)에 "등록"해야 합니다.그렇지 않으면 Java는 C가 오브젝트를 완료하기 전에 오브젝트를 삭제할 수 있습니다(C코드는 C가 오브젝트를 더 이상 필요로 하지 않게 되면 해당 오브젝트에 대한 링크를 명시적으로 해방해야 합니다).
  • 복잡하거나 중요하지 않은 개체나 데이터 유형은 한 환경에서 다른 환경으로 매핑하기 어려울 수 있습니다.
  • 위의 매핑 문제로 인해 두 언어 모두 가변 객체의 동일한 인스턴스에 대한 참조를 유지할 수 없을 수 있습니다.
  • 가상 머신(VM)에서 1개 또는 2개의 언어가 실행되고 있는 경우가 있습니다.또, 양쪽의 언어가 있는 경우는, 이러한 언어가 다른 VM이 될 가능성이 있습니다.
  • 유형 시스템또는 객체 구성 모델 간과 같은 교차 언어 상속 및 기타 차이점이 특히 어려울 수 있습니다.

언어별

FFI의 예는 다음과 같습니다.

  • Ada 언어 바인딩 - 외부 함수를 호출할 수 있을 뿐만 아니라 비 Ada [5]코드에서 호출할 함수 및 메서드를 내보낼 수 있습니다.
  • C++는 언어들이 상당한 공통 서브셋을 공유하기 때문에 C와 사소한 FFI를 가지고 있습니다.의 주요 영향C++의 extern "C" 선언은 C++ 이름 망글링을 디세블로 합니다.
  • Clean은 C 또는 stdcall 호출 [6][7]규약에 따른 모든 언어로 양방향 FFI를 제공합니다.
  • CNI, GNU 컴파일러 환경에서 사용되는 JNI 대신 사용됩니다.
  • D는 C++같은 방법으로 외부 "C"에서 외부(C++)를 사용합니다.
  • Dart에는 모바일, 명령줄 및 서버 응용 프로그램의 네이티브 C 코드를 호출하기 위한 dart:fffi[8] 라이브러리가 포함되어 있습니다.
  • Python, Perl, Tcl Ruby와 같은 동적 언어는 모두 C/C++(또는 C/C++ 호출 규칙을 따르는 다른 언어)로 작성된 네이티브 코드에 쉽게 액세스할 수 있습니다.
  • Factor에는 C, Fortran, Objective-CWindows COM용 FFI가 있습니다.이러한 FFI를 사용하면 임의의 공유 라이브러리를 동적으로 Import 및 호출할 수 있습니다.
  • 일반적인 리스프와 해스켈FFI
  • Fortran 2003에는 모듈 ISO_C_BINDING이 있어 상호 운용 가능한 데이터 타입(내재 타입과 POD 구조 양쪽), 상호 운용 가능한 포인터, 상호 운용 가능한 글로벌 데이터스토어 및 Fortran에서 C를 호출하고 [9]C에서 Fortran을 호출하는 메커니즘이 있습니다.Fortran 2018 표준에서 개선되었습니다.
  • Go는 를 통해 C 코드를 직접 호출할 수 있습니다."C"의사 [10]처리
  • Java가 JavaScript로 컴파일되는 GWT에는 JSNI라는 FFI가 있어 Java 소스가 임의의 JavaScript 함수를 호출하고 JavaScript가 Java로 다시 호출할 수 있습니다.
  • Java와 C/C++ 사이의 인터페이스를 제공하는 JNI. Java가 배치된 대부분의 시스템에서 우선되는 시스템 언어입니다.JNA는 글루 코드를 작성하지 않고도 네이티브 라이브러리와의 인터페이스를 제공합니다.또 하나의 예는 JNR입니다.
  • Nim은 C, C++Objective-C소스를 사용할 수 있는 FFI를 가지고 있습니다.Javascript와도 인터페이스 할 수 있습니다.
  • Julia는 가지고 있다ccallC(및 기타 언어, 예를 들어 Fortran)[11]를 호출하는 키워드. 유사한 no-boilerplate 지원을 제공하는 패키지는 Python(OO 지원 및 GC 지원 제공), Java[12](Scala 등 기타 JDK 언어 지원) 및 R과 같은 일부 언어에서 사용할 수 있습니다.C++ 와의 인터랙티브한 사용은, Cxx.jl 패키지에서도 가능합니다.
  • PHP[13]C에 FFI를 제공합니다.
  • Rubyffi gem 또는 표준 라이브러리 바이올린을 통해 FFI를 제공합니다.
    요구하다 '실패'  libm = 만지작거리다.열리다(/lib/libm.so.6')  # 상당: 더블 플로어(이중 x); 바닥. = 만지작거리다::기능..신규(   libm.심볼(플로어),     # ptr은 바이올린의 참조 함수(또는 기호):핸들   [만지작거리다::타입_더블], # args는 ptr 함수에 전달되는 인수 배열입니다.   만지작거리다::타입_더블    # ret_type은 함수의 반환 유형입니다. )  # 동등: 바닥(3.14159); 바닥..불러(3.14159) #=> 3.0 
  • Python은 ctypescffi 모듈을 제공합니다.예를 들어 ctypes 모듈은 공유 라이브러리/DLL에서 C 함수를 즉시 로드하고 다음과 같이 Python과 C 시멘틱스 간에 간단한 데이터 유형을 자동으로 변환할 수 있습니다.
    수입품 ctype libc = ctype.CDLL(/lib/libc.so.6')  Linux/Unix에서의 수 t = libc.시간을(없음.)                   # 등가 C코드 : t = 시간(NULL) 인쇄물(t) 
  • P/Invoke: Microsoft 공용 언어 런타임과 네이티브 코드 간의 인터페이스를 제공합니다.
  • Racket에는 매크로에 기반한 네이티브 FFI가 있어 임의의 공유 라이브러리를 동적으로 [14][15]Import할 수 있습니다.
  • Raku는 Ruby, Python, Perl, Brainfuck, Lua, C, C++, Go, Scheme Guile/Gambit [16][17] Rust를 호출할 수 있습니다.
  • Rust는 다양한 표준 ABI와 [18]함께 기능하기 위한 외부 기능 인터페이스를 정의합니다.엘릭시르, 러슬러와 인터페이스하기 위한 도서관도 있습니다.
  • Visual Basic에는 Unicode C 이외의 함수를 호출할 수 있는 선언적 구문이 있습니다.
  • Component Object Model의 기본 중 하나는 공통 인터페이스 형식입니다.이 형식은 기본적으로 문자열 및 배열에 Visual Basic과 동일한 유형을 사용합니다.
  • Lua적시 구현인 LuaJIT에는 "외부 C 함수를 호출하고 순수한 Lua [19]코드에서 C 데이터 구조를 사용할 수 있는" FFI가 있습니다.
  • PhoneGap(Apache Callback으로 불렸지만 현재는 Apache Cordova)은 HTML, CSS 및 JavaScript를 사용하여 네이티브 모바일 애플리케이션을 구축하기 위한 플랫폼입니다.또한 JavaScript 콜백 기능을 통해 FFI를 통해 Accelerometer, Camera(PhotoLibrary, SavedPhotoAlbum), Compass, Storage(SQL 데이터베이스 및 localStorage), 알림, 미디어 및 캡처(재생, 녹음, 오디오 및 비디오), 연락처(Address) 등 휴대폰 네이티브 기능의 메서드와 속성에 액세스할 수 있습니다.s book), 이벤트, 디바이스 및 접속 정보를 참조하십시오.[1], [2]
  • Wolfram Language는 WSTP(Wolfram Symbolic Transfer Protocol)라는 기술을 제공하며 C++, Java 등의 바인딩을 사용하여 다른 언어 간에 코드를 양방향 호출할 수 있습니다.NET 및 기타 언어
  • Zig는 빌트인을 사용하여 C에 FFI를 제공합니다.cImport기능합니다.[20]

또한 SWIG 등 많은 FFI를 자동으로 생성할 수 있습니다.그러나 확장 언어의 경우 확장 언어의 [22]본체가 더 작은 호스트 언어(예: GIMP용 작은[21] 플러그인 쓰기)의 게스트 호출 서비스인 경우 게스트와 호스트 관계의 의미 반전이 발생할 수 있습니다.

일부 FFI는 프리 스탠딩 함수로 제한되는 반면, 다른 FFI는 객체 또는 클래스에 포함된 함수 호출(메서드 호출이라고도 함)을 허용하며, 일부 FFI는 복잡한 데이터 유형 및/또는 객체의 언어 경계를 넘어 마이그레이션도 허용합니다.

대부분의 경우 FFI는 "고급" 언어로 정의되므로 하위 언어(일반적으로 C 또는 C++와 같은 시스템 언어)로 정의 및 구현된 서비스를 사용할 수 있습니다.일반적으로 OS의 API가 정의된 언어로 OS 서비스에 액세스하거나 성능을 고려하기 위해 이 작업을 수행합니다.

또한 많은 FFI는 호출된 언어가 호스트 언어로 서비스를 호출하는 수단도 제공합니다.

외부 함수 인터페이스라는 용어는 일반적으로 Microsoft 공통 언어 런타임과 같은 다국어 런타임에 사용되지 않습니다.이 런타임에서는 CLR 준거 언어가 다른 언어로 정의된 서비스를 사용할 수 있도록 하는 공통 "기판"이 제공됩니다(단, 이 경우 CLR에는 런타임 외부에서 호출하기 위한 FFI, P/Invoke가 포함됩니다).또한 Java Remote Method Invocation(RMI), RPC, CORBA, SOAPD-Bus 등의 많은 분산 컴퓨팅 아키텍처에서는 다양한 서비스를 다른 언어로 기술할 수 있습니다.이러한 아키텍처는 일반적으로 FFI로 간주되지 않습니다.

특수한 경우

언어들이 동일한 바이트 코드 VM(Clojure, Java, ElixirErlang 등)으로 컴파일되는 특수한 경우가 있습니다.인터페이스가 없기 때문에 엄밀히 말하면 FFI는 아니지만 사용자에게 동일한 기능을 제공합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "CFFI User Manual". common-lisp.org. Retrieved 2015-06-18.
  2. ^ "FFI Introduction". HaskellWiki. Retrieved 19 June 2015. Haskell's FFI is used to call functions from other languages (basically C at this point), and for C to call Haskell functions.
  3. ^ "std::ffi - Rust". Retrieved 1 April 2021. This module provides utilities to handle data across non-Rust interfaces, like other programming languages and the underlying operating system. It is mainly of use for FFI (Foreign Function Interface) bindings and code that needs to exchange C-like strings with other languages.
  4. ^ "CFFI documentation". Retrieved 19 June 2015. C Foreign Function Interface for Python. The goal is to provide a convenient and reliable way to call compiled C code from Python using interface declarations written in C.
  5. ^ "Interface to Other Languages". Adaic.org. Retrieved 2013-09-29.
  6. ^ "Foreign Export". Retrieved 2020-05-25.
  7. ^ "Calling C From Clean". Retrieved 2018-04-25.
  8. ^ "dart:ffi library". Retrieved 2020-01-01.
  9. ^ "'fortran-iso-c-binding' tag wiki". Stack Overflow.
  10. ^ "cgo — The Go Programming Language". Retrieved 2015-08-23.
  11. ^ "Calling C and Fortran Code · The Julia Language". docs.julialang.org. Retrieved 2018-02-11.
  12. ^ PyCall.jl: Package to call Python functions from the Julia language, JuliaPy, 2018-02-08, retrieved 2018-02-11
  13. ^ "PHP: FFI - Manual". The PHP Group. Retrieved 13 June 2019.
  14. ^ Eli Barzilay. "The Racket Foreign Interface". Docs.racket-lang.org. Retrieved 2013-09-29.
  15. ^ "TR600.pdf" (PDF). Archived from the original (PDF) on 2009-09-02. Retrieved 2013-09-29.
  16. ^ "Inline implementations". Retrieved 2017-08-15.
  17. ^ "Native Call". Retrieved 2017-08-15.
  18. ^ "Using extern Functions to Call External Code". Retrieved 2019-06-01.
  19. ^ Mike Pall. "FFI Library". Luajit.org. Retrieved 2013-09-29.
  20. ^ "Import from C Header File". Zig Software Foundation. Retrieved 2021-03-11.
  21. ^ "4. A sample script". Gimp.org. 2001-02-04. Retrieved 2013-09-29.
  22. ^ "Script-Fu and plug-ins for The GIMP". Gimp.org. Retrieved 2013-09-29.

외부 링크