Lua是一门嵌入式语言(embedded language),这就意味着Lua并不是一个独立(stand-alone)的包(package),而是一个可以供其它想使用Lua功能的程序链接的库(library)。实际上,Lua解释器程序lua(可执行文件)就是利用Lua库实现的一个小程序:读入文件或字符串,丢给Lua库去做处理。

Lua可以作为一个单独的库供其它程序使用以扩展其功能,因此可以被称之为“extension language”。同时,使用Lua的程序亦可以向Lua环境注册新的函数,这些函数用C(或其它语言)编写,提供一些不能由Lua直接实现的功能,所以Lua又是一门“extensible language”。

Lua作为extension language时,C代码作为控制,Lua作为库;而作为“extensible language”时,正好反过来,Lua代码作为控制,C作为库。CLua之间的接口称之为C API,它是一组供C访问Lua的函数。

C代码和Lua程序之间通过一个虚拟的栈(stack)来进行通信。几乎所有的C API调用都会访问栈上的数值,并且所有的C代码和Lua程序之间的数据交换都通过这个栈。另外,栈也可以用来保存一些临时数据。栈帮忙解决LuaC之间两个很重要的“impedance mismatch”问题:
a)Lua具有内存垃圾(garbage)回收机制,而C需要显示地释放;
b)Lua是动态类型(dynamic typing),而C是静态类型(static typing)。