Articulo de referencia

Lua

Waldemar Celes Luiz Henrique de Figueiredo"},"developer":{"wt":""},"latest release version":{"wt":"{{wikidata|property|reference|edit |Q207316 |P348}}"},"latest release date":{"...

Lua ( / ˈ l . ə / , LOO ; del portugués : lua [ ˈlu(w)ɐ ] que significa luna ) es un lenguaje de programación ligero , de alto nivel y multiparadigma diseñado principalmente para su uso integrado en aplicaciones. [ 2 ] Lua es un software multiplataforma , ya que el intérprete del código de bytes compilado está escrito en ANSI C , [ 3 ] y Lua tiene una interfaz de programación de aplicaciones ( API ) C relativamente simple para integrarlo en aplicaciones. [ 4 ]

Lua surgió en 1993 como un lenguaje para extender aplicaciones de software y satisfacer la creciente demanda de personalización de la época. Ofrecía las funcionalidades básicas de la mayoría de los lenguajes de programación procedimentales , pero no incluía características más complejas o específicas de un dominio ; en cambio, incorporaba mecanismos para extender el lenguaje, permitiendo a los programadores implementar dichas características. Dado que Lua se concibió como un lenguaje de extensión general e integrable, sus diseñadores se centraron en mejorar su velocidad , portabilidad , extensibilidad y facilidad de uso en el desarrollo.

Historia

Lua fue creado en 1993 por Roberto Ierusalimschy , Luiz Henrique de Figueiredo y Waldemar Celes, miembros del Grupo de Tecnología de Gráficos por Computadora ( Tecgraf ) de la Pontificia Universidad Católica de Río de Janeiro , en Brasil .

Desde 1977 hasta 1992, Brasil mantuvo una política de fuertes barreras comerciales (conocida como reserva de mercado) para hardware y software informático , bajo la creencia de que Brasil podía y debía producir su propio hardware y software. En ese contexto, los clientes de Tecgraf no podían permitirse, ni política ni financieramente, comprar software personalizado en el extranjero; bajo la reserva de mercado, los clientes debían someterse a un complejo proceso burocrático para demostrar que sus necesidades no podían ser satisfechas por empresas brasileñas. Estas razones llevaron a Tecgraf a implementar desde cero las herramientas básicas que necesitaba. [ 5 ]

Los predecesores de Lua fueron los lenguajes de descripción y configuración de datos Simple Object Language (SOL) y Data-Entry Language (DEL). [ 6 ] Estos lenguajes fueron desarrollados de forma independiente en Tecgraf entre 1992 y 1993 para aportar flexibilidad a dos proyectos diferentes (ambos programas gráficos interactivos para aplicaciones de ingeniería en la empresa Petrobras ). SOL y DEL carecían de estructuras de control de flujo, y Petrobras sentía la creciente necesidad de dotarlos de plena capacidad de programación.

En La evolución de Lua , los autores del lenguaje escribieron: [ 5 ]

En 1993, el único competidor real era Tcl , diseñado específicamente para integrarse en aplicaciones. Sin embargo, Tcl tenía una sintaxis poco familiar, no ofrecía un buen soporte para la descripción de datos y solo funcionaba en plataformas Unix. Descartamos LISP y Scheme debido a su sintaxis poco amigable. Python aún estaba en sus inicios. En el ambiente de código abierto y de "hágalo usted mismo" que reinaba entonces en Tecgraf, era lógico que intentáramos desarrollar nuestro propio lenguaje de scripting  . Dado que muchos usuarios potenciales no eran programadores profesionales, el lenguaje debía evitar una sintaxis y semántica crípticas. La implementación del nuevo lenguaje debía ser altamente portable, ya que los clientes de Tecgraf utilizaban una gran variedad de plataformas informáticas. Finalmente, como esperábamos que otros productos de Tecgraf también necesitaran integrar un lenguaje de scripting, el nuevo lenguaje debía seguir el ejemplo de SOL y proporcionarse como una biblioteca con una API en C.

Lua 1.0 fue diseñado de tal manera que sus constructores de objetos, siendo entonces ligeramente diferentes del estilo ligero y flexible actual, incorporaron la sintaxis de descripción de datos de SOL (de ahí el nombre Lua: Sol significa "Sol" en portugués, y Lua significa "Luna"). La sintaxis de Lua para las estructuras de control se tomó prestada principalmente de Modula ( if, while, repeat/ until), pero también recibió influencia de CLU (asignaciones múltiples y retornos múltiples de llamadas a funciones, como una alternativa más simple a los parámetros de referencia o punteros explícitos ), C++ ("buena idea de permitir que una variable local se declare solo donde la necesitamos" [ 5 ] ), SNOBOL y AWK ( matrices asociativas ). En un artículo publicado en Dr. Dobb's Journal , los creadores de Lua también afirman que LISP y Scheme con su mecanismo de estructura de datos único y omnipresente (la lista ) fueron una gran influencia en su decisión de desarrollar la tabla como la estructura de datos principal de Lua. [ 7 ]

La semántica de Lua ha sido cada vez más influenciada por Scheme con el tiempo, [ 5 ] especialmente con la introducción de funciones anónimas y alcance léxico completo . Se agregaron varias características en nuevas versiones de Lua.

Las versiones de Lua anteriores a la 5.0 se publicaban bajo una licencia similar a la BSD . A partir de la versión 5.0, Lua se rige por la licencia MIT . Ambas son licencias de software libre permisivas y prácticamente idénticas.

Características

Lua se describe comúnmente como un lenguaje " multiparadigma ", que proporciona un pequeño conjunto de características generales que pueden extenderse para adaptarse a diferentes tipos de problemas. Lua no incluye soporte explícito para la herencia , pero permite su implementación mediante metatablas . Asimismo, Lua permite a los programadores implementar espacios de nombres , clases y otras características relacionadas utilizando su implementación de tabla única; las funciones de primera clase permiten el empleo de muchas técnicas de la programación funcional y el alcance léxico completo permite ocultar información de forma granular para garantizar el principio del mínimo privilegio .

En general, Lua se esfuerza por proporcionar metacaracterísticas simples y flexibles que se puedan extender según sea necesario, en lugar de ofrecer un conjunto de características específico para un paradigma de programación. Como resultado, el lenguaje base es ligero ; el intérprete de referencia completo solo ocupa unos 293 kB compilado [ 3 ] y se adapta fácilmente a una amplia gama de aplicaciones. 

Como lenguaje de tipado dinámico diseñado para usarse como lenguaje de extensión o lenguaje de scripting , Lua es lo suficientemente compacto como para adaptarse a diversas plataformas. Admite solo un pequeño número de estructuras de datos atómicas, como valores booleanos , números ( de punto flotante de doble precisión y enteros de 64 bits por defecto) y cadenas . Las estructuras de datos típicas, como matrices , conjuntos , listas y registros, se pueden representar utilizando la única estructura de datos nativa de Lua, la tabla, que es esencialmente una matriz asociativa heterogénea .

Lua implementa un pequeño conjunto de características avanzadas, como funciones de primera clase , recolección de basura , cierres , llamadas recursivas , coerción (conversión automática entre valores de cadena y numéricos en tiempo de ejecución), corrutinas (multitarea cooperativa) y carga dinámica de módulos .

Sintaxis

El programa clásico "¡Hola, mundo!" se puede escribir de la siguiente manera, con o sin paréntesis: [ 8 ] [ a ]

imprimir ( "¡Hola, mundo!" )
Imprimir "¡Hola, mundo!"

La declaración de una variable, sin valor.

variable local

La declaración de una variable con un valor de 1000 (mil)

Estudiantes locales = 1000

En Lua, un comentario comienza con un guion doble y se extiende hasta el final de la línea, al igual que en Ada , Eiffel , Haskell , SQL y VHDL . Las cadenas de varias líneas y los comentarios se marcan con corchetes dobles.

-- Comentario de una sola línea --[[ Comentario de varias líneas --]]

La función factorial se implementa en este ejemplo:

función factorial ( n ) local x = 1 para i = 2 , n hacer x = x * i fin devolver x fin

Flujo de control

Lua tiene un tipo de prueba condicionalif then end : con construcciones de control de ejecución elsey opcionales.elseif then

La if then enddeclaración genérica requiere las tres palabras clave:

Si condición entonces --fin del cuerpo de la instrucción

Un ejemplo de una ifdeclaración

Si x ~= 10 , entonces imprime ( x ) fin

La elsepalabra clave se puede agregar con un bloque de instrucciones adjunto para controlar la ejecución cuando la ifcondición se evalúa como false:

Si la condición entonces --cuerpo de la instrucción si no --cuerpo de la instrucción fin

Un ejemplo de una if elsedeclaración

Si x == 10, entonces imprime ( 10 ) ; de lo contrario, imprime ( x ) .

La ejecución también puede controlarse según múltiples condiciones utilizando las elseif thenpalabras clave:

if condición then --cuerpo de la instrucción elseif condición then --cuerpo de la instrucción else -- opcional --opcional cuerpo de la instrucción predeterminado end

Un ejemplo de una if elseif elsedeclaración

Si x == y, entonces imprime ( "x = y" ). Si no, si x == z , imprime ( "x = z" ). Si no , imprime opcionalmente ( "x no es igual a ninguna otra variable" ) .

Lua tiene cuatro tipos de bucles condicionales: el whilebucle , el repeatbucle (similar a un do whilebucle ), el forbucle numérico y el forbucle genérico.

--condición = verdaderomientras condición hacer --declaraciones finrepetir --instrucciones hasta que se cumpla la condiciónpara i = first , last , delta hacer --delta puede ser negativo, lo que permite que el bucle for cuente hacia atrás o hacia adelante --instrucciones --ejemplo: print(i) fin

Este forbucle genérico iteraría sobre la tabla _Gutilizando la función iteradora estándar pairs, hasta que devuelva nil:

para clave , valor en pares ( _G ) hacer imprimir ( clave , valor ) fin

Los bucles también pueden anidarse (colocarse dentro de otro bucle).

cuadrícula local = { { 11 , 12 , 13 }, { 21 , 22 , 23 }, { 31 , 32 , 33 } }para y , fila en pares ( cuadrícula ) hacer para x , valor en pares ( fila ) hacer imprimir ( x , y , valor ) fin fin

Funciones

El tratamiento que Lua da a las funciones como valores de primera clase se muestra en el siguiente ejemplo, donde se modifica el comportamiento de la función print:

hacer local oldprint = print -- Almacenar la función print actual como función oldprint print ( s ) --[[ Redefinir la función print. La función print habitual aún se puede usar  a través de oldprint. La nueva tiene solo un argumento.]] oldprint ( s == "foo" and "bar" or s ) end end

Cualquier llamada futura a printahora se enrutará a través de la nueva función, y debido al alcance léxico de Lua , la antigua función print solo será accesible por la nueva función print modificada.

Lua también admite cierres , como se muestra a continuación:

function addto ( x ) -- Devuelve una nueva función que suma x al argumento return function ( y ) --[[ Cuando nos referimos a la variable x, que está fuera del  ámbito actual y cuya vida útil sería más corta que la de esta  función anónima, Lua crea un cierre.]] return x + y end end fourplus = addto ( 4 ) print ( fourplus ( 3 )) -- Imprime 7--Esto también se puede lograr llamando a la función de la siguiente manera: print ( addto ( 4 )( 3 )) --[[ Esto se debe a que estamos llamando a la función devuelta por 'addto(4)' con el argumento '3' directamente.  Esto también ayuda a reducir el costo de datos y a mejorar el rendimiento si se llama de forma iterativa.]]

xSe crea un nuevo cierre para la variable cada vez addtoque se llama a la función, de modo que cada nueva función anónima devuelta siempre acceda a su propio xparámetro. El recolector de basura de Lua gestiona el cierre, al igual que cualquier otro objeto.

Tablas

Las tablas son las estructuras de datos más importantes (y, por diseño, el único tipo de dato compuesto integrado ) en Lua y constituyen la base de todos los tipos creados por el usuario. Son matrices asociativas con la adición de una clave numérica automática y una sintaxis especial.

Una tabla es un conjunto de pares clave-dato, donde los datos se referencian mediante una clave; en otras palabras, es una matriz asociativa heterogénea con hash .

Las tablas se crean utilizando la {}sintaxis del constructor.

a_table = {} -- Crea una tabla nueva y vacía

Las tablas siempre se pasan por referencia (véase Llamada mediante compartición ).

Una clave (índice) puede ser cualquier valor excepto nilNaN , incluidas las funciones .

a_table = { x = 10 } -- Crea una nueva tabla, con una entrada que asigna "x" al número 10. print ( a_table [ "x" ]) -- Imprime el valor asociado con la clave de cadena, en este caso 10. b_table = a_table b_table [ "x" ] = 20 -- El valor en la tabla se ha cambiado a 20. print ( b_table [ "x" ]) -- Imprime 20. print ( a_table [ "x" ]) -- También imprime 20, porque a_table y b_table se refieren a la misma tabla.

Una tabla se usa frecuentemente como estructura (o registro ) utilizando cadenas como claves. Debido a que este uso es muy común, Lua cuenta con una sintaxis especial para acceder a dichos campos. [ 10 ]

punto = { x = 10 , y = 20 } -- Crea una nueva tabla print ( punto [ "x" ]) -- Imprime 10 print ( punto . x ) -- Tiene exactamente el mismo significado que la línea anterior. La notación de punto, más fácil de leer, es solo azúcar sintáctico.

Al utilizar una tabla para almacenar funciones relacionadas, esta puede funcionar como un espacio de nombres.

Punto = {}Punto.nuevo = función ( x , y ) return { x = x , y = y } -- return {["x"] = x, ["y"] = y } finPunto.set_x = función ( punto , x ) punto.x = x -- punto["x" ] = x ; fin

A las tablas se les asigna automáticamente una clave numérica, lo que permite utilizarlas como un tipo de dato de matriz . El primer índice automático es 1 en lugar de 0, como ocurre en muchos otros lenguajes de programación (aunque se permite un índice explícito de 0).

Una clave numérica 1es distinta de una clave de cadena "1".

array = { "a" , "b" , "c" , "d" } -- Los índices se asignan automáticamente. print ( array [ 2 ]) -- Imprime "b". La indexación automática en Lua comienza en 1. print ( # array ) -- Imprime 4. # es el operador de longitud para tablas y cadenas. array [ 0 ] = "z" -- Cero es un índice válido. print ( # array ) -- Sigue imprimiendo 4, ya que los arrays de Lua están basados ​​en 1.

La longitud de una tabla tse define como cualquier índice entero ntal que t[n]no sea nily t[n+1]sea nil; además, si t[1]es nil, npuede ser cero. Para un arreglo regular, con valores no nulos desde 1 hasta un dado n, su longitud es exactamente que n, el índice de su último valor. Si el arreglo tiene "huecos" (es decir, valores nulos entre otros valores no nulos), entonces #tpuede ser cualquiera de los índices que preceden directamente a un nilvalor (es decir, puede considerar cualquier valor nulo como el final del arreglo). [ 11 ]

ExampleTable = { { 1 , 2 , 3 , 4 }, { 5 , 6 , 7 , 8 } } print ( ExampleTable [ 1 ][ 3 ]) -- Imprime "3" print ( ExampleTable [ 2 ][ 4 ]) -- Imprime "8"

Una tabla puede ser una matriz de objetos.

function Point ( x , y ) -- Constructor de objeto "Point" return { x = x , y = y } -- Crea y devuelve un nuevo objeto (tabla) end array = { Point ( 10 , 20 ), Point ( 30 , 40 ), Point ( 50 , 60 ) } -- Crea un array de puntos -- array = { { x = 10, y = 20 }, { x = 30, y = 40 }, { x = 50, y = 60 } }; print ( array [ 2 ]. y ) -- Imprime 40

Normalmente, usar un mapa hash para emular un array es más lento que usar un array real; sin embargo, las tablas de Lua están optimizadas para usarse como arrays para ayudar a evitar este problema. [ 12 ]

Metatablas

La semántica extensible es una característica clave de Lua, y la metatabla permite una potente personalización de las tablas. El siguiente ejemplo demuestra una tabla "infinita". Para cualquier n, fibs[n]se obtendrá el n-ésimo número de Fibonacci mediante programación dinámica y memorización .

fibs = { 1 , 1 } -- Valores iniciales para fibs[1] y fibs[2]. setmetatable ( fibs , { __index = function ( values ​​, n ) --[[__index es una función predefinida por Lua,  se llama si la clave "n" no existe.]] values ​​[ n ] = values ​​[ n - 1 ] + values ​​[ n - 2 ] -- Calcular y memorizar fibs[n]. return values ​​[ n ] end })

Programación orientada a objetos

Aunque Lua no cuenta con un concepto de clases integrado , la programación orientada a objetos puede emularse mediante funciones y tablas. Un objeto se forma al colocar métodos y campos en una tabla. La herencia (tanto simple como múltiple) puede implementarse con metatablas , delegando métodos y campos inexistentes a un objeto padre.

En estas técnicas no existe el concepto de "clase"; en su lugar, se utilizan prototipos , similares a los de Self o JavaScript . Los nuevos objetos se crean mediante un método de fábrica (que construye nuevos objetos desde cero) o clonando un objeto existente.

Creación de un objeto vectorial básico :

local Vector = {} local VectorMeta = { __index = Vector }función Vector.new ( x , y , z ) -- El constructor devuelve setmetatable ( { x = x , y = y , z = z } , VectorMeta ) finfunción Vector.magnitud ( self ) -- Otro método devuelve math.sqrt ( self.x ^ 2 + self.y ^ 2 + self.z ^ 2 ) finlocal vec = Vector.new ( 0 , 1 , 0 ) -- Crea un vector print ( vec.magnitude ( vec ) ) -- Llama a un método (salida: 1) print ( vec.x ) -- Accede a una variable miembro ( salida : 0)

Aquí, setmetatablele indica a Lua que busque un elemento en la Vectortabla si no está presente en vecella. , que es equivalente a , primero busca el elemento en la tabla . La tabla no tiene un elemento, pero su metatabla delega en la tabla para el elemento cuando no se encuentra en la tabla.vec.magnitudevec["magnitude"]vecmagnitudevecmagnitudeVectormagnitudevec

Lua proporciona cierta sintaxis simplificada para facilitar la orientación a objetos. Para declarar funciones miembro dentro de una tabla prototipo, se puede usar , que es equivalente a . Llamar a métodos de clase también utiliza los dos puntos: es equivalente a .functiontable:func(args)functiontable.func(self,args)object:func(args)object.func(object,args)

Teniendo esto en cuenta, aquí hay una clase correspondiente con :azúcar sintáctico:

Vector local = {} Vector . __index = Vectorfunción Vector : new ( x , y , z ) -- El constructor -- Dado que la definición de la función utiliza dos puntos, -- su primer argumento es "self", que se refiere -- a "Vector" return setmetatable ({ x = x , y = y , z = z }, self ) endfunción Vector : magnitud () -- Otro método -- Referencia el objeto implícito usando self return math.sqrt ( self . x ^ 2 + self . y ^ 2 + self . z ^ 2 ) endlocal vec = Vector : new ( 0 , 1 , 0 ) -- Crea un vector print ( vec : magnitude ()) -- Llama a un método (salida: 1) print ( vec . x ) -- Accede a una variable miembro (salida: 0)

Herencia

Es posible utilizar metatablas para imitar el comportamiento de la herencia de clases en Lua. [ 13 ] En este ejemplo, permitimos que los vectores tengan sus valores multiplicados por una constante en una clase derivada.

Vector local = {} Vector . __index = Vectorfunción Vector : new ( x , y , z ) -- El constructor -- Aquí, self se refiere al método "new" de la clase que llamemos. En una clase derivada, self será la clase derivada; en la clase Vector, self será Vector. return setmetatable ({ x = x , y = y , z = z }, self ) endfunción Vector : magnitud () -- Otro método -- Referencia el objeto implícito usando self return math.sqrt ( self . x ^ 2 + self . y ^ 2 + self . z ^ 2 ) end-- Ejemplo de herencia de pseudoclase local VectorMult = {} VectorMult . __index = VectorMult setmetatable ( VectorMult , Vector ) -- Hacer que VectorMult sea hijo de Vectorfunción VectorMult : multiplicar ( valor ) self.x = self.x * valor self.y = self.y * valor self.z = self.z * valor devolver self finlocal vec = VectorMult : new ( 0 , 1 , 0 ) -- Crea un vector print ( vec : magnitude ()) -- Llama a un método (salida: 1) print ( vec . y ) -- Accede a una variable miembro (salida: 1) vec : multiply ( 2 ) -- Multiplica todos los componentes del vector por 2 print ( vec . y ) -- Accede al miembro de nuevo (salida: 2)

También es posible implementar herencia múltiple ; __indexpuede ser una función o una tabla. [ 14 ] También se puede realizar sobrecarga de operadores ; las metatablas de Lua pueden tener elementos como __add, __suby así sucesivamente. [ 15 ]

Implementación

Los programas Lua no se interpretan directamente desde el archivo de texto Lua, sino que se compilan en bytecode, que luego se ejecuta en la máquina virtual (VM) de Lua. El proceso de compilación suele ser invisible para el usuario y se realiza durante la ejecución , especialmente cuando se utiliza un compilador de compilación justo a tiempo (JIT), pero puede realizarse sin conexión para aumentar el rendimiento de carga o reducir el consumo de memoria del entorno anfitrión al omitir el compilador. El bytecode de Lua también puede generarse y ejecutarse desde dentro de Lua, utilizando la dumpfunción de la biblioteca de cadenas y las load/loadstring/loadfilefunciones. La versión 5.5.0 de Lua está implementada en aproximadamente 32 000 líneas de código C. [ 3 ]

Al igual que la mayoría de las CPU, y a diferencia de la mayoría de las máquinas virtuales (que se basan en pilas ), la máquina virtual de Lua se basa en registros y, por lo tanto, se asemeja más al diseño de la mayoría del hardware. La arquitectura de registros evita la copia excesiva de valores y reduce el número total de instrucciones por función. La máquina virtual de Lua 5 es una de las primeras máquinas virtuales puras basadas en registros que tuvo un uso generalizado. [ 16 ] Parrot y Dalvik de Android son otras dos máquinas virtuales basadas en registros bien conocidas. La máquina virtual de PCScheme también se basaba en registros. [ 17 ]

Este ejemplo es el listado de código de bytes de la función factorial definida anteriormente (tal como lo muestra el luaccompilador 5.1): [ 18 ]

función <factorial.lua:1,7> (9 instrucciones, 36 bytes en 0x8063c60) 1 parámetro, 6 ranuras, 0 valores ascendentes, 6 variables locales, 2 constantes, 0 funciones 1 [2] CARGAR 1 -1 ; 1 2 [3] CARGAR 2 -2 ; 2 3 [3] MOVER 3 0 4 [3] CARGAR 4 -1 ; 1 5 [3] FORPREP 2 1 ; a 7 6 [4] MUL 1 1 5 7 [3] FORLOOP 2 -2 ; a 6 8 [6] RETORNO 1 2 9 [7] RETORNO 0 1

API de C

Lua está diseñado para integrarse en otras aplicaciones y proporciona una API en C para este fin. La API se divide en dos partes: el núcleo de Lua y la biblioteca auxiliar de Lua. [ 19 ] El diseño de la API de Lua elimina la necesidad de conteo manual de referencias (gestión) en el código C, a diferencia de la API de Python . La API, al igual que el lenguaje, es minimalista. Las funciones avanzadas las proporciona la biblioteca auxiliar, que consiste principalmente en macros de preprocesador que facilitan las operaciones complejas con tablas.

La API de Lua para C se basa en una pila . Lua proporciona funciones para insertar y extraer la mayoría de los tipos de datos simples de C (enteros, números de coma flotante, etc.) de la pila, así como funciones para manipular tablas a través de ella. La pila de Lua es algo diferente de una pila tradicional; por ejemplo, se puede indexar directamente. Los índices negativos indican desplazamientos desde la parte superior de la pila. Por ejemplo, -1 es la parte superior (el valor insertado más recientemente), mientras que los índices positivos indican desplazamientos desde la parte inferior (el valor más antiguo). La transferencia de datos entre funciones de C y Lua también se realiza mediante la pila. Para llamar a una función de Lua, los argumentos se insertan en la pila y luego lua_callse utiliza para llamar a la función propiamente dicha. Al escribir una función de C para ser llamada directamente desde Lua, los argumentos se leen de la pila.

Aquí hay un ejemplo de cómo llamar a una función Lua desde C:

#include <stdio.h> #include <lua.h> // Biblioteca principal de Lua (lua_*) #include <lauxlib.h> // Biblioteca auxiliar de Lua (luaL_*)int main ( void ) { // crea un estado Lua lua_State * L = luaL_newstate ();// Cargar y ejecutar una cadena if ( luaL_dostring ( L , "function foo (x,y) return x+y end" )) { lua_close ( L ); return -1 ; }// Inserta el valor de la variable global "foo" (la función definida anteriormente) // en la pila, seguido de los enteros 5 y 3 lua_getglobal ( L , "foo" ); lua_pushinteger ( L , 5 ); lua_pushinteger ( L , 3 ); lua_call ( L , 2 , 1 ); // Llama a una función con dos argumentos y un valor de retorno printf ( "Resultado: %d \n " , lua_tointeger ( L , -1 )); // Imprime el valor entero del elemento en la cima de la pila lua_pop ( L , 1 ); // Devuelve la pila a su estado original lua_close ( L ); // Cierra el estado de Lua return 0 ; }

Al ejecutar este ejemplo se obtiene:

$ cc -o example example.c -llua $ ./example Resultado: 8

La API de C también proporciona algunas tablas especiales, ubicadas en varios "pseudoíndices" en la pila de Lua. En LUA_GLOBALSINDEXversiones anteriores a Lua 5.2 [ 20 ] se encuentra la tabla globals, _Gdentro de Lua, que es el espacio de nombres principal . También hay un registro ubicado LUA_REGISTRYINDEXdonde los programas de C pueden almacenar valores de Lua para su posterior recuperación.

Módulos

Además de los módulos de la biblioteca estándar (core), es posible escribir extensiones usando la API de Lua. Los módulos de extensión son objetos compartidos que se pueden usar para extender las funciones del intérprete al proporcionar funcionalidades nativas a los scripts de Lua. Los scripts de Lua pueden cargar módulos de extensión usando require, [ 19 ] al igual que los módulos escritos en el propio Lua, o con package.loadlib. [ 21 ] Cuando se carga una biblioteca C a través de Lua buscará la función y la llamará, que actúa como cualquier función C invocable desde Lua y generalmente devuelve una tabla llena de métodos. Un conjunto creciente de módulos denominados rocks está disponible a través de un sistema de gestión de paquetes llamado LuaRocks , [ 22 ] en el espíritu de CPAN , RubyGems y Python eggs . Existen enlaces Lua preescritos para la mayoría de los lenguajes de programación populares, incluidos otros lenguajes de scripting. [ 23 ] Para C++, hay una serie de enfoques basados ​​en plantillas y algunos generadores de enlaces automáticos.require('foo')luaopen_foo

Aplicaciones

En el desarrollo de videojuegos , Lua se utiliza ampliamente como lenguaje de scripting , principalmente debido a su facilidad de integración, ejecución rápida y curva de aprendizaje corta . [ 24 ] Entre los juegos notables que utilizan Lua se incluyen Roblox , [ 25 ] Garry's Mod , World of Warcraft , Payday 2 , Project Zomboid , Phantasy Star Online 2 , Dota 2 , Crysis , [ 26 ] y muchos otros. Además, Lua se utiliza en software que no es de videojuegos, como Adobe Lightroom , Moho , iClone , Aerospike y algunos programas del sistema en FreeBSD y NetBSD , y se utiliza como lenguaje de scripting de plantillas en MediaWiki mediante la extensión Scribunto. [ 27 ]

En 2003, una encuesta realizada por GameDev.net mostró que Lua era el lenguaje de scripting más popular para la programación de videojuegos. [ 28 ] El 12 de enero de 2012, Lua fue anunciado como ganador del premio Front Line Award 2011 de la revista Game Developer en la categoría de Herramientas de Programación. [ 29 ]

Muchas aplicaciones que no son juegos también utilizan Lua para la extensibilidad, como LuaTeX , una implementación del lenguaje de configuración de tipos TeX ; Redis , una base de datos clave-valor ; ScyllaDB , un almacén de columnas anchas ; Neovim , un editor de texto; Nginx , un servidor web ; Wireshark , un analizador de paquetes de red; Discordia, una biblioteca API de Discord ; y Pure Data , un lenguaje de programación de audio visual (a través de la extensión pdlua).

Lenguas derivadas

Lenguajes que se compilan a Lua

Dialectos

  • LuaJIT , un compilador justo a tiempo de Lua 5.1. [ 36 ] [ 37 ]
  • Luau, desarrollado por Roblox Corporation , es un derivado de Lua 5.1 y compatible con versiones anteriores, con tipado gradual , características adicionales y un enfoque en el rendimiento. [ 38 ] Luau ha mejorado el aislamiento de procesos para permitir la ejecución de código no confiable en aplicaciones integradas. [ 39 ]
  • Ravi, un lenguaje Lua 5.3 con JIT habilitado y tipado estático opcional. El JIT se guía por la información de tipos. [ 40 ]
  • Shine, una bifurcación de LuaJIT con muchas extensiones, incluyendo un sistema de módulos y un sistema de macros. [ 41 ]
  • Glua, una versión modificada integrada en el juego Garry's Mod como su lenguaje de scripting. [ 42 ]
  • Teal, un dialecto de Lua con tipado estático escrito en Lua. [ 43 ]
  • PICO-8 , una "consola de videojuegos de fantasía", utiliza un subconjunto de Lua conocido como PICO-8 Lua.
  • Pluto, un superconjunto de Lua 5.4 que ofrece sintaxis mejorada, bibliotecas y una mejor experiencia para el desarrollador, todo ello manteniendo la compatibilidad con Lua estándar. [ 44 ]

Además, la comunidad de usuarios de Lua proporciona algunos parches de potencia sobre la implementación de referencia en C. [ 45 ]

Véase también

Notas

  1. Azúcar sintáctico , una construcción de tabla o cadena literal que sigue a un identificador es una llamada a función válida. [ 9 ]

Referencias

  1. https://lua.org/versions.html#5.5 .{{cite web}}: Falta o está vacío |title=( ayuda )
  2. ^ Jerusalén, Roberto; de Figueiredo, Luiz Henrique; Filho, Waldemar Celes (junio de 1996). "Lua: un lenguaje de extensión extensible" . Software: práctica y experiencia . 26 (6): 635– 652. doi : 10.1002/(SICI)1097-024X(199606)26:6 < 635::AID-SPE26 > 3.0.CO ; 2-P . S2CID 61066194 . Consultado el 24 de octubre de 2015 . 
  3. 1 2 3 "Acerca de Lua" . Lua.org . Consultado el 26 de mayo de 2026 .
  4. ^ Takhteyev, Yuri (21 de abril de 2013). «De Brasil a Wikipedia» . Asuntos Exteriores . Consultado el 25 de abril de 2013 .
  5. 1 2 3 4 Ierusalimschy, R. ; Figueiredo, LH; Celes, W. (2007). "La evolución de Lua" (PDF) . Actas de la tercera conferencia ACM SIGPLAN sobre la historia de los lenguajes de programación . pp. 2–1–2–26. doi : 10.1145/1238844.1238846 . ISBN  978-1-59593-766-7. S2CID 475143 . 
  6. "La evolución de un lenguaje de extensión: una historia de Lua" . 2001. Consultado el 18 de diciembre de 2008 .
  7. Figueiredo, L. H.; Ierusalimschy, R.; Celes, W. (December 1996). "Lua: an Extensible Embedded Language. A few metamechanisms replace a host of features". Dr. Dobb's Journal. Vol. 21, no. 12. pp. 26–33.
  8. "Programming in Lua : 1".
  9. "Lua 5.0 Reference Manual, 2.5.7, Function Calls".
  10. "Lua 5.1 Reference Manual". 2014. Retrieved 27 February 2014.
  11. "Lua 5.1 Reference Manual". 2012. Retrieved 16 October 2012.
  12. "Lua 5.1 Source Code". 2006. Retrieved 24 March 2011.
  13. Roberto Ierusalimschy. Programming in Lua, 4th Edition. p. 165.
  14. "Programming in Lua : 16.3". Lua. Retrieved 16 September 2021.
  15. "Metamethods Tutorial". lua-users wiki. Archived from the original on 16 September 2021. Retrieved 16 September 2021.
  16. Ierusalimschy, R.; Figueiredo, L. H.; Celes, W. (2005). "The implementation of Lua 5.0". J. Of Universal Comp. Sci. 11 (7): 1159–1176. doi:10.3217/jucs-011-07-1159.
  17. Texas Instruments (1990). PC Scheme: Users Guide and Language Reference Manual, Trade Edition. MIP Press. ISBN 0-262-70040-9.
  18. Man, Kein-Hong (2006). "A No-Frills Introduction to Lua 5.1 VM Instructions"(PDF).
  19. 12"Lua 5.2 Reference Manual". Lua.org. Retrieved 23 October 2012.
  20. Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Celes, Waldemar (2011–2013). Changes in the API. Lua.org. Retrieved 9 May 2014.{{cite book}}: |work= ignored (help)
  21. Ierusalimschy, Roberto; de Figueiredo, Luiz Henrique; Celes, Waldemar. "Lua 5.4 Reference Manual". Lua. Retrieved 1 June 2022.
  22. "LuaRocks". luarocks.org. Retrieved 24 May 2009.
  23. "Binding Code To Lua". Lua-users wiki. Archived from the original on 27 July 2009. Retrieved 24 May 2009.
  24. "Why is Lua considered a game language?". Stack Overflow. Archived from the original on 20 August 2013. Retrieved 22 April 2017.
  25. "Why Luau?". Luau. Retrieved 6 April 2026.
  26. "Introduction to Crysis server-side modding". Retrieved 23 March 2022.
  27. "Lua Functions". wow.gamepedia.com. Retrieved 1 March 2021.
  28. "Poll Results". Archived from the original on 7 December 2003. Retrieved 22 April 2017.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  29. "Front Line Award Winners Announced". Archived from the original on 15 June 2013. Retrieved 22 April 2017.
  30. "Language Guide - MoonScript 0.5.0". moonscript.org. Retrieved 25 September 2020.
  31. leaf (23 September 2020). "leafo/moonscript". GitHub. Retrieved 25 September 2020.
  32. 12Garzia, Andre Alves. "Languages that compile to Lua". AndreGarzia.com. Retrieved 25 September 2020.
  33. "Urn: A Lisp implementation for Lua | Urn". urn-lang.com. Retrieved 12 January 2021.
  34. "Amulet ML". amulet.works. Retrieved 12 January 2021.
  35. "LunarML, Standard ML compiler that produces Lua/JavaScript". GitHub.
  36. "LuaJIT". LuaJIT.
  37. "Extensions". LuaJIT.
  38. "¿Por qué Luau?" . Luau . Consultado el 3 de agosto de 2024 . Todo esto nos motivó a comenzar a remodelar Lua 5.1, el lenguaje original, para crear un nuevo lenguaje derivado al que llamamos Luau. Nuestro objetivo es mejorar el rendimiento y la riqueza de funciones del lenguaje, así como facilitar la escritura de código robusto mediante una combinación de análisis estático de código y verificación de tipos con un sistema de tipos gradual.
  39. "Sandboxing" . Luau . Consultado el 27 de marzo de 2025 .
  40. "Lenguaje de programación Ravi" . GitHub .
  41. ^ Hundt, Richard (22 de abril de 2021). "richardhundt/brillo" . GitHub .
  42. "Gami's Mod Wiki" . wiki.facepunch.com .
  43. "teal-language/tl" . Idioma teal . 23 de diciembre de 2024. Consultado el 23 de diciembre de 2024 .
  44. "¿Qué es Plutón?" . Plutón . Consultado el 27 de junio de 2025 .
  45. "Lua Power Patches" . lua-users.org . Archivado del original el 18 de mayo de 2021. Consultado el 18 de mayo de 2021 .

Lecturas adicionales

  • Jerusalén, R. (2013). Programación en Lua (3ª  ed.). Lua.org. ISBN 978-85-903798-5-0.(La primera edición está disponible en línea ).
  • Gutschmidt, T. (2003). Programación de juegos con Python, Lua y Ruby . Course Technology PTR. ISBN 978-1-59200-077-7.
  • Schuytema, P.; Manyen, M. (2005). Desarrollo de juegos con Lua . Medios de Charles River. ISBN 978-1-58450-404-7.
  • Jung, K.; Brown, A. (2007). Introducción a la programación en Lua . Wrox Press . ISBN 978-0-470-06917-2Archivado del original el 8 de julio de 2018. Consultado el 7 de julio de 2018 .
  • Figueiredo, LH; Celes, W.; Jerusalénimschy, R., eds. (2008). Gemas de programación Lua . Lua.org. ISBN 978-85-903798-4-3.
  • Takhteyev, Yuri (2012). Coding Places: Software Practice in a South American City . The MIT Press . ISBN 978-0-262-01807-4Archivado del original el 2 de noviembre de 2012.Los capítulos 6 y 7 están dedicados a Lua, mientras que otros analizan el software en Brasil de forma más general.
  • Varma, Jayant (2012). Aprende Lua para el desarrollo de juegos para iOS . Apress . ISBN 978-1-4302-4662-6.
  • Matheson, Ash (29 de abril de 2003). "Una introducción a Lua" . GameDev.net . Archivado del original el 18 de diciembre de 2012. Recuperado el 3 de enero de 2013 .
  • Fieldhouse, Keith (16 de febrero de 2006). "Presentando Lua" . ONLamp.com . O'Reilly Media . Archivado del original el 12 de marzo de 2006. Recuperado el 28 de febrero de 2006 .
  • Streicher, Martin (28 de abril de 2006). "Scripts integrables con Lua" . developerWorks . IBM . Archivado del original el 2 de julio de 2009. Recuperado el 7 de julio de 2018 .
  • Quigley, Joseph (1 de junio de 2007). "Una mirada a Lua" . Linux Journal .
  • Hamilton, Naomi (11 de septiembre de 2008). "El AZ de los lenguajes de programación: Lua" . Computerworld . IDG . Archivado del original el 8 de julio de 2018. Recuperado el 7 de julio de 2018 .Entrevista con Roberto Ierusalimschy.
  • Jerusalén, Roberto; de Figueiredo, Luiz Henrique; Celes, Waldemar (12 de mayo de 2011). "Pasar una lengua por el ojo de una aguja" . Cola ACM . 9 (5): 20– 29. doi : 10.1145/1978862.1983083 . S2CID 19484689 . Cómo influyó la capacidad de integración de Lua en su diseño.
  • Jerusalén, Roberto; de Figueiredo, Luiz Henrique; Celes, Waldemar (26 de octubre de 2018). «Una mirada al diseño de Lua» . Comunicaciones de la ACM . 61 (11): 114– 123. doi : 10.1145/3186277 . S2CID 53114923 . 
  • Artículos y tesis sobre Lua
  • Sitio web oficialEdita esto en Wikidata
  • Usuarios de Lua archivados el 16 de diciembre de 2010 en Wayback Machine , Comunidad
  • Foro de Lua archivado el 28 de septiembre de 2021 en Wayback Machine.
  • LuaDist
  • Lua Rocks - Gestor de paquetes
  • Proyectos en Lua
Obtenido de " https://en.wikipedia.org/w/index.php?title=Lua&oldid=1360319408 "