Знакомство с языком Lua

Если вы никогда ничего не слышали о языке программирования с коротким, но поэтическим названием Lua, самое время с ним познакомиться. Потому что этот язык в последнее время начинает применяться всё более широко и обладает рядом весьма интересных возможностей, которые наверняка будут полезны многим читателям "Компьютерных вестей".


Ещё один язык программирования?

"Зачем мне ещё один язык программирования? - можете спросить вы. - Я и так знаю один (два, десять, сто тридцать три), и не вижу причин, по которым стоило бы изучить ещё один". Что ж, такая позиция, конечно же, имеет право на жизнь. Однако никто не предлагает вам изучать Lua всерьёз (хотя, кстати, знание этого языка в некоторых областях сейчас востребованы, но об этом дальше). Lua интересен уже на чисто концептуальном уровне. И потому ознакомиться с этим языком программирования в общих чертах, я считаю, будет чрезвычайно полезно каждому, кто так или иначе связан с разработкой программного обеспечения.

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

Впрочем, достаточно лирики. Давайте всё-таки перейдём к обещанному разговору о чрезвычайно интересном, перспективном и многообещающем языке программирования Lua.


Что ещё за Lua?

Несколько для языка программирования необычное название (согласитесь, L++ или там LuaScript смотрелось бы как-то привычнее) переводится с португальского как "Луна". Название такое не случайно - язык этот имеет бразильское происхождение, и работа над ним начата его авторами Руберту Иерузалимски, Вальдемаром Селесом и Луис Энрике ди Фигейреду из Computer Graphics Technology Group (Tecgraf), подразделения Католического университета Рио-де-Жанейро, ещё в далёком 1993 году. Созданный вдалеке от ведущих мировых исследовательских центров, этот язык программирования, тем не менее, вышел на удивление удачным, что доказывается высокой степенью его востребованности во всём мире.

Lua - это встраиваемый скриптовый язык программирования, который каждый может встроить в собственный программный продукт. Львиная доля интерпретатора Lua написана на 100% ANSI C. Благодаря этому поддерживается прекрасная переносимость этого программного кода между различными платформами (наверное, если и есть такие платформы, для которых нет C-компилятора, то они появились ещё до появления самого языка C, и Lua вам на них точно не понадобится). При этом, что интересно, в отличие от множества других скриптовых языков, создатели Lua сделали его синтакис достаточно далёким от синтаксиса C.

Говоря об интерпретаторе Lua, мы, как и в случае с большинством других скриптовых языков, имеем, собственно говоря, не классический интерпретатор, а компилятор байт-кода и виртуальную машину, которая этот самый байт-код выполняет. Благодаря этому достигается достаточно неплохая производительность. Но если вам её недостаточно, то существует JIT-компилятор для Lua, который называется LuaJIT и занимается тем, что преобразует Lua-конструкции в процессорный код непосредственно перед их исполнением.

Хорошая производительность Lua (а также в немалой степени и удачный синтаксис вкупе с остальными особенностями) позволили стать этому языку программирования скриптовым языком № 1 в игровой индустрии. Конечно, Lua используется в играх не для "движков", где производительность критична, а для написания сценариев, отвечающих за действия отдельных игровых объектов, за сцены, за искусственный интеллект и прочие подобные вещи. Список игр, в которых применяются скрипты на Lua, весьма внушителен, а потому я приведу названия только самых известных из них. Это Baldur's Gate, Crysis, Diablo 3, Far Cry, FlatOut 2, Painkiller, Silent Storm, World of Warcraft, а также весьма уважаемые посетителями форума "Компьютерных вестей" и мною лично S.T.A.L.K.E.R.'ы.


Синтаксис Lua

Что ж, настало время перейти к разговору о том, что является наиболее важным моментом в применении любого языка программирования - о его синтаксисе.

Lua - это язык программирования с динамической типизацией, что, впрочем, весьма естественно для скриптового языка. При этом в плане основных типов данных создатели Lua исповедовали практичный минимализм: в языке восемь основных типов данных, один из которых, фактически, означает отсутствие какого бы то ни было типа (этот тип данных называется nil). Остальные типы - это boolean, number, string, function, userdata, thread и table. Типы table, function и thread относятся к ссылочным. Как видите, хотя типов и немного, но все они часто используются, и, в принципе, комбинируя их, можно получать любые сложные структуры данных. Особенно удобной лично мне представляется поддержка на уровне языка такого типа, как таблица. Под таблицей, фактически, понимается ассоциативный массив, где представлены пары ключ-значение и где ключом могут быть данные любого типа (кроме, само собой, nil). Кстати, userdata - это тоже очень интересный тип, который умеет становиться указателем, что более чем полезно при передаче данных из C и в обратную сторону.

Синтаксис основных конструкций Lua в чём-то похож на JavaScript, или, если хотите, даже на Паскаль. Конструкции вроде условия (if) и циклов (for, while) заканчиваются словом "end". Это обеспечивает хорошую читаемость кода, а отсутствие необходимости добавлять после каждой строки точку с запятой наверняка придётся по душе тем разработчикам, которым уже, мягко говоря, надоело видеть предупреждения компилятора по поводу отсутствия в конце строки этого символа.

Но самое интересное, в общем-то, не в этом. Lua - язык, как сейчас модно говорить, мультипарадигменный. То есть, говоря русским языком, достаточно гибкий и удобный, и созданный не для подтверждения чьих-то идей, а для использования в реальных задачах создания программных продуктов. Но у мультипарадигменности есть свои издержки. Так, например, в Lua нет явной поддержки наследования. Впрочем, если вы удивляетесь, что таким популярным в наши дни стал язык без поддержки объектно-ориентированного программирования, то вы немного поторопились. Ключевым словом в этой фразе было "явной". Таблица, один из главных типов данных в Lua, как раз и позволяет организовать ООП в рамках этого языка, в том числе реализовать пространства имён, наследование, интерфейсы и многие другие знакомые по другим языкам программирования полезные вещи. Для всего этого используются мета-таблицы. Кстати говоря, если уж зашла речь о мультипарадигменности языка Lua, то стоило бы сказать и о том, что ООП - это не единственная парадигма, которая реализована в рамках данного языка программирования. Те, кто знаком с функциональным программированием, также найдут возможность применить при написании кода на Lua знакомые им приёмы и техники.


Взаимодействие с другими языками

Выше я уже говорил, помнится, что движок Lua можно сравнительно легко встроить практически в любое приложение, в котором он имеет шансы оказаться полезным. Как же именно происходит взаимодействие Lua-скриптов с тем приложением, которое использует их в своих корыстных целях?

В вопросах взаимодействия с "хостовым" приложением ключевую роль играет виртуальный стек Lua, в котором сохраняются аргументы функции и возвращаемое ею значение. Для вызова функции, написанной на Lua и исполняемой, соответственно, встроенной в приложение виртуальной машиной, приложение помещает в стек значения этих аргументов, вызывает функцию и получает потом в том же стеке возвращаемое функцией значение.

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


Пример кода

Думаю, было бы полезно всё-таки привести пример какого-нибудь сравнительно простого программного кода на языке Lua, чтобы читатели "Компьютерных вестей" могли более хорошо представить себе этот язык программирования. Код вы можете увидеть в листинге к статье, и, как несложно догадаться, этот код реализует рекурсивное вычисление факториала - задача, пожалуй, не менее хрестоматийная, чем знаменитый "Hello, World!".

function factor (n)
 if n == 0 then
  return 1
 else
  return n * factor(n-1)
 end
end


Резюме

Что ж, как видите, язык программирования Lua действительно стоит того, чтобы о нём, как минимум, что-нибудь узнать, а как максимум, даже изучить его на достаточно приличном уровне. Если вы хотите работать в индустрии GameDev'а, то вам стоит присмотреться к этому языку особенно внимательно: ведь, как я уже упоминал, при создании игр этот скриптовый язык используется самым что ни на есть активным образом, а специалистов по нему, особенно на постсоветском пространстве, не так уж и много. Если же вы сами разрабатываете какое-то достаточно сложное приложение и подумываете о том, чтобы внедрить в него скриптовый движок, то имеет смысл также внимательно присмотреться именно к Lua. Благодаря удачному сочетанию синтаксиса, производительности и простоте внедрения его можно использовать практически в любых приложениях.

Вадим СТАНКЕВИЧ,
[email protected]

Версия для печатиВерсия для печати

Номер: 

39 за 2009 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Страницы

Аватар пользователя Инкогнито
Йесть, йесть конкретные примеры!

Думаю, в частности, название фирмы "Софтинформ" многое скажет и Станкевичу, и его кошельку.

Аватар пользователя Инкогнито
неудивительно что Станкевича с его подходом выгнали из "компьютерной газеты" и "виртуальных радостей" за его копипастерские опусы
Аватар пользователя Вадим Станкевич
Как бы вот даже и не знаю, что ответить на весь этот бред...
Аватар пользователя mike
А ничего и не отвечайте; завистники пусть отдохнут.
Аватар пользователя Инкогнито
народ, сжатая инфа в виде определений - для справочников и учебников, здесь она даже несколько неуместна)) статья, кстати хорошая, ненавязчивая и ненапряжная, с моей точки зрения

вобщем, художника может обидеть каждый)

ЗЫ а вот считать деньги в чужом кошельке просто некрасиво;)

Аватар пользователя Эдуард
>>ЗЫ а вот считать деньги в чужом кошельке просто некрасиво;)

А это у нас такой национальный вид спорта.

Аватар пользователя Дмитрий Спицын
Сам недавно написал пару скриптов к Galaxy Online на Lua.

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

Кому не хватает ссылок в статье поищите их на http://lua-users.org/wiki

Страницы