Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Луа ( / л ¯u ə / ЛОО -ə ; от португальцев : Lua [ˈLu. (W) ɐ] означает луна ) [a] - это легкий , высокоуровневый , многопарадигмальный язык программирования, разработанный в первую очередь для встроенного использования в приложениях. [2] Lua является кросс-платформенного , так как интерпретатор из скомпилированных байт - кода записывается в ANSI C , [3] и Луо имеет относительно простой C API , чтобы встроить его в приложения. [4]

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

История [ править ]

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

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

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

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

В 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 ++ ( "аккуратной идеи разрешитьлокальная переменная должна быть объявлена ​​только там, где она нам нужна » [5] ), SNOBOL и AWK ( ассоциативные массивы ). В статье, опубликованной в журнале доктора Добба , создатели Lua также заявляют, что LISP и Scheme с их единой, вездесущей структурой данных Механизм ( список ) оказал большое влияние на их решение разработать таблицу как первичную структуру данных Lua. [7]

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

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

Особенности [ править ]

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

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

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

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

Синтаксис [ править ]

Классический "Hello, World!" программу можно записать так: [8]

print ( «Привет, мир!» )

или как:

напечатать  "Hello World!"

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

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

функция  factorial ( n )  local  x  =  1  для  i  =  2 ,  n  do  x  =  x  *  i  end  return  x end

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

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

--condition = trueв то время как  условие  do -  утверждения заканчиваютсяповторить  --statements до  состоянияfor  i  =  first ,  last ,  delta  do  --delta может быть отрицательным, что позволяет циклу for вести  обратный  или восходящий отсчет --statements --example : print (i) end

Общий forцикл:

для  ключа ,  значение  в  паре ( _G )  сделать  печать ( ключ ,  значение ) конец

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

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

местная  сетка  =  {  {  11 ,  12 ,  13  },  {  21 ,  22 ,  23  },  {  31 ,  32 ,  33  } }для  y ,  строка  в  ipairs ( сетка )  do  для  x ,  значение  в  ipairs ( row )  do  print ( x ,  y ,  grid [ y ] [ x ])  end end

Функции [ править ]

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

делать  локальный  oldprint  =  печать  - Сохраняет текущую функцию печати , как oldprint  функция  печати ( ов )  - [[функция печати переопределять. Обычную функцию печати можно по-прежнему использовать  через oldprint. У нового только один аргумент.]]  Oldprint ( s  ==  "foo"  и  "bar"  or  s )  end end

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

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

function  addto ( x )  - возвращает новую функцию, которая добавляет x к аргументу  return  function ( y )  - [= [Когда мы ссылаемся на переменную x, которая находится за пределами текущей  области и время жизни которой будет короче, чем у это анонимная  функция, Lua создает закрытие] =].  возвращение  х  +  у  конца конец fourplus  =  AddTo ( 4 ) печать ( fourplus ( 3 ))  - печать 7- Этого также можно достичь, вызвав функцию следующим образом: print ( addto ( 4 ) ( 3 )) - [[Это потому, что мы вызываем возвращаемую функцию из addto (4) с аргументом » 3 'напрямую.  Это также помогает снизить стоимость данных и повысить производительность при итеративном вызове. ]]

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

Таблицы [ править ]

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

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

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

a_table  =  {}  - создает новую пустую таблицу

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

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

a_table  =  { x  =  10 }  - создает новую таблицу с одной записью, отображающей "x" на число 10. print ( a_table [ "x" ])  - печатает значение, связанное со строковым ключом, в данном случае 10 . b_table  =  a_table b_table [ "x" ]  =  20  - Значение в таблице было изменено на 20. print ( b_table [ "x" ])  - Выводит 20. print ( a_table [ "x" ]) - Также выводит 20, потому что a_table и b_table относятся к одной и той же таблице.

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

point  =  {  x  =  10 ,  y  =  20  }  - Создать новую таблицу print ( point [ "x" ])  - Печать 10 print ( point . x )  - Имеет точно такое же значение, что и строка выше. Более легкая для чтения запись с точкой - это просто синтаксический сахар.

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

Point  =  {}Точка . new  =  function ( x ,  y )  return  { x  =  x ,  y  =  y }  - return {["x"] = x, ["y"] = y} конецТочка . set_x  =  функция ( точка ,  x )  точка . x  =  x  - точка ["x"] = x; конец

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

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

array  =  {  "a" ,  "b" ,  "c" ,  "d"  }  - индексы присваиваются автоматически. print ( array [ 2 ])  - печатает «b». Автоматическая индексация в Lua начинается с 1. print ( # array )  - выводит 4. # - оператор длины для таблиц и строк. array [ 0 ]  =  "z"  - ноль - допустимый индекс. print ( # array )  - по-прежнему печатает 4, поскольку массивы Lua основаны на 1.

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

ExampleTable  = {  { 1 ,  2 ,  3 ,  4 },  { 5 ,  6 ,  7 ,  8 } } print ( ExampleTable [ 1 ] [ 3 ])  - выводит "3" print ( ExampleTable [ 2 ] [ 4 ])  - - Отпечатки «8»

Таблица может быть массивом объектов.

function  Point ( x ,  y )  - Конструктор объекта "Point"  return  {  x  =  x ,  y  =  y  }  - Создает и возвращает новый объект (таблицу) end array  =  {  Point ( 10 ,  20 ),  Point ( 30 ,  40 ),  Point ( 50 ,  60 )  }  - Создает массив точек  - array = {{x = 10, y = 20}, {x = 30, y = 40}, {x = 50, y = 60} }; печать (массив [ 2 ]. y )  - Отпечатки 40

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

Метатаблицы [ править ]

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

fibs  =  {  1 ,  1  }  - Начальные значения для fibs [1] и fibs [2]. setmetatable ( fibs ,  {  __index  =  function ( values ,  n )  - [[__ index - это функция, предопределенная Lua,  она вызывается, если ключ «n» не существует.]]  values [ n ]  =  values [ n  -  1 ]  +  values [ n  -  2 ]  - Вычислить и запомнить fibs [n]. возвращаемые  значения [ n ]  end })

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

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

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

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

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

локальный  Vector3  =  {} Vector3 . __index  =  Vector3функция  Vector3 . new ( x ,  y ,  z )  - конструктор  возвращает  setmetatable ({ x  =  x ,  y  =  y ,  z  =  z },  Vector ) endФункция  Vector3 : величина ()  - Другой метод  - ссылка неявный объект с помощью самостоятельного  возвращения  Math.sqrt ( сам . х ^ 2  +  самостоятельно . у ^ 2  +  самостоятельно . г ^ 2 ) конецлокальный  vec  =  Vector3 . new ( 0 ,  1 ,  0 )  - Создание вектора print ( vec : magnitude ())  - Вызов метода (вывод: 1) print ( vec . x )  - Доступ к переменной-члену (вывод: 0)

Реализация [ править ]

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

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

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

function <factorial.lua: 1,7> (9 инструкций, 36 байт в 0x8063c60)1 параметр, 6 слотов, 0 повышающих значений, 6 локальных переменных, 2 константы, 0 функций1 [2] LOADK 1 -1; 12 [3] LOADK 2 -2; 23 [3] ДВИЖЕНИЕ 3 04 [3] LOADK 4 -1; 15 [3] FORPREP 2 1; до 76 [4] MUL 1 1 57 [3] FORLOOP 2 -2; до 68 [6] ВОЗВРАТ 1 29 [7] ВОЗВРАТ 0 1

C API [ править ]

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

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

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

#include  <stdio.h>#include  <lua.h> // основная библиотека Lua (lua_ *)#include  <lauxlib.h> // Вспомогательная библиотека Lua (luaL_ *)int  main ( void ) {  // создать состояние Lua  lua_State  * L  =  luaL_newstate (); // загружаем и выполняем строку  if  ( luaL_dostring ( L ,  "function foo (x, y) return x + y end" ))  {  lua_close ( L );  возврат  -1 ;  } // помещаем значение глобального "foo" (функция, определенная выше)  // в стек, а затем целые числа 5 и 3  lua_getglobal ( L ,  "foo" );  lua_pushinteger ( L ,  5 );  lua_pushinteger ( L ,  3 );  lua_call ( L ,  2 ,  1 );  // вызов функции с двумя аргументами и одним возвращаемым значением  printf ( "Результат:% d \ n " ,  lua_tointeger ( L ,  -1 )); // вывод целочисленного значения элемента на вершину стека  lua_pop ( L ,  1 );  // возвращаем стек в исходное состояние  lua_close ( L );  // закрываем состояние Lua  return  0 ; }

Выполнение этого примера дает:

$ cc -o пример example.c -llua$ ./exampleРезультат: 8

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

Можно писать модули расширения с помощью Lua API. Модули расширения - это общие объекты, которые можно использовать для расширения функциональности интерпретатора, предоставляя собственные возможности сценариям Lua. Со стороны Lua такой модуль выглядит как таблица пространства имен, содержащая его функции и переменные. Скрипты Lua могут загружать модули расширения require, [15] точно так же, как модули, написанные на самом Lua. Растущая коллекция модули , известные как породы доступна через систему управления пакетами под названием LuaRocks , [17] в духе CPAN , RubyGems и яйцо Python . Предварительно написанный Luaпривязки существуют для большинства популярных языков программирования, включая другие языки сценариев. [18] Для C ++ существует ряд подходов на основе шаблонов и несколько генераторов автоматических привязок.

Приложения [ править ]

В разработке видеоигр , Lua широко используется как язык сценариев с помощью программистов , в основном из - за его предполагаемой легкости врезать, быстрое выполнение и короткой кривой обучения . [19] Одной из известных игровых платформ является Roblox, в которой их собственный диалект, Luau, используется для написания сценариев быстрой разработки игр. [20]

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

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

Благодаря расширению Scribunto Lua доступен как язык сценариев на стороне сервера в программном обеспечении MediaWiki, которое поддерживает Википедию и другие вики. [23] [24] [ Циркулярная ссылка ] Среди его применений - возможность интеграции данных из Викиданных в статьи, [25] и обеспечение работы автоматизированной системы таксобоксов .


Языки, компилируемые в Lua [ править ]

  • MoonScript является динамическим , пробельные , чувствительными к скриптовый язык вдохновлен CoffeeScript , который компилируется в Lua. Это означает, что вместо использования doи end(или {и }) для разделения частей кода он использует разрывы строк и стиль отступа . [26] [27] [28] Заметное использование MoonScript видеоигры распределение сайт Itch.io .
  • Haxe поддерживает компиляцию в цель Lua, поддерживая Lua 5.1-5.3, а также LuaJIT 2.0 и 2.1.
  • Фенхель. [28]
  • Урн, диалект Лиспа , построенный на Lua. [29]
  • Амулет, ML -как функционального языка , которого компилятор выходы Lua файлы. [30]

LuaJIT [ править ]

LuaJIT - своевременный компилятор для Lua. Он был использован либо встраиваемым, либо для общих целей. В версии 2.0 LuaJIT проект был переписан для лучшей оптимизации производительности. [32]

История [ править ]

Проект LuaJIT был запущен в 2005 году разработчиком Майком Полом и выпущен под лицензией MIT с открытым исходным кодом. [33] Последний выпуск, 2.0.5, выпущен в 2017 году. С тех пор проект в настоящее время не поддерживается другими разработчиками, кроме участников. [34]

Установка [ править ]

Поскольку LuaJIT является открытым исходным кодом, проект необходимо скомпилировать, чтобы его можно было использовать. Репозиторий необходимо будет загрузить с помощью Git или других методов загрузки репозиториев. [34] Затем он компилируется с помощью любого компилятора C, обычно с помощью GNU make , но доступны и другие варианты. [35] Наконец, исполняемый файл LuaJIT и DLL Lua 5.1 должны находиться в одном каталоге, чтобы можно было использовать компилятор LuaJIT.

Существует руководство по использованию компилятора LuaJIT, которое включает параметры командной строки. [36]

Производительность [ править ]

По сравнению с другими средами выполнения Lua, LuaJIT обычно самый быстрый из всех компиляторов Lua. [37]

Платформы [ править ]

LuaJIT можно использовать в: [38]

  • Windows
  • Linux
  • BSD
  • macOS
  • Android
  • IOS
  • PS3
  • PS4
  • PS Vita
  • Xbox 360

Его можно скомпилировать с помощью GCC , Clang или MSVC . [38]

Примеры [ править ]

Библиотеку FFi можно использовать для вызова функций C и использования структур данных C из Lua Code. [39] LuaJIT предоставляет руководство по использованию этой библиотеки. [40] Таким образом, существует несколько привязок LuaJIT к библиотекам C, которые используют библиотеку FFI. Этот пример вызовет функцию C printf из чистого кода Lua и выведет Hello world! .

local  ffi  =  require ( "ffi" ) ffi . cdef [[ int printf (const char * fmt, ...); ]] ffi . C . printf ( "Привет, мир! \ n " )

Компилятор LuaJIT также добавил некоторые расширения в Lua C API. [41] Этот пример, написанный на C ++ , будет использоваться в целях отладки .

#include  <исключение>#include  "lua.hpp"// Перехват исключений C ++ и преобразование их в сообщения об ошибках Lua. // Настройте по мере необходимости для ваших собственных классов исключений. статические  INT  wrap_exceptions ( lua_State  * L ,  lua_CFunction  е ) {  попытка  {  возвращение  е ( L );  // Вызвать обернутую функцию и вернуть результат.  }  catch  ( const  char  * s )  {  // Перехват и преобразование исключений.  lua_pushstring ( L ,  s );  }  catch  ( std:: исключение &  е )  {  lua_pushstring ( L ,  е . what ());  }  catch  (...)  {  lua_pushliteral ( L ,  "поймал (...)" );  }  return  lua_error ( L );  // Возврат как ошибка Lua. }статические  INT  MyInit ( lua_State  * L ) {  ...  // Определение обертка функции и включить его.  lua_pushlightuserdata ( L ,  ( void  * ) wrap_exceptions );  luaJIT_setmode ( L ,  -1 ,  LUAJIT_MODE_WRAPCFUNC | LUAJIT_MODE_ON );  lua_pop ( L ,  1 );  ... }

См. Также [ править ]

  • Сравнение языков программирования

Примечания [ править ]

  1. ^ Имя обычно, но неправильно отображается как «LUA». Это неверно, потому что имя не является аббревиатурой .

Ссылки [ править ]

  1. ^ Ring Team (5 декабря 2017 г.). «Язык программирования Ring и другие языки» . ring-lang.net . Ring-lang .
  2. ^ a b Иерусалимский, Роберто; де Фигейредо, Луис Энрике; Филхо, Вальдемар Селес (июнь 1996 г.). «Lua - расширяемый язык расширения» . Программное обеспечение: практика и опыт . 26 (6): 635–652. DOI : 10.1002 / (SICI) 1097-024X (199606) 26: 6 <635 :: AID-SPE26> 3.0.CO; 2-P . Проверено 24 октября 2015 года .
  3. ^ a b c "О Lua" . Lua.org . Проверено 11 августа 2011 года .
  4. ^ Юрий Takhteyev (21 апреля 2013). «Из Бразилии в Википедию» . Иностранные дела . Проверено 25 апреля 2013 года .
  5. ^ a b c d Иерусалимский, Р .; Фигейредо, Луизиана; Селес, В. (2007). «Эволюция Lua» (PDF) . Proc. ACM HOPL III . С. 2–1–2–26. DOI : 10.1145 / 1238844.1238846 . ISBN  978-1-59593-766-7. S2CID  475143 .[ мертвая ссылка ]
  6. ^ «Эволюция языка расширения: история Lua» . 2001 . Проверено 18 декабря 2008 года .
  7. ^ Фигейредо, LH; Иерусалимский, Р .; Селес, В. (декабрь 1996 г.). «Lua: расширяемый встроенный язык. Несколько метамеханизмов заменяют множество функций» . Журнал доктора Добба . 21 (12). С. 26–33.
  8. ^ «Программирование на Lua: 1» .
  9. ^ "Справочное руководство по Lua 5.1" . 2014 . Проверено 27 февраля 2014 года .
  10. ^ "Справочное руководство по Lua 5.1" . 2012 . Проверено 16 октября 2012 года .
  11. ^ "Исходный код Lua 5.1" . 2006 . Проверено 24 марта 2011 года .
  12. ^ Иерусалимский, Р .; Фигейредо, Луизиана; Селес, В. (2005). «Реализация Lua 5.0» . J. из Universal Comp. Sci . 11 (7): 1159–1176.
  13. ^ Texas Instruments (1990). Схема ПК: Руководство пользователя и Справочное руководство по языку, Trade Edition . ISBN 0-262-70040-9.
  14. ^ Kein-Hong Man (2006). «Простое введение в инструкции Lua 5.1 VM» (PDF) . Архивировано из оригинального (PDF) 19 июня 2010 года . Проверено 20 декабря 2008 года .
  15. ^ a b «Справочное руководство по Lua 5.2» . Lua.org . Проверено 23 октября 2012 года .
  16. ^ «Изменения в API» . Справочное руководство по Lua 5.2 . Lua.org . Дата обращения 9 мая 2014 .
  17. ^ "LuaRocks" . Вики по LuaRocks . Проверено 24 мая 2009 года .
  18. ^ "Код привязки к Lua" . Вики для пользователей Lua . Проверено 24 мая 2009 года .
  19. ^ "Почему Lua считается игровым языком?" . Архивировано 20 августа 2013 года . Проверено 22 апреля 2017 года .CS1 maint: bot: original URL status unknown (link)
  20. ^ "Почему Луау?" . Луау . Проверено 10 февраля 2021 года .
  21. ^ «Результаты опроса» . Архивировано 7 декабря 2003 года . Проверено 22 апреля 2017 года .CS1 maint: bot: original URL status unknown (link)
  22. ^ «Объявлены победители премии Front Line Defenders» . Архивировано 15 июня 2013 года . Проверено 22 апреля 2017 года .CS1 maint: bot: original URL status unknown (link)
  23. ^ «Расширение: Scribunto - MediaWiki» . MediaWiki.org . Проверено 21 февраля 2019 .
  24. ^ "Википедия: Lua" . Проверено 19 декабря 2018 .
  25. ^ "Викиданные: Учебное пособие по Infobox - Викиданные" . www.wikidata.org . Проверено 21 декабря 2018 года .
  26. ^ «Руководство по языку - MoonScript 0.5.0» . moonscript.org . Проверено 25 сентября 2020 года .
  27. ^ лист (23 сентября 2020 г.), leafo / moonscript , получено 25 сентября 2020 г.
  28. ^ а б Андре Алвес Гарсия. «Языки, компилируемые в Lua» . AndreGarzia.com . Проверено 25 сентября 2020 года .
  29. ^ "Urn: реализация Lisp для Lua | Urn" . urn-lang.com . Проверено 12 января 2021 года .
  30. ^ "Амулет ML" . амулет . работы . Проверено 12 января 2021 года .
  31. ^ https://github.com/LuaJIT/LuaJIT/blob/v2.1/COPYRIGHT
  32. ^ http://luajit.org/luajit.html
  33. ^ https://luajit.org
  34. ^ а б https://luajit.org/download.html
  35. ^ https://luajit.org/install.html
  36. ^ http://luajit.org/running.html
  37. ^ https://staff.fnwi.uva.nl/h.vandermeer/docs/lua/luajit /luajit_performance.html
  38. ^ а б https://luajit.org/luajit.html
  39. ^ http://luajit.org/ext_ffi.html
  40. ^ http://luajit.org/ext_ffi_tutorial.html
  41. ^ http://luajit.org/ext_c_api.html

Дальнейшее чтение [ править ]

  • Иерусалимский Р. (2013). Программирование на Lua (3-е изд.). Lua.org. ISBN 978-85-903798-5-0.(1-е изд. Доступно в Интернете .)
  • Гучмидт, Т. (2003). Программирование игр с помощью Python, Lua и Ruby . Курс Технологии PTR. ISBN 978-1-59200-077-7.
  • Schuytema, P .; Маньен, М. (2005). Разработка игр с Lua . Чарльз Ривер Медиа. ISBN 978-1-58450-404-7.
  • Юнг, К .; Браун, А. (2007). Начало программирования на Lua . Wrox Press . ISBN 978-0-470-06917-2. Архивировано из оригинала 8 июля 2018 года . Проверено 7 июля 2018 .
  • Фигейредо, Луизиана; Celes, W .; Иерусалимский Р., ред. (2008). Жемчужины программирования Lua . Lua.org. ISBN 978-85-903798-4-3.
  • Тахтеев, Юрий (2012). Coding Places: Software Practice in a South American City . MIT Press . ISBN 978-0-262-01807-4. Архивировано из оригинала 2 ноября 2012 года. Главы 6 и 7 посвящены Lua, в то время как другие рассматривают программное обеспечение в Бразилии более широко.
  • Варма, Джаянт (2012). Изучите Lua для разработки игр для iOS . Апресс . ISBN 978-1-4302-4662-6.
  • Мэтисон, Эш (29 апреля 2003 г.). «Введение в Lua» . GameDev.net . Архивировано из оригинального 18 декабря 2012 года . Проверено 3 января 2013 года .
  • Филдхаус, Кейт (16 февраля 2006 г.). «Знакомство с Lua» . ONLamp.com . O'Reilly Media . Архивировано из оригинала 12 марта 2006 года . Проверен 28 Февраль 2 006 .
  • Штрайхер, Мартин (28 апреля 2006 г.). «Встраиваемый сценарий с Lua» . developerWorks . IBM .
  • Куигли, Джозеф (1 июня 2007 г.). "Взгляд на Lua" . Linux Journal .
  • Гамильтон, Наоми (11 сентября 2008 г.). «Азия языков программирования: Lua» . Компьютерный мир . IDG . Архивировано из оригинала 8 июля 2018 года . Проверено 7 июля 2018 . Интервью с Роберто Иерусалимши.
  • Иерусалимский, Роберто; де Фигейредо, Луис Энрике; Селес, Вальдемар (12 мая 2011 г.). «Прохождение языка через игольное ушко» . Очередь ACM . 9 (5): 20–29. DOI : 10.1145 / 1978862.1983083 . S2CID  19484689 . Как встраиваемость Lua повлияла на его дизайн.
  • Иерусалимский, Роберто; де Фигейредо, Луис Энрике; Селес, Вальдемар (ноябрь 2018 г.). «Взгляд на дизайн Lua» . Коммуникации ACM . 61 (11): 114–123. DOI : 10.1145 / 3186277 . S2CID  53114923 .[ постоянная мертвая ссылка ]
  • Статьи и тезисы Lua

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Пользователи Lua , Сообщество
  • Проекты на Lua
  • Форум Lua