[[분류:프로그래밍]] [include(틀:다른 뜻1, other1=프리온에 의한 질병, rd1=치명적 가족성 불면증, other2=이나즈마 일레븐의 등장 대회, rd2=풋볼 프런티어)] [목차] == 개요 == {{{+1 Foreign Function Interface, FFI}}} 한 [[프로그래밍 언어]](이하 A)에서 다른 프로그래밍 언어(이하 B)의 코드를 호출하기 위한 인터페이스를 말한다. A로는 불가능한 일이 B로는 가능한 경우, A로는 비효율적인 일이 B로는 효율적인 경우, B로 쓰여진 코드가 이미 제공하는 기능을 A로의 번역없이 그대로 사용하고 싶은 경우 등에서 A는 FFI를 통해 B의 코드를 이용할 수 있다. [[C언어]]는 역사가 오래 되었을 뿐만 아니라 그 동안 축적된 코드베이스(code base)가 풍부하므로 많은 언어들이 C언어로 작성한 코드를 사용하기 위한 FFI를 가지고 있다. == 주요 프로그래밍 언어들(알파벳 순)의 FFI == * [[ActionScript]] : [[AIR]]의 Native Extension * [[C++]] : [[C언어]]로 작성된 코드를 C++ 코드 내에서 특별한 처리 없이 직접 호출 가능하다. C에서 C++ 코드를 호출할 수 있도록 하려면 {{{extern "C"}}}를 사용한다. * [[D언어|D]] : [[https://dlang.org/spec/interfaceToC.html|C]]와 [[https://dlang.org/spec/cpp_interface.html|C++(일부)]], [[https://dlang.org/spec/objc_interface.html|Object C(일부)]]까지 가능하다. * [[Go(프로그래밍 언어)|Go]] : Go 소스 코드에 C 코드를 주석의 형태로 작성하고, Go가 기본적으로 제공하는 "C"라는 패키지를 임포트(import)해 사용하면 된다. 자세한 내용은 [[https://golang.org/cmd/cgo/|여기]]를 참고. * [[Haskell]] : 하스켈도 FFI를 지원한다. 자세한 내용은 [[https://wiki.haskell.org/Foreign_Function_Interface|여기]]를 참고. * [[.NET Framework]] 기반 언어들 : [[https://docs.microsoft.com/ko-kr/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview|동적 언어 런타임]]을 이용해서 Ruby와 Python을 쓸수 있다. * [[Ruby]] : [[https://github.com/ffi/ffi| Ruby ffi]] * [[JVM]] 언어 [[JNI]]를 사용하여 [[C언어]]와 상호작용 할 수 있다. * [[Java]] * [[Scala]] * [[Rust(프로그래밍 언어)|Rust]] : toml에 lib 형태로 저장한 crate방식으로 사용할 수 있다. == 관련 개념 == * [[API]] - [[소스 코드]] 사이의 인터페이스 * [[ABI]] - 컴파일된 바이너리 코드 간의 인터페이스 * [[호출규약]] - 바이너리 코드 간의 호출을 위한 규칙 * [[COM]] / [[DCOM]] / [[OLE]] / [[ActiveX]] * [[Name Mangling]](Name Decoration) * [[RPC]] - 원격 프로시저 호출 * [[SWIG]](Simplified Wrapper and Interface Generator) - 다양한 [[프로그래밍 언어]] 간의 인터페이스를 생성해 주는 [[오픈 소스]] 소프트웨어. * Transcompiler - 한 언어의 소스코드를 다른 언어의 것으로 또는 동일 언어의 구(舊)버전의 코드를 신(新)버전의 것으로 변환해 주는 컴파일러 (ex. babel javascript, scala.js)