문제

지금은 아직 FFI가없는 스크립팅 언어로 작업하고 있습니다. 시원한 괴짜처럼 쓰고 싶다고 가정 할 때 가장 편리한 방법을 알고 싶습니다. 스크립팅 언어 자체에 FFI를 쓰고 싶습니다.

인터페이스에 필요한 프로그래밍 언어는 C입니다. 기본 사항의 경우 libdl.so가 가장 친한 친구라는 것을 알고 있습니다. 분명히 그것은 내가 필요로하는 유일한 것이 아니라 가장 중요한 것입니다.

나는 그것에 필요한 것에 대한 약간의 아이디어 만 가지고 있습니다. Python CTypes와 FFI에서 비슷한 동작을 얻고 싶습니다.

이것을 멀리하기 위해 무엇을 알아야합니까? 나는 내가 다루어야 할 데이터 구조에 심각한 마법이 있다는 것을 알고 있습니다. 스크립팅 언어 자체에서 심각한 마법의 대부분을 할 수 있도록 어떻게 관리합니까? 나는 단순한 외국 기능 인터페이스 이상으로 그러한 마법을 사용했습니다. 예를 들어 C와 같은 이진 데이터를 파일에 전달할 수 있습니다.

도움이 되었습니까?

해결책

적절한 답변에는 a가 필요하다고 생각합니다 자세한 에세이.

기본적으로 라이브러리 로딩을위한 포장지와 호스트 OS가 제공하는 심볼 검색 기능이 있어야합니다. 언어의 핵심 데이터 유형이 단일 C 데이터 구조로 내부적으로 표현되면 라이브러리 개발자에게 요구 사항을 배치 할 수 있습니다. 이렇게하면 데이터 교환을 더 간단하게 구현할 수 있습니다. 언어에 어떤 형태의 패턴 표현식과 일류 기능이있는 경우, C 함수의 서명은 패턴으로 작성 될 수 있고 라이브러리는 동등한 서명과 일치하는 함수를 검색 할 수 있습니다. 다음은 C 함수의 일부 의사 코드와 스크립트의 사용법입니다.

/* arith.dll */
/* A sample C function callable from the scripting language. */

#include "my_script.h" // Data structures used by the script interpreter.

My_Script_Object* add(My_Script_Object* num1, My_Script_Object* num2)
{
   int a = My_Script_Object_To_Int(num1);
   int b = My_Script_Object_To_Int(num2);
   return Int_To_My_Script_Object(a + b);
}

/* End of arith.dll */

// Script using the dll
clib = open_library("arith.dll");

// if it has first-class functions
add_func = clib.find([add int int]);
if (cfunc != null)
{
   sum = add_func(10, 20);
   print(sum);
}

// otherwise
print(clib.call("add", 10 20));

여기에서 더 많은 구현 세부 정보를 논의 할 수 없습니다. 우리는 쓰레기 수집 등에 대해 아무 말도하지 않았습니다.

다음 링크에서 사용할 수있는 소스는 더 나아가는 데 도움이 될 수 있습니다.

http://common-lisp.net/project/cffi/ http://www.nongnu.org/cinvoke/

다른 팁

체크 아웃 http://sourceware.org/libffi/

호출 규칙은 다른 아키텍처에서 다른 순서 함수 변수가 스택에 튀어 나오는 것과 다를 것을 기억하십시오. 나는 당신의 스크립팅 언어로 그것을 쓰는 것에 대해 모른다. 나는 Java Jni가 libffi를 사용한다는 것을 알고있다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top