You cannot do that because some languages implementations could have an ABI different and incompatible with the C one.
On current systems, C is very common and most (but not all) language implementations have an ABI and calling conventions compatible with the one from C. Notice that it is a property of the implementation (your C compiler and your operating system), not of the programming language.
If using C++, beware of name mangling and of exception handling. (e.g. C longjmp
is not friendly with C++ exceptions). Dynamic loading facilities like dlopen
and dlsym
are relevant to name mangling. So prefer an API using extern "C"
functions.
Memory management (notably with garbage collection) is also an issue. Study for examples foreign function interface of Ocaml and of SBCL and of Lua. Look into libffi.
You could provide some reflection facilities (e.g an API to query your API, e.g. like GTK introspection). You might try to provide a generic closure mechanism like in GObject-s.
You could use (or customize or adapt) code generators like SWIG. You might consider compiler plugins (e.g. GCC MELT extensions).
There is no silver bullet.