2009-07-22 5 views
3

지금은 아직 FFI가없는 스크립팅 언어로 작업하고 있습니다. 필자는 멋진 괴짜처럼 글을 쓰고 싶다고 가정 할 때 가장 편리한 방법을 알고 싶습니다. 스크립팅 언어 자체에 FFI를 쓰고 싶습니다.외국 함수 인터페이스를 구현하기위한 지침

내가 프로그래밍해야하는 프로그래밍 언어는 C입니다. 그래서 기초에 관해서는 libdl.so가 제 가장 친한 친구라는 것을 압니다. 분명히 내가 필요로 할 것이지만 그 중 가장 중요한 것은 아닙니다.

그 밖에 내가 무엇이 필요한지에 대해서만 약간의 아이디어가 있습니다. 나는 파이썬 ctypes가 가지고있는 것과 비슷한 행동을 FFI에서 얻고 싶다.

멀리까지 알아야 할 사항은 무엇입니까? 처리해야 할 데이터 구조가있는 심각한 마법이 있음을 압니다. 스크립팅 언어 자체에서 심각한 마법의 대부분을 수행 할 수 있도록 어떻게 관리합니까? 나는 외계 기능 인터페이스 이상의 많은 것을 위해 그러한 마법을 사용하고 싶다. 예를 들어 C와 비슷한 이진 데이터를 파일에 전달하려고 할 수 있습니다.

답변

3

나는 적절한 대답이 detailed essay이 필요하다고 생각합니다.

기본적으로 호스트 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)); 

여기 더 구현 세부 사항을 논의 할 수 없습니다 : 여기에 몇 가지 C 함수의 의사와 스크립트의 사용이다.

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

+0

감사합니다. 설명 된 것이 가장 단순 할지라도 바인딩을 사용하여 C 부분을 작성해야합니다. 나는 그것이 나의 필요에 받아 들일 수 없다고 생각한다. – Cheery

+0

이 질문에 게시 된 링크가 지금 고장난 것으로 보입니다 - 왜 그런가요? –

1

확인 http://sourceware.org/libffi/

: 것을 우리가 쓰레기 수집에 대해 아무것도 등, 말했다하지 않은 참고 다음 링크에서 확인할 수

소식통이 더 이동 도움이 될 수 있습니다 호출 규칙은 다른 아키텍처에서 달라질 것이라는 점을 기억하십시오. 즉 함수 변수가 스택에 팝되는 순서는 무엇입니까? 나 자신의 스크립팅 언어로 작성하는 것에 대해 잘 모르겠다. Java JNI가 libffi를 사용한다는 것을 알고있다.