Pergunta

Agora eu estou trabalhando em uma linguagem de script que ainda não tem um FFI.Eu gostaria de saber qual é a maneira mais fácil de obtê-la, supondo que eu gostaria de escrever como legal geeks fazer - eu gostaria de escrever a FFI na linguagem de script em si.

A linguagem de programação que eu preciso para fazer a interface é C.Assim, para o básico eu sei que libdl.assim é o meu melhor amigo.Obviamente, não é a única coisa que eu vou precisar, mas o mais importante deles.

Eu só tenho a ligeira ideias sobre o que mais eu preciso para ele.Gostaria de obter um comportamento semelhante do FFI como o que o python ctypes tem.

O que devo saber para chegar a este ponto?Eu sei que há alguns sérios magia com estruturas de dados que eu vou precisar para lidar com eles.Como faço para gerenciá-lo para que eu pudesse fazer mais do que séria mágica na linguagem de script em si?Eu teria que usar de magia para muito mais do que apenas a interface de função estrangeira.Por exemplo, eu poderia querer passar C-como dados binários para arquivos.

Foi útil?

Solução

Eu acho que uma resposta apropada requer um Ensaio detalhado.

Basicamente, deve haver invólucros para o carregamento da biblioteca e as instalações de pesquisa de símbolos fornecidas pelo sistema operacional host. Se os principais tipos de dados do seu idioma forem representados internamente com uma única estrutura de dados C, um requisito poderá ser colocado nos desenvolvedores da biblioteca que os parâmetros e o tipo de retorno das funções C exportados devem ser objetos dessa estrutura de dados. Isso tornará a troca de dados mais simples de implementar. Se o seu idioma tiver alguma forma de expressões de padrões e funções de primeira classe, a assinatura das funções C poderá ser gravada em padrões e a biblioteca procurou uma função que corresponda a uma assinatura equivalente. Aqui está algum pseudocódigo de uma função C e seu uso no script:

/* 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));

Não é possível discutir mais detalhes da implementação aqui. Observe que não dissemos nada sobre coleta de lixo, etc.

As fontes disponíveis nos links a seguir podem ajudá -lo a avançar mais:

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

Outras dicas

Confira http://sourceware.org/libffi/

Lembre-se as convenções de chamada serão diferentes em diferentes arquiteturas, i.é.que ordem as variáveis da função são exibidos na pilha.Eu não sei escrever sobre ele em sua própria linguagem de script, eu sei que o Java JNI usa libffi.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top