Lúa | |
---|---|
clase de idioma | lenguaje de programación funcional , lenguaje de programación orientado a objetos , lenguaje de secuencias de comandos , lenguaje de programación multiparadigma , lenguaje de programación imperativo , lenguaje de programación procedimental , lenguaje deprogramación orientado a prototipos [d] , lenguaje de programación interpretado , lenguaje de programación compilado , software libre y formato de archivo |
Apareció en | 1993 [2] |
Autor |
Roberto Jeruzalimski , Valdemar Selish, Luis Enrique de Figueiredo |
Desarrollador | Roberto Jeruzalimsky [1] |
extensión de archivo | .lua[3] [4 ],.lunao.lunaire.anair |
Liberar | 5.4.4 (26 de enero de 2022) |
sistema de tipos | dinámico , fuerte , pato |
sido influenciado | C++ , Clu , Lenguaje de objetos simples [d] , DEL , Snobol , Modula , Modula-2 y Scheme |
influenciado | JavaScript |
Licencia | licencia MIT [5] [6] |
Sitio web | lua.org ( inglés) ( puerto) |
sistema operativo | multiplataforma [7] |
Archivos multimedia en Wikimedia Commons |
Lua ( lua , port. - “luna” [8] ) es un lenguaje de programación de scripting desarrollado en la división Tecgraf ( Computer Graphics Technology Group ) de la Universidad Católica de Río de Janeiro ( Brasil ). El intérprete de lenguaje es un intérprete de lenguaje C gratuito y de código abierto .
En términos de ideología e implementación, el lenguaje Lua es el más cercano a JavaScript , en particular, también implementa el modelo de prototipo OOP , pero difiere en una sintaxis similar a la de Pascal y construcciones más poderosas y flexibles. Un rasgo característico de Lua es la implementación de una gran cantidad de entidades de software con un mínimo de medios sintácticos. Por lo tanto, todos los tipos de datos compuestos definidos por el usuario ( matrices , estructuras , conjuntos , colas , listas ) se implementan a través del mecanismo de tablas y los mecanismos de programación orientada a objetos , incluida la herencia múltiple , utilizando metatablas , que también son responsables de sobrecargar las operaciones y un número de otras características.
Lua está destinado a usuarios que no son programadores profesionales, por lo que se presta mucha atención a la simplicidad del diseño y la facilidad de aprendizaje. El lenguaje es muy utilizado para crear software replicable (por ejemplo, en él está escrita la interfaz gráfica del paquete Adobe Lightroom ). También ganó prominencia como lenguaje de programación para niveles y extensiones en muchos juegos (incluido Garry's Mod ) [9] .
El lenguaje fue desarrollado por la división Tecgraf (grupo de tecnología de gráficos por computadora) de la Universidad Católica de Río de Janeiro en Brasil, la historia del lenguaje se remonta a 1993. Los autores de la lengua son Roberto Jeruzalimski , Luiz Henrique de Figueiredo y Waldemar Celes . Lua se distribuye libremente, de código abierto en lenguaje C.
Como señaló Luis Enrique de Figueiredo, Lua es el único lenguaje de programación desarrollado en un país en desarrollo que ha recibido reconocimiento mundial, lo que, en particular, se expresó en una invitación a la conferencia HOPL [10] .
Los padres históricos del lenguaje fueron los lenguajes de configuración y descripción de datos SOL (Simple Object Language) y DEL (Data-Entry Language) [11] , se desarrollaron de forma independiente en Tecgraf en 1992-1993 para agregar cierta flexibilidad a dos lenguajes separados. proyectos (ambos eran aplicaciones gráficas interactivas para necesidades de diseño en Petrobras ). SOL y DEL carecían de construcciones de control, y Petrobras sintió una creciente necesidad de agregarles una programación completa.
Como escribe el autor del lenguaje en The Evolution of Lua : [12]
En 1993, el único competidor real fue Tcl , que fue diseñado específicamente para integrarse en las aplicaciones. Sin embargo, Tcl tenía una sintaxis desconocida, carecía de un buen soporte de descripción de datos y solo se ejecutaba en plataformas Unix . No hemos considerado Lisp o Scheme debido a su sintaxis poco amigable. Python todavía estaba en su infancia. En la atmósfera de bricolaje que reinaba en Tecgraf en ese momento, era natural que decidiéramos desarrollar nuestro propio lenguaje de programación. Debido al hecho de que la mayoría de los usuarios no eran programadores profesionales, el lenguaje tenía que evitar la sintaxis y la semántica enrevesadas. La implementación del nuevo lenguaje tenía que ser fácilmente portable , ya que los clientes de Tecgraf disponían de plataformas muy diversas. Finalmente, dado que esperábamos que otros productos de Tecgraf también necesitaran un lenguaje de secuencias de comandos integrado, el nuevo lenguaje debería seguir el ejemplo de SOL y proporcionarse como una biblioteca con una API de C.
Lua 1.0 fue diseñado de tal manera que los constructores de objetos, ligeramente diferentes al estilo ligero y flexible actual, incluyeron la sintaxis del lenguaje SOL (de ahí el nombre Lua: en portugués sol - "sol", lua - "luna") . Las construcciones de control de Lua se toman en su mayoría de Modula-2 (if, while, repeat/until), aunque también están influenciadas por Clu ( asignación paralela , valor de retorno de función múltiple como una alternativa más simple a pasar parámetros por referencia o punteros explícitos ), C++ ("Es una gran idea declarar solo las variables locales cuando las necesite"), Snobol y awk ( matrices asociativas ). Los creadores de Lua también reconocen que el único mecanismo de estructuración de datos ubicuos en Lisp y Scheme ( lista enlazada ) fue una gran influencia en su decisión de elegir tablas como la estructura de datos principal para Lua [13] .
Las versiones de Lua hasta la 5.0 se lanzaron bajo una licencia similar a la licencia BSD . A partir de la versión 5.0, Lua se distribuye bajo la licencia MIT . Ambas licencias son permisivas y virtualmente idénticas.
Lua está destinado a ser utilizado como un lenguaje de secuencias de comandos independiente o integrado en una aplicación. Originalmente fue diseñado para ser lo suficientemente simple y compacto para adaptarse a una variedad de plataformas y proporcionar un rendimiento aceptable. Asimismo, el diseño tuvo en cuenta los requisitos de facilidad de aprendizaje y la posibilidad de uso por parte de programadores no profesionales.
Lua es un lenguaje modular procedimental tipado dinámicamente con administración automática de memoria . Incluye elementos básicos para admitir estilos de programación funcional y de objetos . Por lo tanto, Lua puede llamarse un lenguaje multiparadigma . Las herramientas de programación paralela integradas le permiten escribir programas de subprocesos múltiples utilizando solo herramientas de lenguaje, sin consultar la API del sistema operativo o bibliotecas externas. Dado que el propósito principal de Lua es la integración, tiene una interoperabilidad entre lenguajes eficiente, enfocada principalmente en llamar a bibliotecas C y trabajar en un entorno C.
El lenguaje admite una pequeña cantidad de tipos de datos integrados: booleanos, números, cadenas, funciones, flujos. No hay estructuras de datos combinadas típicas como arreglos , conjuntos , listas y registros , en lugar de todos ellos, se usa una estructura básica de Lua, la tabla (ver más abajo). Un tipo separado userdataestá diseñado específicamente para programación de bajo nivel e intercambio de datos con código externo en otros idiomas. Las funciones en Lua son objetos de primera clase y se pueden asignar y pasar como parámetros. Se admiten cierres, es posible crear funciones de órdenes superiores. El sistema de objetos es prototípico, no hay soporte explícito para la herencia , pero se implementa fácilmente usando metatablas .
En general, Lua tiene como objetivo proporcionar metafunciones flexibles que se pueden ampliar según sea necesario, en lugar de proporcionar un conjunto de funciones específicas para un paradigma de programación en particular. Como resultado, el lenguaje subyacente es simple y fácilmente adaptable a la mayoría de las aplicaciones. Al proporcionar un conjunto mínimo de instalaciones básicas, Lua intenta lograr un equilibrio entre potencia y tamaño.
La sintaxis de Lua se basa principalmente en lenguajes similares a Pascal tardío, como Modula-2 u Oberon . El formato de entrada de texto es libre, los comandos en el texto del programa están separados por caracteres de espacio en blanco. Se permite, pero no se requiere, usar un punto y coma para separar operaciones.
En una entrevista con Robert Jeruzalimski, comentó que la sintaxis de Lua era un compromiso que tenía que hacer para facilitar el aprendizaje del lenguaje a los programadores no profesionales. Describió la sintaxis como "bastante prolija", señalando que personalmente hubiera preferido una notación más concisa [10] .
El alfabeto principal del idioma es el inglés, se pueden usar caracteres de otros idiomas en cadenas literales. Los identificadores pueden consistir en letras, números y guiones bajos, pero no pueden comenzar con un número ni coincidir con una de las palabras clave. La guía de idiomas no recomienda el uso de identificadores que comiencen con un guión bajo, ya que dichos identificadores se utilizan para fines del sistema.
El lenguaje distingue entre mayúsculas y minúsculas, todas las palabras clave están escritas en minúsculas, los identificadores que difieren solo en mayúsculas y minúsculas se consideran diferentes. Las siguientes 22 palabras clave no se pueden usar para nombres [14] :
and break do else elseif end false goto for function if in local nil not or repeat return then true before whileLos comentarios usan la siguiente sintaxis, similar a Ada , SQL y VHDL :
-- Un comentario simple de una sola línea en Lua comienza con un doble menos y continúa hasta el final de la línea. dim = { "uno" , "dos" , "tres" } -- Un comentario de línea no tiene que comenzar al principio de una línea -- puede seguir otras construcciones del lenguaje -- para explicarlo. --[[Un comentario de varias líneas comienza con dos corchetes de apertura consecutivos seguidos de dos menos y continúa a través de dos corchetes de cierre consecutivos. Como aquí: ]] -- Se puede obtener un efecto interesante combinando comentarios en línea y de varias líneas: --[[ Para descomentar el código a continuación, es suficiente agregar un espacio en esta línea entre signos menos y corchetes. for i=1,#dim do print(dim[i]) end -- Si se agrega un espacio entre los signos menos y los corchetes anteriores, entonces --]] -- aquí el final del comentario de varias líneas se convertirá en una linea normalLua es un lenguaje con definición implícita de tipos de datos dinámicos . Una variable de idioma puede contener valores de cualquier tipo. Todos los valores en Lua pueden almacenarse en variables, usarse como argumentos para llamadas a funciones y devolverse como resultado de su ejecución.
Hay ocho tipos principales en Lua:
nil es el tipo de valor nil [valor vacío], cuya propiedad principal es ser diferente de todos los demás valores y denotar la ausencia de un valor utilizable.
El tipo booleano incluye los valores falso (falso) y verdadero (verdadero).
El tipo de número generalmente incluye números reales (doble). En las primeras versiones de Lua, los números enteros no estaban separados en un tipo separado; esta decisión está motivada por el hecho de que la representación real le permite representar con precisión una gama bastante amplia de números enteros. A partir de la versión 5.3, se ha añadido la posibilidad de definir explícitamente un formato de número entero o número real. La representación interna de los números se puede cambiar al construir el intérprete.
El tipo de cadena denota matrices de caracteres. Las cadenas Lua pueden contener cualquier carácter de 8 bits, incluido el cero ('\0'). Las cadenas son inmutables. Los literales de cadena se pueden escribir entre comillas simples o dobles, los caracteres de servicio se colocan en ellos en notación C estándar con una barra invertida al principio. Los literales de varias líneas están delimitados por dos corchetes consecutivos de apertura y dos de cierre consecutivos.
No hay compatibilidad con Unicode integrada en el lenguaje, aunque se permite el uso de caracteres UTF-8 en cadenas literales, y el propio sistema de representación UTF-8 le permite ingresar, generar y procesar parcialmente cadenas en esta codificación utilizando herramientas estándar del sistema. . Las versiones recientes de Lua incluyen la biblioteca utf8, que brinda soporte más avanzado para UTF-8, y existen bibliotecas de terceros que brindan herramientas para trabajar con cadenas Unicode en varias codificaciones.
Las funciones en Lua son objetos completos que se pueden asignar, pasar como parámetro a una función y devolver como uno de los valores. El tipo de subproceso tiene corrutinas, el tipo de datos de usuario está diseñado para representar datos externos recibidos o proporcionados desde/hacia código en otro lenguaje (principalmente C/C++).
Todos los operadores aritméticos admiten operandos reales, dando resultados predecibles. Por ejemplo, x^0.5devuelve la raíz cuadrada de x, x^(-1/3) el recíproco de la raíz cúbica de x. El operador %está definido por: a % b = a - math.floor(a / b) * b, donde la función se math.floor()evalúa como la parte entera de su argumento. Para argumentos enteros, su resultado es bastante normal. Para un dividendo real, tenga en cuenta que la operación no realiza ningún redondeo o descarte adicional de la parte fraccionaria, por lo que el resultado conservará la parte fraccionaria del dividendo. Por ejemplo, math.pi % 2devolverá no 1, pero 1.1415926535898. Esta implementación proporciona algunas características adicionales. Por ejemplo, para truncar xa tres decimales, basta tomar la expresiónx - x % 0.001
Una tabla en Lua es una matriz asociativa heterogénea dinámica , es decir, un conjunto de pares de " ". Las claves pueden ser valores de cualquier tipo Lua excepto . Las claves también pueden ser literales Lua (identificadores). Escribir en un elemento de tabla es equivalente a eliminar este elemento. ключ-значениеnilnil
Las tablas son el único tipo de datos compuestos en Lua. Son la base para todos los tipos de datos definidos por el usuario, como estructuras , matrices , conjuntos y otros:
-- Tabla general: vacía = {} -- Tabla vacía vacía [ 1 ] = "primero" -- Sumando elemento con índice entero vacío [ 3 ] = "segundo" -- Sumando elemento con índice entero vacío [ "tercero" ] = "tercero" -- Agregar elemento en el índice de cadena vacío [ 1 ] = nil -- Eliminar elemento de la tabla -- Matriz clásica: las cadenas se indexan de forma predeterminada con números enteros a partir de 1 días1 = { "Lunes" , "Martes" , "Miércoles" , "Jueves" , "Viernes" , "Sábado" , "Domingo" } -- Matriz con indexación arbitraria días2 = {[ 0 ] = "Domingo" , [ 1 ] = "Lunes" , [ 2 ] = "Martes" , [ 3 ] = "Miércoles" , [ 4 ] = "Jueves" , [ 5 ] = "Viernes" , [ 6 ] = "Sábado" } -- Registro (estructura) - los valores de varios tipos están indexados por literales person = { tabnum = 123342 , -- Número de personal fio = "Ivanov Stepan Vasilyevich" , -- Nombre completo post = "fabricante de herramientas" , -- Salario del puesto = 25800,45 , -- Salario sdate = "23/10/2013" , -- Fecha de contratación bdate = "08/08/1973" } -- Fecha de nacimiento pfio = persona . fio --Referencia al elemento de estructura. -- Los índices de conjuntos se utilizan para almacenar valores días laborables = {[ "Lunes" ] = verdadero , [ "Martes" ] = verdadero , [ "Miércoles" ] = verdadero , [ "Jueves" ] = verdadero , [ "Viernes" " ] = true } workDays [ "Saturday" ] = true -- Agregue el sábado a la cantidad de días hábiles workDays [ "Wednesday" ] = nil -- Ya no trabajamos los miércoles -- Compruebe si d es un día laborable if workDays [ d ] luego imprima ( d .. " - día laborable " ) else imprima ( d .. " - día libre " ) endLos conjuntos múltiples (conjuntos que pueden contener más de una instancia del mismo elemento) se implementan de manera similar al último ejemplo, solo que los valores no son lógicos, sino enteros: contadores de la cantidad de elementos correspondientes en el conjunto. Las listas enlazadas se pueden representar como matrices de matrices de dos elementos que contienen un valor y una referencia al siguiente elemento. Los arreglos multidimensionales se pueden implementar como arreglos de arreglos. Las estructuras más complejas, como colas, gráficos, redes también se implementan sobre la base de tablas, el método de implementación específico está determinado por la tarea.
Lua apoya el concepto de cierres , por ejemplo:
función makeaddfunc ( x ) -- Devuelve una nueva función anónima que agrega x a su argumento función de retorno ( y ) -- Cuando nos referimos a una variable x que está fuera del alcance actual -- y cuyo tiempo de vida es menor que el de esta función anónima - - - Lua crea un cierre. return x + y end end plustwo = makeaddfunc ( 2 ) -- es decir, plustwo = function(y) return 2 + y end print ( plustwo ( 5 )) -- Imprime 7Cada vez que se llama makeaddfunc, se crea un nuevo cierre para la variable x, por lo que cada función anónima devuelta se referirá a su propio parámetro x. Como cualquier otro objeto Lua, el recolector de basura administra la vida útil de un cierre.
El mecanismo metatable proporciona muchas de las características que ofrecen otros lenguajes al introducir mecanismos sintácticos separados. Las metatablas son, por estructura, tablas ordinarias de Lua, sujetas a todas las reglas y restricciones del lenguaje. Su peculiaridad radica en su aplicación. La metatabla almacena metadatos adicionales para tipos y objetos, es decir, información sobre los parámetros y funciones asociados con ellos. La información almacenada en metatablas es utilizada por el intérprete de Lua, su uso le permite cambiar o ampliar la funcionalidad de los objetos del programa.
Una metatabla en Lua se puede asociar con un valor de cualquier tipo. Los tipos de datos escalares (todos excepto los datos de usuario y las tablas) tienen metatablas comunes para cada tipo. Las tablas y valores de un tipo userdatatienen referencias de metatablas individuales en cada instancia. La modificación de metatablas de todos los tipos, excepto las tablas, solo se puede realizar a través de un código C externo. Solo las metatablas de las tablas son accesibles directamente desde Lua.
Una tabla Lua creada desde cero no tiene una metatabla (su referencia de metatabla es nula). Pero se puede crear una metatabla en cualquier momento u obtenerse de otra tabla. La función integrada getmetatable(t)devuelve la metatabla de la tabla t y la función setmetatable(t, m)establece la tabla t en la metatabla m.
Para las metatablas, se documenta un conjunto de campos que puede utilizar el intérprete de lenguaje. Para indicar el papel especial de estos campos, se ha adoptado una regla de denominación especial para ellos: sus identificadores comienzan con dos guiones bajos. Algunos de estos campos contienen información sobre propiedades específicas del objeto al que se refiere la metatabla. Por ejemplo, la opción __mode, cuando se da, puede hacer que una tabla sea débil , es decir, una tabla cuyas referencias a objetos sean todas referencias débiles . Pero los valores de la mayoría de los posibles campos de la metatabla son los llamados metamétodos , es decir, referencias a funciones que el intérprete llama bajo ciertas condiciones. La lógica general del uso de metamétodos por parte del intérprete es la siguiente: cuando el intérprete encuentra una operación en el programa que no está definida para el objeto operando, accede a la metatabla asociada con el operando, encuentra el metamétodo correspondiente y lo llama.
--[[ Crear operación de suma para tablas ]] -- Operandos t1 = { 1 , 2 , 3 } t2 = { 10 , 20 , 30 } -- Crear metatabla mt = {} -- Escribir metamétodo "__add" mt en metatabla . __add = function ( a , b ) local res = {} for k en pares ( a ) do res [ k ] = a [ k ] + b [ k ] end return res end -- Vincular metatable a la tabla t1 setmetatable ( t1 , mt ) -- La adición de tablas ahora es una operación válida t3 = t1 + t2 -- unir metatabla con t3 con metamétodo __tostring setmetatable ( t3 , { __tostring = función ( t ) local res = " \n " para _ , v en pares ( t ) do res = res .. tostring ( v ) .. "-" end return res .. " \n " end }) -- Esto imprimirá: "11-22-33-" para _ , v en ipairs ( t3 ) do io.write ( v , "," ) end print ( tostring ( t3 )) -- imprime "11,22,33,"Lua admite metamétodos para todas las operaciones aritméticas y de comparación, por lo que se pueden usar para implementar la aritmética para cualquier objeto creado por el programador. Además de los estándar, puede usar los llamados metamétodos de "biblioteca", que no son compatibles con el núcleo del lenguaje, sino con bibliotecas específicas. En el ejemplo anterior, este es un metamétodo __tostringcompatible con la biblioteca de cadenas; este método convierte la tabla en una cadena.
El campo es del mayor interés __index. Se llama cuando el intérprete intenta leer un elemento de la tabla pero no lo encuentra. Un campo __indexpuede hacer referencia a una tabla oa un método. En el primer caso, el intérprete, al no encontrar el valor deseado en la tabla principal, lo buscará en la tabla __index. En el segundo, en lugar de acceder a la tabla, se llamará a este método. Al especificar tablas o metamétodos para un campo determinado, Lua puede implementar la herencia, ocultar datos de objetos, rastrear operaciones en datos de tablas y mucho más.
La base para OOP en Lua son las tablas. En principio, una tabla es un objeto en el sentido de programación orientada a objetos, ya que puede tener campos nombrados con identificadores y almacenar valores arbitrarios (propiedades del objeto) y funciones para implementar el comportamiento del objeto (métodos del objeto) en estos campos. Parte del azúcar sintáctico proporcionado por Lua hace que la descripción y el manejo de objetos sean más familiares para los programadores con experiencia en lenguajes OOP tradicionales. No existe el concepto de " clase " en Lua, por lo tanto, se describe un objeto separado y todos los campos y métodos se refieren específicamente a él. Las propiedades se describen de manera similar a los elementos de la tabla con claves de identificación, los métodos se describen como campos de función. Al igual que el clásico Oberon, la descripción de los métodos incluye una indicación explícita en el primer parámetro del llamado "receptor", un parámetro que, cuando se llama a un método, se refiere al objeto para el que se llama. Pero además de la referencia estándar a un campo de tabla, a través de un punto, que requiere especificar explícitamente el destinatario en la llamada al método, Lua admite una sintaxis adicional: cuando el encabezado del método se escribe en forma " Объект:метод" en la llamada o descripción del método , entonces no se especifica el destinatario. Al mismo tiempo, en el cuerpo del método, todavía está disponible con el nombre self:
-- Objeto Cuenta = { -- Objeto "cuenta" id , nombre , saldo = 0 , -- propiedades del objeto: número, nombre, saldo crédito = función ( self , v ) -- método "gasto" - descripción dentro del objeto con explícito especificando el destinatario si self . balance < v luego error "Saldo insuficiente" end self . equilibrio = uno mismo . saldo - v fin } función Cuenta : debet ( v ) -- método "entrante" - descripción abreviada externa (no se especifica uno mismo) self . equilibrio = uno mismo . saldo + v fin cuenta _ debet ( Cuenta , 10000 ) -- llamada al método - versión larga Cuenta : credit ( 5000 ) -- llamada al método - versión cortaLa herencia, incluida la herencia múltiple, se implementa mediante metatablas y metamétodos. Además, utilizando metamétodos, puede implementar la ocultación de datos y el acceso controlado a los campos de la tabla-objeto. Si compara este enfoque con otros lenguajes, donde todo lo anterior se implementa utilizando herramientas de lenguaje especiales, puede ver que la implementación de Lua es más complicada y requiere una codificación más cuidadosa, pero brinda más flexibilidad y simplifica el intérprete.
Programa clásico " ¡Hola, mundo!" » en Lua se ve así:
imprimir ( "¡Hola mundo!" )Factorial es un ejemplo de una función recursiva :
función factorial ( n ) si n == 0 entonces devuelve 1 si no devuelve n * factorial ( n - 1 ) fin fin for i = 1 , 5 do -- fin de instrucciones/operacionesTrabajar con funciones como objetos de primera clase se demuestra en el siguiente ejemplo, que modifica el comportamiento de la función de impresión:
do local oldprint = print -- Guarda la función de impresión actual como oldprint function print ( s ) -- Redefine la función de impresión if s == "foo" then oldprint ( "bar" ) else oldprint ( s ) end end endCualquier llamada futura printahora se redirigirá a la nueva función y, gracias al soporte de Lua para el contexto léxico , solo se podrá acceder a la función de impresión anterior a través de la nueva función de impresión modificada. Lua también admite cierres , como se describe anteriormente en la sección relacionada.
Una característica clave de Lua es su semántica extensible, y el mecanismo metatable ofrece muchas posibilidades para personalizar el comportamiento único de las tablas Lua. El siguiente ejemplo muestra una tabla "infinita". Para any dará el -ésimo número de Fibonacci usando memoization . fibs[n]
fibs = { 1 , 1 } -- Valores iniciales para fibs[1] y fibs[2]. setmetatable ( fibs , { __index = function ( nombre , n ) -- Llamar a la función si fibs[n] no existe. name [ n ] = nombre [ n - 1 ] + name [ n - 2 ] -- Calcular y memorizar fibs [n] .return nombre [ n ] fin })Lua también le permite usar operadores lógicos andpara oringresar construcciones ternarias , como en C# , por ejemplo, o para referirse a uno de los objetos existentes.
do local num = tonumber ( io.read ()) -- Escribe en una variable la información ingresada desde la consola y conviértela a un tipo entero print ( num == 1 y "Ingresaste el número correcto" o "Ingresaste el número incorrecto" ) -- Si la variable num es igual a 1, entonces el texto después de y se mostrará en la consola, en todos los demás casos después de o endAcceder a una tabla existente y obtener el valor en el primer índice:
do local tbl = nil local tbl2 = { 1 } print ( ( tbl o tbl2 )[ 1 ] ) -- Se imprimirá el número 1 porque la tabla tbl2 tiene este valor al final del índice 1Llamar a una función desde una de las tablas existentes:
hacer local tbl = nil local tbl2 = {} tbl2 . HacerAlgo = function () print ( "Hacer algo" ) end ( tbl o tbl2 ). hacer algo () finComo muchos lenguajes de programación interpretados , la implementación de Lua tiene un compilador separado del lenguaje fuente al código de bytes ejecutable y una máquina virtual para ejecutar el código de bytes generado. Además, el código de bytes no son los comandos de la máquina de pila, sino los comandos de un determinado procesador virtual con varios registros, lo que aumenta la eficiencia de ejecución. La máquina virtual Lua estándar utiliza asignación de memoria con recolección de elementos no utilizados (similar a Java o .NET).
Lua usa un grupo de una sola cadena , lo que reduce la sobrecarga de memoria del almacenamiento de cadenas.
Para tareas de tiempo crítico, hay un compilador JIT - Lua - LuaJIT [15] . También se ha desarrollado el compilador llvm-lua [16] , que genera código para la máquina virtual LLVM , lo que brinda la posibilidad de compilación posterior en código máquina muy eficiente para procesadores de diversas arquitecturas.
Actualmente se usa en varios proyectos en los que se requiere construir un lenguaje de programación de secuencias de comandos bastante rápido y fácil de aprender ; por ejemplo, en el desarrollo de juegos , donde Lua se usa a menudo como una capa entre el motor del juego y los datos para la secuencia de comandos. el comportamiento y la interacción de los objetos. Por su compacidad, también es aplicable en dispositivos portátiles, en particular, una de las calculadoras gráficas de Texas Instruments utiliza un lenguaje en lugar del BASIC , tradicional para esta clase de dispositivos .
LucasArts fue el primero en introducir el lenguaje Lua en el desarrollo de juegos de computadora, comenzando con el juego Grim Fandango [17] . Los autores del lenguaje en su informe en la conferencia HOPLRecordemos que en enero de 1997 recibieron un mensaje de Bret Mogilefsky, el principal desarrollador de Grim Fandango, donde escribía que después de leer sobre el lenguaje en un artículo de 1996 en Dr. Dobb's Journal , planea reemplazar su lenguaje de scripting casero SCUMM con Lua [18] . Como resultado, creó el motor de juego GrimE , que también se usa en una misión posterior de LucasArts: Escape from Monkey Island .
En 2003, una encuesta de GameDev.net clasificó a Lua como el lenguaje de secuencias de comandos más popular para el desarrollo de juegos [9] .
Un ejemplo de un juego programado con Lua es World of Warcraft [19] [20] . Los niveles del juego de rompecabezas Enigma [21] se describen en el idioma lua .
Hay varios motores de juegos gratuitos disponibles, programables en Lua, como Defold [22][ significado del hecho? ] , el motor arcade LÖVE [23] [24] , el diseñador de juegos Novashell [25] y el INSTEAD [ 26 ] orientado a misiones (principalmente basado en texto ) .
También se utiliza en el simulador de vuelo X-Plane, en el motor de rayos X para STALKER [27] .
Para el popular juego Minecraft se han creado modificaciones de ComputerCraft y su análogo más avanzado OpenComputers, que añaden ordenadores programados en el lenguaje Lua [28] .
El famoso juego Garry's Mod está programado y también admite modificaciones escritas en Lua.
El equipo de Croteam (desarrolladores de Serious Sam y The Talos Principle ) ha estado usando Lua en el scripting desde Serious Engine 3.5 [29] .
Para el juego GTA: San Andreas , las modificaciones se crean escritas en el lenguaje Lua y son compatibles con el complemento Moonloader. [30] Multi Theft Auto también es compatible con secuencias de comandos Lua.
La plataforma de juegos Roblox utiliza Lua como lenguaje de codificación de juegos y gestión del entorno del juego [31] .
El mod Ficsit-Networks ha sido creado por la comunidad de juegos Satisfactory , que permite programar cualquier acción en el lenguaje Lua [32] .
Factorio usa Lua para crear mods. [33] [34]
El juego Dual Universe se utiliza para la mecánica del juego y la programación de bloques de juegos
El tipo de computadora LuaTeX , una versión extendida de pdfTeX , usa Lua como su lenguaje de secuencias de comandos incorporado [35] .
El administrador de paquetes RPM contiene un intérprete Lua incorporado [36] .
Hay al menos dos entornos de desarrollo "nativos" para Lua, estos son:
Además, Lua es compatible con algunos IDE universales, en particular:
Había un módulo de soporte de Lua para el entorno de NetBeans , pero se suspendió en 2013 y solo está disponible para NetBeans 7.4 y versiones anteriores. El complemento no es compatible con NetBeans 8.
Lúa | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
Lenguajes de programación | |
---|---|
|