Jump to content

Луа (язык программирования)

(Перенаправлено из синтаксиса Lua )

Два
Снимок экрана с кодом Lua из модуля Lua Википедии с использованием MediaWiki Scribunto. расширения
Парадигма Мультипарадигмальность : скриптовая , императивная ( процедурная , прототипно-ориентированная , объектно-ориентированная ), функциональная , мета , рефлексивная.
Разработано Роберто Иерусалимский
Вальдемар Селес
Луис Энрике де Фигейредо
Впервые появился 1993 год ; 31 год назад ( 1993 )
Стабильная версия
5.4.7 [1]  Отредактируйте это в Викиданных / 25 июня 2024 г .; 41 день назад ( 25 июня 2024 г. )
Дисциплина набора текста Динамичный , сильный , уточный
Язык реализации АНСИ С
ТЫ Кросс-платформенный
Лицензия С
Расширения имен файлов .lua
Веб-сайт www .два .org Отредактируйте это в Викиданных
Основные реализации
Луа , ЛуаЖИТ , ЛуаВела , MoonSharp , Лувит , LuaRT , Lua u
Диалекты
Metalua , Холостой ход , GSL Shell
Под влиянием
C++ , CLU , Модуль , Схема , СНОБОЛ
Под влиянием
GameMonkey , Io , JavaScript [ нужна ссылка ] , Юля , MiniD, Красный , Кольцо , [2] Руби , [ нужна ссылка ] Белка , MoonScript, C--

Lua ( / ˈ l ə / LOO ; от португальского : lua [ˈlu(w)ɐ] означает луна ) легкий , высокоуровневый , многопарадигмальный язык программирования , предназначенный в основном для встроенного использования во встроенных приложениях. [3] Lua является кроссплатформенным программным обеспечением поскольку интерпретатор скомпилированного , байт-кода написан на ANSI C , [4] Lua имеет относительно простой интерфейс программирования приложений на языке C ( API ) для встраивания его в приложения. [5]

Lua возник в 1993 году как язык расширения программных приложений для удовлетворения растущего в то время спроса на настройку. Он предоставлял базовые возможности большинства процедурных языков программирования, но более сложные или специфичные для предметной области функции не были включены; скорее, он включал механизмы расширения языка, позволяющие программистам реализовывать такие функции. Поскольку Lua задумывался как общий встраиваемый язык расширений, разработчики Lua сосредоточились на повышении его скорости , портативности , расширяемости и простоты использования при разработке.

Lua был создан в 1993 году Роберто Иерусалимским , Луисом Энрике де Фигейредо и Вальдемаром Селесом, членами группы технологий компьютерной графики (Tecgraf) Папского католического университета Рио-де-Жанейро в Бразилии .

С 1977 по 1992 год Бразилия проводила политику сильных торговых барьеров (называемых рыночными резервами) для компьютерного оборудования и программного обеспечения , полагая, что Бразилия может и должна производить собственное оборудование и программное обеспечение. В такой атмосфере клиенты Tecgraf не могли позволить себе ни политически, ни финансово покупать специализированное программное обеспечение за границей; В рамках рыночного резерва клиентам придется пройти сложный бюрократический процесс, чтобы доказать, что их потребности не могут быть удовлетворены бразильскими компаниями. Эти причины побудили Tecgraf реализовать необходимые базовые инструменты с нуля. [6]

Предшественниками Lua были языки описания/конфигурации данных Simple Object Language (SOL) и язык ввода данных (DEL). [7] Они были независимо разработаны в Tecgraf в 1992–1993 годах, чтобы добавить некоторую гибкость двум различным проектам (оба представляли собой интерактивные графические программы для инженерных приложений в компании Petrobras ). В SOL и DEL отсутствовали какие-либо структуры управления потоком данных, и Petrobras чувствовала растущую потребность добавить к ним полную мощь программирования.

В «Эволюции Lua» авторы языка написали: [6]

В 1993 году единственным реальным претендентом был Tcl , который был специально разработан для внедрения в приложения. Однако Tcl имел незнакомый синтаксис, не обеспечивал хорошей поддержки описания данных и работал только на платформах Unix. Мы не рассматривали LISP или Scheme из-за их недружественного синтаксиса. Python все еще находился в зачаточном состоянии. В свободной атмосфере «сделай сам», царившей тогда в Tecgraf, было вполне естественно попытаться разработать собственный скриптовый язык... Поскольку многие потенциальные пользователи языка не были профессиональными программистами, в языке следует избегать загадочных синтаксис и семантика. Реализация нового языка должна быть легко переносимой, поскольку у клиентов Tecgraf была очень разнообразная коллекция компьютерных платформ. Наконец, поскольку мы ожидали, что в другие продукты Tecgraf также потребуется встроить язык сценариев, новый язык должен следовать примеру SOL и предоставляться в виде библиотеки с C API.

Lua 1.0 был разработан таким образом, что его конструкторы объектов, которые тогда немного отличались от нынешнего легкого и гибкого стиля, включали синтаксис описания данных SOL (отсюда и название Lua: Sol означает «Солнце» на португальском языке, а Lua означает "Луна"). Lua Синтаксис для управляющих структур в основном был заимствован из Modula ( if, while, repeat/ until), но также испытал влияние CLU (множественные присваивания и множественные возвраты из вызовов функций, как более простая альтернатива ссылочным параметрам или явным указателям ), C++ («изящная идея, позволяющая локальную переменную только там, где она нам нужна» объявлять [6] ), SNOBOL и AWK ( ассоциативные массивы ). В статье, опубликованной в журнале Dr. Dobb's Journal , создатели Lua также заявляют, что LISP и Scheme с их единственным, вездесущим механизмом структуры данных ( списком ) оказали большое влияние на их решение разработать таблицу в качестве основной структуры данных Lua. [8]

Lua Семантика со временем все больше подвергалась влиянию Scheme. [6] особенно с введением анонимных функций и полной лексической области видимости . В новых версиях Lua было добавлено несколько функций.

Версии Lua до версии 5.0 выпускались под лицензией, аналогичной лицензии BSD . Начиная с версии 5.0, Lua лицензируется по лицензии MIT . Обе лицензии являются разрешительными лицензиями на свободное программное обеспечение и практически идентичны.

Lua обычно называют « мультипарадигмальным » языком, предоставляющим небольшой набор общих функций, которые можно расширить для решения различных типов задач. Lua не содержит явной поддержки наследования , но позволяет реализовать его с помощью метатаблиц . Точно так же Lua позволяет программистам реализовывать пространства имен , классы и другие связанные функции, используя реализацию одной таблицы; первоклассные функции позволяют использовать многие методы функционального программирования , а полная лексическая область видимости позволяет скрывать детализированную информацию, чтобы обеспечить соблюдение принципа наименьших привилегий .

В общем, Lua стремится предоставить простые и гибкие мета-функции , которые можно расширять по мере необходимости, а не предоставлять набор функций, специфичный для одной парадигмы программирования. В результате базовый язык является легким ; полный справочный интерпретатор всего около 247 КБ. занимает [4] и легко адаптируется к широкому спектру применений.

Будучи динамически типизированным языком, предназначенным для использования в качестве языка расширения или языка сценариев , Lua достаточно компактен, чтобы соответствовать множеству хост-платформ. Он поддерживает лишь небольшое количество атомарных структур данных, таких как логические двойной точности значения, числа ( с плавающей запятой и 64-битные целые числа по умолчанию) и строки . Типичные структуры данных, такие как массивы , наборы , списки и записи, могут быть представлены с использованием единственной собственной структуры данных Lua — таблицы, которая по сути представляет собой гетерогенный ассоциативный массив .

Lua реализует небольшой набор расширенных функций, таких как первоклассные функции , сборка мусора , замыкания , правильные хвостовые вызовы , приведение (автоматическое преобразование между строковыми и числовыми значениями во время выполнения), сопрограммы (совместная многозадачность) и динамическая загрузка модулей .

Синтаксис

[ редактировать ]

Классический «Привет, мир!» Программу можно записать следующим образом, с круглыми скобками или без них: [9] [а]

print("Hello, World!")
print "Hello, World!"

Комментарий в Lua начинается с двойного дефиса и продолжается до конца строки, аналогично Ada , Eiffel , Haskell , SQL и VHDL . Многострочные строки и комментарии выделяются двойными квадратными скобками.

-- Single line comment--[[Multi-line comment--]]

Функция факториала реализована в этом примере:

function factorial(n)  local x = 1  for i = 2, n do    x = x * i  end  return xend

Поток управления

[ редактировать ]

В Lua есть один тип условной проверки: if then end с дополнительным else и elseif then Конструкции управления выполнением.

Общий if then end оператор требует всех трех ключевых слов:

if condition then	--statement bodyend

The else Ключевое слово может быть добавлено вместе с сопровождающим блоком операторов для управления выполнением, когда if состояние оценивается как false:

if condition then	--statement bodyelse	--statement bodyend

Выполнение также можно контролировать в соответствии с несколькими условиями с помощью elseif then ключевые слова:

if condition then	--statement bodyelseif condition then	--statement bodyelse -- optional	--optional default statement bodyend

В Lua есть четыре типа условных циклов: while петля , repeat цикл (аналогично do while цикл ), числовой for цикл и общий for петля.

--condition = truewhile condition do  --statementsendrepeat  --statementsuntil conditionfor i = first, last, delta do  --delta may be negative, allowing the for loop to count down or up  --statements  --example: print(i)end

Этот универсальный for цикл будет перебирать таблицу _G используя стандартную функцию итератора pairs, пока не вернется nil:

for key, value in pairs(_G) do  print(key, value)end

Циклы также могут быть вложенными (помещаться внутри другого цикла).

local grid = {  { 11, 12, 13 },  { 21, 22, 23 },  { 31, 32, 33 }}for y, row in pairs(grid) do  for x, value in pairs(row) do    print(x, y, value)  endend

Обработка функций в Lua как значений первого класса показана в следующем примере, где изменено поведение функции печати:

do  local oldprint = print  -- Store current print function as oldprint  function print(s)    --[[ Redefine print function. The usual print function can still be used      through oldprint. The new one has only one argument.]]    oldprint(s == "foo" and "bar" or s)  endend

Любые будущие вызовы print теперь будет маршрутизироваться через новую функцию, а из-за лексической области видимости Lua старая функция печати будет доступна только для новой, модифицированной печати.

Lua также поддерживает замыкания , как показано ниже:

function addto(x)  -- Return a new function that adds x to the argument  return function(y)    --[[ When we refer to the variable x, which is outside the current      scope and whose lifetime would be shorter than that of this anonymous      function, Lua creates a closure.]]    return x + y  endendfourplus = addto(4)print(fourplus(3)) -- Prints 7--This can also be achieved by calling the function in the following way:print(addto(4)(3))--[[ This is because we are calling the returned function from 'addto(4)' with the argument '3' directly.  This also helps to reduce data cost and up performance if being called iteratively.]]

Новое замыкание для переменной x создается каждый раз addto вызывается, так что каждая новая возвращаемая анонимная функция всегда будет иметь доступ к своей собственной x параметр. Закрытием управляет сборщик мусора Lua, как и любой другой объект.

Таблицы являются наиболее важными структурами данных (и, по замыслу, единственным встроенным составным типом данных ) в Lua и являются основой всех типов, создаваемых пользователем. Они представляют собой ассоциативные массивы с добавлением автоматического числового ключа и специального синтаксиса.

Таблица представляет собой набор пар ключей и данных, где на данные ссылается ключ; другими словами, это хешированный гетерогенный ассоциативный массив.

Таблицы создаются с помощью {} синтаксис конструктора.

a_table = {} -- Creates a new, empty table

Таблицы всегда передаются по ссылке (см . Вызов путем совместного использования ).

Ключ (индекс) может иметь любое значение, кроме nil и NaN , включая функции.

a_table = {x = 10}  -- Creates a new table, with one entry mapping "x" to the number 10.print(a_table["x"]) -- Prints the value associated with the string key, in this case 10.b_table = a_tableb_table["x"] = 20   -- The value in the table has been changed to 20.print(b_table["x"]) -- Prints 20.print(a_table["x"]) -- Also prints 20, because a_table and b_table both refer to the same table.

Таблица часто используется как структура (или запись ), используя строки в качестве ключей. Поскольку такое использование очень распространено, Lua имеет специальный синтаксис для доступа к таким полям. [11]

point = { x = 10, y = 20 }   -- Create new tableprint(point["x"])            -- Prints 10print(point.x)               -- Has exactly the same meaning as line above. The easier-to-read dot notation is just syntactic sugar.

Используя таблицу для хранения связанных функций, она может выступать в качестве пространства имен.

Point = {}Point.new = function(x, y)  return {x = x, y = y}  --  return {["x"] = x, ["y"] = y}endPoint.set_x = function(point, x)  point.x = x  --  point["x"] = x;end

Таблицам автоматически присваивается числовой ключ, что позволяет использовать их в качестве типа данных массива . Первый автоматический индекс равен 1, а не 0, как во многих других языках программирования (хотя допускается явный индекс 0).

Цифровой ключ 1 отличается от строкового ключа "1".

array = { "a", "b", "c", "d" }   -- Indices are assigned automatically.print(array[2])                  -- Prints "b". Automatic indexing in Lua starts at 1.print(#array)                    -- Prints 4.  # is the length operator for tables and strings.array[0] = "z"                   -- Zero is a legal index.print(#array)                    -- Still prints 4, as Lua arrays are 1-based.

Длина стола t определяется как любой целочисленный индекс n такой, что t[n] не nil и t[n+1] является nil; более того, если t[1] является nil, n может быть нулевым. Для обычного массива с ненулевыми значениями от 1 до заданного n, его длина именно такая n, индекс его последнего значения. Если в массиве есть «дыры» (то есть нулевые значения между другими ненулевыми значениями), то #t может быть любым из индексов, который непосредственно предшествует nil value (то есть любое такое нулевое значение может считаться концом массива). [12]

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

Таблица может представлять собой массив объектов.

function Point(x, y)        -- "Point" object constructor  return { x = x, y = y }   -- Creates and returns a new object (table)endarray = { Point(10, 20), Point(30, 40), Point(50, 60) }   -- Creates array of points                        -- array = { { x = 10, y = 20 }, { x = 30, y = 40 }, { x = 50, y = 60 } };print(array[2].y)                                         -- Prints 40

Использование хэш-карты для эмуляции массива обычно медленнее, чем использование реального массива; однако таблицы Lua оптимизированы для использования в качестве массивов, чтобы избежать этой проблемы. [13]

Метатаблицы

[ редактировать ]

Расширяемая семантика — ключевая особенность Lua, а концепция метатаблиц обеспечивает мощную настройку таблиц. В следующем примере демонстрируется «бесконечная» таблица. Для любого n, fibs[n] даст n число Фибоначчи с использованием динамического программирования и мемоизации .

fibs = { 1, 1 }                                -- Initial values for fibs[1] and fibs[2].setmetatable(fibs, {  __index = function(values, n)                --[[__index is a function predefined by Lua,                                                    it is called if key "n" does not exist.]]    values[n] = values[n - 1] + values[n - 2]  -- Calculate and memoize fibs[n].    return values[n]  end})

Объектно-ориентированное программирование

[ редактировать ]

Хотя в Lua нет встроенной концепции классов , объектно-ориентированное программирование можно эмулировать с помощью функций и таблиц. Объект формируется путем помещения методов и полей в таблицу. Наследование (как одиночное, так и множественное) можно реализовать с помощью метатаблиц , делегируя несуществующие методы и поля родительскому объекту.

В этих методах нет такого понятия, как «класс»; скорее, прототипы используются , подобные Self или JavaScript . Новые объекты создаются либо с помощью фабричного метода (который создает новые объекты с нуля), либо путем клонирования существующего объекта.

Создание базового векторного объекта:

local Vector = {}local VectorMeta = { __index = Vector}function Vector.new(x, y, z)    -- The constructor  return setmetatable({x = x, y = y, z = z}, VectorMeta)endfunction Vector.magnitude(self)     -- Another method  return math.sqrt(self.x^2 + self.y^2 + self.z^2)endlocal vec = Vector.new(0, 1, 0) -- Create a vectorprint(vec.magnitude(vec))       -- Call a method (output: 1)print(vec.x)                    -- Access a member variable (output: 0)

Здесь, setmetatable сообщает Lua искать элемент в Vector таблице, если ее нет в vec стол. vec.magnitude, что эквивалентно vec["magnitude"], впервые смотрит в vec стол для magnitude элемент. vec таблица не имеет magnitude элемент, но его метатаблица делегирует Vector стол для magnitude элемент, когда он не найден в vec стол.

Lua предоставляет некоторый синтаксический сахар для облегчения объектной ориентации. Чтобы объявить функции-члены внутри таблицы прототипов, можно использовать function table:func(args), что эквивалентно function table.func(self, args). При вызове методов класса также используется двоеточие: object:func(args) эквивалентно object.func(object, args).

Имея это в виду, вот соответствующий класс с : синтаксический сахар:

local Vector = {}Vector.__index = Vectorfunction Vector:new(x, y, z)    -- The constructor  -- Since the function definition uses a colon,   -- its first argument is "self" which refers  -- to "Vector"  return setmetatable({x = x, y = y, z = z}, self)endfunction Vector:magnitude()     -- Another method  -- Reference the implicit object using self  return math.sqrt(self.x^2 + self.y^2 + self.z^2)endlocal vec = Vector:new(0, 1, 0) -- Create a vectorprint(vec:magnitude())          -- Call a method (output: 1)print(vec.x)                    -- Access a member variable (output: 0)

Наследование

[ редактировать ]

Lua поддерживает использование метатаблиц для наследования классов Lua. [14] В этом примере мы разрешаем векторам умножать свои значения на константу в производном классе.

local Vector = {}Vector.__index = Vectorfunction Vector:new(x, y, z)    -- The constructor  -- Here, self refers to whatever class's "new"  -- method we call.  In a derived class, self will  -- be the derived class; in the Vector class, self  -- will be Vector  return setmetatable({x = x, y = y, z = z}, self)endfunction Vector:magnitude()     -- Another method  -- Reference the implicit object using self  return math.sqrt(self.x^2 + self.y^2 + self.z^2)end-- Example of class inheritancelocal VectorMult = {}VectorMult.__index = VectorMultsetmetatable(VectorMult, Vector) -- Make VectorMult a child of Vectorfunction VectorMult:multiply(value)   self.x = self.x * value  self.y = self.y * value  self.z = self.z * value  return selfendlocal vec = VectorMult:new(0, 1, 0) -- Create a vectorprint(vec:magnitude())          -- Call a method (output: 1)print(vec.y)                    -- Access a member variable (output: 1)vec:multiply(2)                 -- Multiply all components of vector by 2print(vec.y)                    -- Access member again (output: 2)

Lua также поддерживает множественное наследование ; __index может быть функцией или таблицей. [15] перегрузка операторов Также возможна ; Метатаблицы Lua могут содержать такие элементы, как __add, __sub и так далее. [16]

Выполнение

[ редактировать ]

Программы Lua не интерпретируются непосредственно из текстового файла Lua, а компилируются в байт-код, который затем запускается на виртуальной машине Lua (VM). Процесс компиляции обычно невидим для пользователя и выполняется во время выполнения , особенно когда используется JIT -компилятор, но его можно выполнять и в автономном режиме, чтобы повысить производительность загрузки или уменьшить объем памяти, занимаемой компилятором. среду хоста, исключив компилятор. Байт-код Lua также можно создать и выполнить изнутри Lua, используя команду dump функция из библиотеки строк и load/loadstring/loadfile функции. Lua версии 5.3.4 реализован примерно в 24 000 строк кода C. [3] [4]

Как и большинство процессоров и в отличие от большинства виртуальных машин (которые основаны на стеке ), виртуальная машина Lua основана на регистрах и, следовательно, больше напоминает конструкцию большинства аппаратных средств. Архитектура регистров позволяет избежать чрезмерного копирования значений и уменьшает общее количество инструкций на функцию. Виртуальная машина Lua 5 — одна из первых чистых виртуальных машин на основе регистров, получивших широкое распространение. [17] Parrot и Android от Dalvik — две другие известные виртуальные машины на основе регистров. Виртуальная машина PCScheme также была основана на регистрах. [18]

Этот пример представляет собой листинг байт-кода функции факториала, определенной выше (как показано в luac 5.1 компилятор): [19]

function <factorial.lua:1,7> (9 instructions, 36 bytes at 0x8063c60)1 param, 6 slots, 0 upvalues, 6 locals, 2 constants, 0 functions	1	[2]	LOADK    	1 -1	; 1	2	[3]	LOADK    	2 -2	; 2	3	[3]	MOVE     	3 0	4	[3]	LOADK    	4 -1	; 1	5	[3]	FORPREP  	2 1	; to 7	6	[4]	MUL      	1 1 5	7	[3]	FORLOOP  	2 -2	; to 6	8	[6]	RETURN   	1 2	9	[7]	RETURN   	0 1

Lua предназначен для встраивания в другие приложения и для этой цели предоставляет C API . API разделен на две части: ядро ​​Lua и вспомогательную библиотеку Lua. [20] Конструкция Lua API устраняет необходимость ручного подсчета (управления) ссылок в коде C, в отличие от Python API . API, как и язык, минималистичный. Расширенные функции предоставляются вспомогательной библиотекой, состоящей в основном из препроцессора макросов , помогающих выполнять сложные операции с таблицами.

API Lua C основан на стеке . Lua предоставляет функции для отправки и извлечения самых простых типов данных C (целые числа, числа с плавающей запятой и т. д.) в стек и из него, а также функции для управления таблицами через стек. Стек Lua несколько отличается от традиционного стека; например, стек можно индексировать напрямую. Отрицательные индексы указывают на смещение от вершины стека. Например, −1 — это верхнее значение (последнее введенное значение), а положительные индексы указывают на смещение от нижнего (самое старое значение). Маршалинг данных между функциями C и Lua также выполняется с использованием стека. Чтобы вызвать функцию Lua, аргументы помещаются в стек, а затем lua_call используется для вызова фактической функции. При написании функции C для прямого вызова из Lua аргументы считываются из стека.

Вот пример вызова функции Lua из C:

#include <stdio.h>#include <lua.h> // Lua main library (lua_*)#include <lauxlib.h> // Lua auxiliary library (luaL_*)int main(void){    // create a Lua state    lua_State *L = luaL_newstate();    // load and execute a string    if (luaL_dostring(L, "function foo (x,y) return x+y end")) {        lua_close(L);        return -1;    }    // push value of global "foo" (the function defined above)    // to the stack, followed by integers 5 and 3    lua_getglobal(L, "foo");    lua_pushinteger(L, 5);    lua_pushinteger(L, 3);    lua_call(L, 2, 1); // call a function with two arguments and one return value    printf("Result: %d\n", lua_tointeger(L, -1)); // print integer value of item at stack top    lua_pop(L, 1); // return stack to original state    lua_close(L); // close Lua state    return 0;}

Запуск этого примера дает:

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

C API также предоставляет несколько специальных таблиц, расположенных в различных «псевдоиндексах» стека Lua. В LUA_GLOBALSINDEX до Lua 5.2 [21] это таблица глобальных переменных, _G изнутри Lua, который является основным пространством имен . Также существует реестр, расположенный по адресу LUA_REGISTRYINDEX где программы C могут хранить значения Lua для последующего извлечения.

Помимо модулей стандартной библиотеки (ядра), можно писать расширения с использованием Lua API. Модули расширения — это общие объекты , которые можно использовать для расширения функций интерпретатора путем предоставления собственных возможностей сценариям Lua. Скрипты Lua могут загружать модули расширения, используя require, [20] точно так же, как модули, написанные на самом Lua или с помощью package.loadlib. [22] Когда библиотека C загружается через require('foo') Lua будет искать функцию luaopen_foo и вызвать ее, которая действует как любая функция C, вызываемая из Lua, и обычно возвращает таблицу, заполненную методами. Растущий набор модулей, называемых Rocks доступен через систему управления пакетами LuaRocks , . [23] в духе CPAN , RubyGems и Python egg . Lua Предварительно написанные привязки существуют для большинства популярных языков программирования, включая другие языки сценариев. [24] Для C++ существует ряд подходов на основе шаблонов и несколько автоматических генераторов привязок.

Приложения

[ редактировать ]

В разработке видеоигр Lua широко используется в качестве языка сценариев , в основном из-за его кажущейся простоты внедрения, быстрого выполнения и короткой кривой обучения . [25] Известные игры, использующие Lua, включают Roblox , [26] Garry's Mod , World of Warcraft , Payday 2 , Phantasy Star Online 2 , Dota 2 , Crysis , [27] и многие другие. В некоторые игры, которые изначально не поддерживают программирование или сценарии Lua, эта функция добавляется модами, как это делает ComputerCraft для Minecraft . Кроме того, Lua используется в программном обеспечении, не связанном с видеоиграми, таком как Adobe Lightroom , Moho , iClone , Aerospike и некоторых системных программах во FreeBSD и NetBSD , а также используется в качестве языка сценариев шаблонов в MediaWiki с использованием расширения Scribunto. [28]

В 2003 году опрос, проведенный GameDev.net, показал, что Lua является самым популярным языком сценариев для программирования игр. [29] 12 января 2012 года Lua был объявлен победителем премии Front Line Award 2011 журнала Game Developer в категории «Инструменты программирования». [30]

Многие неигровые приложения также используют Lua для расширения, такие как LuaTeX , реализация TeX языка набора текста , Redis , база данных «ключ-значение» , ScyllaDB , хранилище с широкими столбцами , Neovim , текстовый редактор, Nginx , веб-сервер и Wireshark — анализатор сетевых пакетов.

Благодаря расширению Scribunto Lua доступен в качестве серверного языка сценариев в программном обеспечении MediaWiki , на котором работает Arc.Ask3.Ru и другие вики. [31] Среди его применений — возможность интеграции данных из Викиданных в статьи, [32] и питание автоматизированной системы Taxobox .

Производные языки

[ редактировать ]

Языки, которые компилируются в Lua

[ редактировать ]

Диалекты

[ редактировать ]
  • LuaJIT — своевременный компилятор Lua 5.1. [38] [39]
  • Lua u , разработанная Roblox Corporation , производная от Lua 5.1 с постепенной типизацией , дополнительными функциями и ориентацией на производительность. [40]
  • Ravi, язык Lua 5.3 с поддержкой JIT и дополнительной статической типизацией. JIT руководствуется информацией о типе. [41]
  • Shine — ответвление LuaJIT со множеством расширений, включая систему модулей и систему макросов. [42]
  • Glua, модифицированная версия, встроенная в игру Garry's Mod в качестве языка сценариев. [43]
  • Бирюзовый — статически типизированный диалект Lua, написанный на Lua.

Кроме того, сообщество пользователей Lua предоставляет некоторые исправления мощности поверх эталонной реализации C. [44]

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Синтаксический сахар, табличная конструкция или литеральная строка, следующая за идентификатором, является допустимым вызовом функции. [10]
  1. ^ «[ANN] Lua 5.4.7 теперь доступен» . 25 июня 2024 г. Проверено 27 июня 2024 г.
  2. ^ Команда Ринг (5 декабря 2017 г.). «Язык программирования The Ring и другие языки» . Ring-lang.net . Архивировано из оригинала 25 декабря 2018 года . Проверено 5 декабря 2017 г.
  3. ^ Перейти обратно: а б Иерусалимский, Роберто; де Фигейредо, Луис Энрике; Сын, Вальдемар Селес (июнь 1996 г.). «Lua — расширяемый язык расширения» . Программное обеспечение: практика и опыт . 26 (6): 635–652. doi : 10.1002/(SICI)1097-024X(199606)26:6<635::AID-SPE26>3.0.CO;2-P . S2CID   61066194 . Проверено 24 октября 2015 .
  4. ^ Перейти обратно: а б с «О Луа» . Луа.орг . Проверено 11 августа 2011 г.
  5. ^ Тахтеев, Юрий (21 апреля 2013 г.). «Из Бразилии в Википедию » Иностранные дела . Получено 25 апреля.
  6. ^ Перейти обратно: а б с д Иерусалимский, Р. ; Фигейредо, ЛХ; Селес, В. (2007). «Эволюция Lua» (PDF) . Материалы третьей конференции ACM SIGPLAN по истории языков программирования . стр. 2–1–2–26. дои : 10.1145/1238844.1238846 . ISBN  978-1-59593-766-7 . S2CID   475143 .
  7. ^ «Эволюция языка расширения: история Lua» . 2001 . Проверено 18 декабря 2008 г.
  8. ^ Фигейредо, ЛХ; Иерусалимский, Р.; Селес, В. (декабрь 1996 г.). «Lua: расширяемый встроенный язык. Несколько метамеханизмов заменяют множество функций» . Доктор Журнал Добба . Том. 21, нет. 12. стр. 26–33.
  9. ^ «Программирование на Lua: 1» .
  10. ^ «Справочное руководство по Lua 5.0, 2.5.7, Вызовы функций» .
  11. ^ «Справочное руководство по Lua 5.1» . 2014 . Проверено 27 февраля 2014 г.
  12. ^ «Справочное руководство по Lua 5.1» . 2012 . Проверено 16 октября 2012 г.
  13. ^ «Исходный код Lua 5.1» . 2006 год . Проверено 24 марта 2011 г.
  14. ^ Роберт Иерусалимский. Программирование на Lua, 4-е издание . п. 165.
  15. ^ «Программирование на Lua: 16.3» . Луа . Проверено 16 сентября 2021 г.
  16. ^ «Урок по метаметодам» . lua-пользователи вики . Архивировано из оригинала 16 сентября 2021 года . Проверено 16 сентября 2021 г.
  17. ^ Иерусалимский, Р.; Фигейредо, ЛХ; Селес, В. (2005). «Реализация Lua 5.0» . Дж. Universal Comp. Наука . 11 (7): 1159–1176. дои : 10.3217/jucs-011-07-1159 .
  18. ^ Техасские инструменты (1990). PC Scheme: Руководство пользователя и справочное руководство по языку, Trade Edition . МИП Пресс. ISBN  0-262-70040-9 .
  19. ^ Мужчина, Кейн-Хонг (2006). «Без излишеств в инструкциях для Lua 5.1 VM» (PDF) .
  20. ^ Перейти обратно: а б «Справочное руководство по Lua 5.2» . Луа.орг . Проверено 23 октября 2012 г.
  21. ^ Иерусалимский, Роберто; де Фигейредо, Луис Энрике; Селес, Вальдемар (2011–2013). Изменения в API . Луа.орг . Проверено 9 мая 2014 г. {{cite book}}: |work= игнорируется ( помогите )
  22. ^ Иерусалимский, Роберто; де Фигейредо, Луис Энрике; СЕЛЕС, Вальдемар. «Справочное руководство по Lua 5.4» . Луна . Проверено 1 июня 2022 г.
  23. ^ «ЛуаРокс» . luarocks.org . Проверено 24 мая 2009 г.
  24. ^ «Привязка кода к Lua» . Вики для пользователей Lua. Архивировано из оригинала 27 июля 2009 года . Проверено 24 мая 2009 г.
  25. ^ «Почему Lua считается игровым языком?» . Переполнение стека . Архивировано из оригинала 20 августа 2013 года . Проверено 22 апреля 2017 г.
  26. ^ «Почему Луа ты . Луау . Проверено 23 марта 2022 г.
  27. ^ «Введение в серверный моддинг Crysis» . Проверено 23 марта 2022 г.
  28. ^ «Функции Lua» . wow.gamepedia.com . Проверено 1 марта 2021 г.
  29. ^ «Результаты опроса» . Архивировано из оригинала 7 декабря 2003 года . Проверено 22 апреля 2017 г. {{cite web}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  30. ^ «Объявлены победители премии Front Line» . Архивировано из оригинала 15 июня 2013 года . Проверено 22 апреля 2017 г.
  31. ^ «Расширение:Скрипт — MediaWiki » МедиаВики.орг . Получено 21 февраля.
  32. ^ «Викиданные:Учебное пособие по информационному окну — Викиданные» . www.wikidata.org . Проверено 21 декабря 2018 г.
  33. ^ «Языковое руководство — MoonScript 0.5.0» . Moonscript.org . Проверено 25 сентября 2020 г.
  34. ^ лист (23 сентября 2020 г.). "лист/мунскрипт" . Проверено 25 сентября 2020 г.
  35. ^ Перейти обратно: а б Гарсия, Андре Алвес. «Языки, компилируемые в Lua» . АндреГарция.com . Проверено 25 сентября 2020 г.
  36. ^ «Urn: реализация Lisp для Lua | Urn» . urn-lang.com . Проверено 12 января 2021 г.
  37. ^ «Амулет МЛ» . амулет.работает . Проверено 12 января 2021 г.
  38. ^ «ЛуаДЖИТ» . ЛуаЖИТ .
  39. ^ «Расширения» . ЛуаЖИТ .
  40. ^ «Почему Луау?» . Луау . Проверено 3 августа 2024 г. Все это побудило нас начать переделывать Lua 5.1, с которого мы начали, в новый производный язык, который мы называем Luau. Наша цель — сделать язык более производительным и многофункциональным, а также упростить написание надежного кода за счет сочетания проверки типов и проверки типов с использованием системы постепенного типизации.
  41. ^ «Язык программирования Рави» . Гитхаб .
  42. ^ Хундт, Ричард (22 апреля 2021 г.). «Ричардхундт/сияние» . Гитхаб .
  43. ^ «Garry's Mod Wiki» . wiki.facepunch.com .
  44. ^ «Патчи мощности Lua» . lua-users.org . Архивировано из оригинала 18 мая 2021 года . Проверено 18 мая 2021 г.

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: ec57bb55237690fb42923e3100fb5799__1722714780
URL1:https://arc.ask3.ru/arc/aa/ec/99/ec57bb55237690fb42923e3100fb5799.html
Заголовок, (Title) документа по адресу, URL1:
Lua (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)