Получение данных из файла
Пока мы вводили весь код lua вручную. Здорово, если Вы хотите печатать ваш скрипт по несколько раз в консоли. Этот роман не продлится и более 5 секунд. Так, как насчет получения данных из файла? Хорошо, у нас есть два способа, но вопрос остается … как мы можем получить эти данные?
Это действительно очень просто, очень похоже на все, что мы пока видели в lua. Lua имеет функцию lua_dofile() и по существу обрабатывает содержимое файла. Ничего себе, это делает жизнь действительно интересной. И так, если бы я добавил эту возможность к текущему исходному коду, я мог бы заставить мое приложение выполнять скрипт всякий раз когда оно запущено. По существу:
#include <stdio.h> extern "C" { #include <lua.h> #include <lualib.h> }
int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if (NULL == luaVM) { printf("Error Initializing lua\n"); return -1; } // инициализация стандартных библиотечных функции lua lua_baselibopen(luaVM); lua_iolibopen(luaVM); lua_strlibopen(luaVM); lua_mathlibopen(luaVM); printf("Simple Functional lua interpreter\n"); printf("Based on lua version 4.0.1\n"); printf("Enter lua commands. type 'exit<enter>' to exit\n"); printf("\n>"); lua_dofile(luaVM, "./startup.lua"); lua_close(luaVM); return 0; } |
Двигаемся дальше … на что похож этот "startup.lua"? На следующее:
-- Примитивный lua скрипт -- Комментарий добавляется как '--' a = 5; b = 10; c = a + b; print ("5+10=" .. c); |
Что же мы получим в результате? Смотрите ниже:
Как Вы можете заметить, это все достаточно просто. Но, если Вы присмотритесь, то увидите несколько проблем.
Прежде всего, весь наш исходный текст скрипта доступен для любого желающего. Возможно это не очень хорошо, так как по существу выставляет все функциональные возможности игры (то есть: игровую логику) на показ в доступном формате. Так, как исправлять эту оплошность? Мы скомпилируем наш скрипт.
Здесь самое время почесать затылок. "Эш", спрашиваете Вы, "есть ли возможность избежать необходимость компилировать что-либо"? Да, конечно.
Но эта компиляция не должна выполнятся во время разработки проекта. Вы можете оставить ваш код скрипта в исходном формате и компилировать его когда Вам будет это необходимо. Через секунду, Вы увидите, что это не потребует никаких изменений в нашем приложении.
В примерах, которые я приложил к статье, я также включил дополнительные проекты: lua и luac.
Lua - интерпретатор, распространяемый организацией lua как tarball-архив. Luac - компилятор байт-кода. Он по существу компилирует lua исходники в нечитабельный формат. Работа такого кода, кстати, немного быстрее. Не на много, но быстрее.
И так, я беру скрипт, который только что создал, компилирую в байт-код и использую точно так же с единственным изменением имени файла скрипта. Когда Вы запустите luac, то получите следующее:
OK. Если мы все же решимся на это, то должны быть способны скомпилировать наш "startup.lua" в "startup.lub" используя следующее:
Luac –o startup.lub startup.lua
Я скопировал файл startup.lua в тот же каталог где luac.exe, но если бы я добавил к имени файла директории пути к этому каталогу, я мог бы выполнить ее где угодно. Так или иначе, вот - результат:
И в самом низу Вы видите startup.lua и startup.lub. Откройте их оба в текстовом редакторе и сможете увидеть, что lua файл является текстовым, а lub файл бинарный.
Расширения данные этим файлам только для разработчика. Lua без разницы, как Вы их назовете.