Desarrollé un pequeño lenguaje de script y recién comencé a escribir los primeros enlaces de bibliotecas nativas. Esta es prácticamente la primera vez que escribo una extensión nativa a un lenguaje de script, así que me he encontrado con un problema conceptual.
Me gustaría escribir código de pegamento para bibliotecas populares para que puedan usarse desde este lenguaje, y debido al diseño del motor que he escrito, esto se logra utilizando una matriz de C que struct
describe el nombre de la función visible por el máquina virtual, junto con un puntero de función.
Por lo tanto, un enlace nativo es realmente solo una variable de matriz global, y ahora obviamente debo darle un nombre (preferiblemente bueno). En C, es idiomático poner las propias funciones en un "espacio de nombres" anteponiendo un prefijo personalizado a los nombres de las funciones, como en myscript_parse_source()
o myscript_run_bytecode()
. El nombre personalizado idealmente describirá el nombre de la biblioteca de la que forma parte. Aquí surge la confusión.
Digamos que estoy escribiendo un enlace para libcURL
. En este caso, parece razonable llamar a mi biblioteca de extensiones curl_myscript_binding
, así:
MYSCRIPT_API const MyScriptExtFunc curl_myscript_lib[10];
Pero ahora esto choca con el curl
espacio de nombres. (Incluso he pensado en llamarlo, curlmyscript_lib
pero desafortunadamente, libcURL no usa exclusivamente el curl_
prefijo: las API públicas contienen macros como CURLCODE_*
y CURLOPT_*
, por lo que supongo que esto también saturaría el espacio de nombres).
Otra opción sería declararlo como myscript_curl_lib
, pero eso es bueno siempre que yo sea el único que escriba enlaces (ya que sé lo que estoy haciendo con mi espacio de nombres). Tan pronto como otros contribuyentes comienzan a agregar sus propios enlaces nativos, ahora saturan el myscript
espacio de nombres. (He investigado un poco, y parece que, por ejemplo, la unión Perl cURL sigue este patrón. No estoy seguro de qué debería pensar al respecto ...)
Entonces, ¿cómo sugiere que nombre mis variables? ¿Hay alguna pauta general que deba seguirse?
SomeLang_register_extension("curl", "H2CO3", "000.001.000", the_extension)
dondethe_extension
apunta a alguna estructura de extensión pero no es visible a nivel mundial. Su idioma mantendría una estructura de datos interna para clasificar las extensiones por nombre, versión y autor.