#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 != null
, ''''''}}}{{{#!if 넘어옴3 != null
, ''''''}}}{{{#!if 넘어옴4 != null
, ''''''}}}{{{#!if 넘어옴5 != null
, ''''''}}}{{{#!if 넘어옴6 != null
, ''''''}}}{{{#!if 넘어옴7 != null
, ''''''}}}{{{#!if 넘어옴8 != null
, ''''''}}}{{{#!if 넘어옴9 != null
, ''''''}}}{{{#!if 넘어옴10 != null
, ''''''}}}은(는) 여기로 연결됩니다.
#!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 프리온에 의한 질병}}}에 대한 내용은 [[치명적 가족성 불면증]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[치명적 가족성 불면증#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[치명적 가족성 불면증#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html 이나즈마 일레븐의 등장 대회}}}에 대한 내용은 [[풋볼 프런티어]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[풋볼 프런티어#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[풋볼 프런티어#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}
#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.
#!if 리스트 != null
{{{#!if 문서명1 != null
* {{{#!if 설명1 != null
프리온에 의한 질병: }}}[[치명적 가족성 불면증]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[치명적 가족성 불면증#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[치명적 가족성 불면증#|]] 부분}}}}}}{{{#!if 문서명2 != null
* {{{#!if 설명2 != null
이나즈마 일레븐의 등장 대회: }}}[[풋볼 프런티어]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[풋볼 프런티어#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[풋볼 프런티어#|]] 부분}}}}}}{{{#!if 문서명3 != null
* {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
* {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
* {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
* {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
* {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
* {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
* {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
* {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}
1. 개요
Foreign Function Interface, FFI한 프로그래밍 언어(이하 A)에서 다른 프로그래밍 언어(이하 B)의 코드를 호출하기 위한 인터페이스를 말한다. A로는 불가능한 일이 B로는 가능한 경우, A로는 비효율적인 일이 B로는 효율적인 경우, B로 쓰여진 코드가 이미 제공하는 기능을 A로의 번역없이 그대로 사용하고 싶은 경우 등에서 A는 FFI를 통해 B의 코드를 이용할 수 있다. C언어는 역사가 오래 되었을 뿐만 아니라 그 동안 축적된 코드베이스(code base)가 풍부하므로 많은 언어들이 C언어로 작성한 코드를 사용하기 위한 FFI를 가지고 있다.
2. 주요 프로그래밍 언어들(알파벳 순)의 FFI
- ActionScript : AIR의 Native Extension
- Ada : 언어 표준에서 C언어, 코볼, 포트란 코드를 호출하기 위한
pragma Import
키워드와 , Ada의 프로시저/함수를 해당 언어에서 호출할 수 있도록 내보내는pragma Export
키워드를 제공한다. C언어와 상호작용하는 코드의 작성을 위해Interfaces.C
패키지에 정의된 타입들을 사용할 수 있다. 코볼과 포트란도 관련된 패키지를 제공하고 있다. - C++ : C언어로 작성된 코드를 C++ 코드 내에서 특별한 처리 없이 직접 호출 가능하다. C에서 C++ 코드를 호출할 수 있도록 하려면
extern "C"
를 사용한다. - D : C와 C++(일부), Object C(일부)까지 가능하다.
- Go : Go 소스 코드에 C 코드를 주석의 형태로 작성하고, Go가 기본적으로 제공하는 "C"라는 패키지를 임포트(import)해 사용하면 된다. 자세한 내용은 여기를 참고.
- Haskell : 하스켈도 FFI를 지원한다. 자세한 내용은 여기를 참고.
- .NET Framework 기반 언어들 : 동적 언어 런타임을 이용해서 Ruby와 Python을 쓸수 있다.
- JVM 언어
JNI를 사용하여 C언어와 상호작용 할 수 있다. - Python:
ctype
빌트인 모듈을 사용한다. - Ruby : Ruby ffi
- Rust : toml에 lib 형태로 저장한 crate방식으로 사용하거나
extern "C"
블록을 사용한다.
3. 관련 개념
- API - 소스 코드 사이의 인터페이스
- ABI - 컴파일된 바이너리 코드 간의 인터페이스
- 호출규약 - 바이너리 코드 간의 호출을 위한 규칙
- COM / DCOM / OLE / ActiveX
- Name Mangling(Name Decoration)
- RPC - 원격 프로시저 호출
- SWIG(Simplified Wrapper and Interface Generator) - 다양한 프로그래밍 언어 간의 인터페이스를 생성해 주는 오픈 소스 소프트웨어.
- Transcompiler - 한 언어의 소스코드를 다른 언어의 것으로 또는 동일 언어의 구(舊)버전의 코드를 신(新)버전의 것으로 변환해 주는 컴파일러 (ex. babel javascript, scala.js)