Nos últimos dias precisei trabalhar com a interface entre códigos escritos em Lua e em C. Pesquisei um pouco sobre o assunto e pude perceber que apesar de um pouco complicada e de não ser tão bem documentada, a API de Lua para C funcionava muito bem. Resumidamente, a comunicação entre os programas se dá através de uma “pilha virtual”, acessada pelo programa em C. Cada elemento dessa pilha representa um valor de Lua, que pode ser utilizado em C através de funções de conversão como lua_tostring, ou lua_tonumber.
Até aí tudo bem. Alguns defeitos dessa interface começam a aparecer quando é preciso lidar com tipos de dados mais complexos, como tabelas em Lua, por exemplo. Abaixo está um trecho de czódigo em C para colocar uma tabela na pilha:
lua_newtable(L);
lua_pushstring(L,”indice1″);
lua_pushnumber(L,15);
lua_settable(L,2);
lua_pushstring(L,”indice2″);
lua_pushstring(L,”testedatabela”);
lua_settable(L,2);
Como é possível ver no código, é preciso dar um push no índice, outro push no valor e chamar a função lua_settable passando o índice da tabela na pilha como argumento para cada elemento. Para uma tabela com poucos elementos, não há complicações. O problema é quando esse procedimento precisa ser realizado para tabelas bem maiores.
Essa complicação toda me motivou a procurar como seria essa interface em outras linguagens. Acabei decidindo pesquisar uma solução em Python. Logo de cara já encontrei uma documentação muito mais clara e completa, e, no pouco tempo que passei estudando, tive a impressão de que a interface se dá de maneira bem mais simples. A função abaixo passa para o programa em Python um dicionário semelhante a tabela em Lua construída acima:
Py_BuildValue(“{siss}”,”indice1″,15,”indice2″,”testedatabela”);
A função Py_BuildValue é responsável pela comunicação com o código em Python. O funcionamento dela se dá através de strings de formatação, formadas por unidades de formatação que representam um objeto Python. Através dessas strings, é possível passar, sem maiores complicações, inteiros, strings, dicionários, listas e outros tipos de dados entre os programas em C e Python. Nesse exemplo, a string “{siss}” indica que o objeto Python gerado será um dicionário, e cada conjunto de dois valores em C consecutivos adiciona um item a esse dicionário.
Para mais detalhes, veja:
Lua/C API
Python/C API
wow !!
its very interesting article.
Nice post.
realy gj
thx 🙂