воскресенье, 16 июня 2013 г.

why lua?

lua фактически является стандартом в gamedev, используется во многом серьёзном программном обеспечении, в web-программировании и даже есть операционная система Lua OS. Так почему же следует использовать lua? Для меня это следующие аргументы:

  • Скорость исполнения. Обычно скриптовые языки не обладают высокой скоростью исполнения, луа тут не исключение - если сравнивать с компилируемыми языками. Везде где есть виртуальная машина, появляется ещё один слой на пути к исполнению машинных команд. Но луа пожалуй самый быстрый из скриптовых языков, в интернете есть куча сравнений, при желании их можно посмотреть. Если скорость критична для вас, есть замечательный проект http://luajit.org/, который помогает достичь скорости на порядок выше чем стандартная луа-машина.
  • Низкий порог вхождения. Луа быстро изучается, имеет наглядный синтаксис и прост в использовании.
  • Эффективность и минимализм. Дизайн луа минималистичен во всём. Синтаксис, потребление памяти, размер исходных кодов. Поэтому луа лучший кандидат на встраивание в мобильные устройства.
  • Открытые исходные коды и лицензия. Луа имеет хорошую документацию, открытые исходники и возможность бесплатного использования в любых проектах.
  • Кроссплатформенность. Луа написан на C поэтому его легко можно скомпилировать под любую плафторму поддерживающую С.
  • Луа сообщество. Живое сообщество, официальное развитие ( бразильскими создателями), множество библиотек и привязок к библиотекам (достаточно легко делать собсвенные привязки). Множество игрвых движков на луа. В общем всегда есть кого спросить и куча информации по любому вопросу. Хотя справедливости ради, например у python, сообщество в несколько раз больше.


суббота, 15 июня 2013 г.

building lua on windows

Собрать луа самостоятельно из исходников очень просто. Для юникс-подобных систем в дистрибутиве есть make-файл, который всё сделает за вас и предложит различные опции сборки в процессе. Мы же рассмотрим вариант сборки под windows с помощью visual studio. 

Итак, преступим. Заходим на www.lua.org в раздел download и скачиваем дистрибутив исходников ( например lua-5.2.2.tar.gz ). Распаковываем дистрибутив в удобную директорию и сразу лезем в readme.txt. В принципе там всё подробно описано и достаточно не объемно. Но я опишу ваши пошаговые действия.
  • Создаём папку build внутри папки lua, где будут распологаться проектные файлы. Будет выглядеть примерно так: 
  • Создаём пустой solution и называем его lua (new project->blank solution). Далее создаём три пустых проекта внутри solution: library, interpreter, compiler (правой кнопкой на solution, add -> new project). 
  • В проект library добавляем все исходники кроме двух файлов lua.c и luaс.c. Устанавливаем тип проекта "библиотека" ( Configuration type - Static Library (.lib) ). Компилируем. Получаем  на выходе library.lib.
  • В проект interpeter добавляем только один фал lua.c. Тип проекта остаётся по умолчанию - исполняемый файл. В свойствах проекта указываем зависимость на статичную либу, компилируемую предыдущим проектом. Для этого указываем собсвенно саму либу, в Configuration properties->Linker->Input->Additional Dependencies пишем library.lib. И указываем по какому пути находится эта либа, для этого идём в Configuration properties->Linker->General->Additional Library Directories и задаём путь где лежит library.lib. Компилируем. Всё, у нас теперь есть stand alone lua interpreter который можно прописывать в системе и писать скрипты, чтобы он их исполнял. Следующий шаг опциональный, можно сделать компилятор луа-скриптов в байт-код в виде отдельного приложения.
  • Делаем компилятор. Добавляем в проект compiler файл luac.c. И точно так же как в предыдущем пункте задаём зависимость от library.lib. Компилируем. Теперь мы можем с помощью этой программы получать байт код в виде файла или посмотреть листинг программы оттранслированной в команды виртуальной машины луа, что может быть очень познавательно.


lua tutorial 001 - Basic types


В lua есть 8 типов данных: nil, boolean, number, string, function, userdata, thread, table. Напишем функцию выводящую тип своего аргумента:

function ShowType( v_arg )
print( type(v_arg) ) end Потестируем нашу функцию, передавая ей различные значения.

ShowType( nil ) -- nil ShowType( true ) -- boolean ShowType( false ) -- boolean ShowType( 01 ) -- number ShowType( -10.5 ) -- number ShowType( 4.57e-3 ) -- number ShowType( 1000000000000000 ) -- number ShowType( "asdas" ) -- string ShowType( 'az' ) -- string ShowType( ShowType ) -- function ShowType( coroutine.create(ShowType) ) -- thread ShowType( {} ) -- table ShowType( {1,2,3} ) -- table ShowType( type(123) ) -- string

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

local v_a = 10 -- например, сначала число v_a = 'some string' -- потом строка v_a = ShowType -- потом функция ShowType( v_a ) -- function
Для представления числа в lua используется тип double. Диапазон +/–1.7E308 с гарантируемыми 15 знаками точности. Строки неизменяемые восьмибитные последовательности, которые могут включать 0. userdata - это указатель на блок памяти в вызывающей программе. thread - представляет собой coroutine, языковое средство обеспечивающее подобие многопоточности.

среда, 12 июня 2013 г.

lua tutorial 000 - Coding convension, intro, dive into lua


В луа одна переменная может иметь значения любого типа. Поэтому удобно обозначать префиксами тип значения переменной:

--[[ r - real n - positive number i - integer u - unsigned integer d - userdata, lightuserdata f - function tr - thread s - string a - indexed array t - dictionary table or just generic table b - boolean p - object (user data) v - variant value ]]--

Кстати, так задаётся многострочный коментарий. Переменные мы будем писать в camel стиле с префиксом типа. Именна функций и классов с большой буквы:

function PrintMultiple( v_value, u_count ) for i=1,u_count do print( v_value ) end end
По названию функции и по именам переменных сразу становится понятно что делает функция, это называется "самодокументирующийся код". По префиксам параметров функции видно, что v_value переменная, которая может содержать любое значение, а u_count беззнаковое число - сколько раз напечатать первый параметр ( v_value ).

PrintMultiple( 'hello', 3 )

output:
hello hello hello Как уже было упомянуто многострочная строка задаётся как [[ cтрока ]], если перед ней поставить знак коментирования то всё строка становится закоментированной

print( [[multiple line one, two, three]] ) --[[ long long commnet ]] Существует удобный трюк для коментированием участка кода - обрамляем код --[[ сode --]] . Тогда, чтобы закоментить и раскоментить этот блок добавляем "--" в начало блока

function SomeFunction() end

--[[ SomeFunction() SomeFunction() SomeFunction() --]] ----[[ SomeFunction() SomeFunction() SomeFunction() --]]

lua blog rus - приветствие

Приветствую читателя. Предлагаю вашему вниманию блог по языку программирования lua на русском языке. Всё написанное буду стараться поддерживать в актуальном для последней на текущий момент версии lua. Это означает, что если я напишу пост, который устареет с выходом новой версии луа, я проапдейчу такой пост. Благо что луа обновляется не так часто и не кардинально.
Блог построен от простого к сложному в первых туториалах разбираются основы синтаксиса, простые концепции и т.д. С возрастанием номера туториала растёт необходимый объем  знаний для понимания материала, поэтому лучше читать по возрастанию номеров, в этом поможет "Архив блога" внизу страницы. Также помимо туториолов с номером будут ответвления в виде маленьких статей на немного другие темы и интересные факты, такие статьи не содержат трехзначного индекса в заголовке.
"Архив блога" внизу страницы имитирует содержание и благодаря ему блог можно читать как книгу, простые главы будут сверху, а ниже идут более сложные.
Также мне будет приятно видеть комментарии и я с удовольствием буду на них отвечать.
Приятного чтения! :)