Язык Lua создавался специально как язык для написания дополнений, расширений к программе
и поэтому преследовались две противоположные цели - язык должен быть, с одной стороны, достаточно простым,
с небольшим интерпретатором, но, с другой стороны, достаточно мощным, поддерживающим основные
возможности языков программирования, на которых будет написана основная программа, и расширяемым для
манипулирования самыми разнообразными объектами основной программы. При создании Lua использовали
синтаксис и возможности языков CLU (предок C++) и Modula-2 (наследник Pascal), а вместо полной
реализации концепций объектно-ориентированного программирования были взяты идеи прототипного
ООП из языка Self, так как требовалось обращаться к уже готовым объектам, а не создавать
собственные абстракции (в JavaScript сделали аналогично).
Плюсы:
* библиотека для интерпретации всего 300Kб;
* простой синтаксис, небольшое количество встроенных типов данных;
* поддерживает основные парадигмы программирования: императивное, структурное, объектно-ориентированное, функциональное программирование и даже обобщённое (побочный эффект, так как используется динамическая типизация);
* высокая скорость компиляции, в несколько раз быстрее чем у Python или JavaScript, и можно скомпилировать код для минимизации времени запуска или предотвращения модификации кода;
* есть возможность перегружать операции (23 операции: +, -, < и т.д.) и создавать итераторы (for in ...) для любых типов данных;
* API библиотеки является частью описания языка;
* можно легко добавить новые функции через загрузку динамических библиотек;
* для языков с рефлексией (C#, Java) есть библиотеки, которые автоматически транслируют интерфейс объектов основной программы в объекты пользовательских типов данных Lua.
Минусы:
* чистый интерпретатор, без JIT, поэтому не подходит для сложных вычислительных задач;
* мало встроенных функций, но Lua и не предполагает использования в виде отдельного интерпретатора;
* API немного меняется с каждой версией, и нужно вносить изменения в свой код.