Pull to refresh

Comments 57

Пардон, кат потерялся по дороге :-)
На самом деле, жалко человека. Судя по «Итак...» он уверен, что кат есть. А минусовать, между тем, уже начали(
Было бы не плохо вначале поста написать в паре слов о том что это вообще такое «луа»
А что незнающим о луа интересно чего в нем нового?
Для начала интересно узнать о чем идет речь
Спасибо. Большая работа вами проделана! странно что минусуют
Спасибо на добром слове. Увы, не угадал с катом. :-)
врятли. «Быстрых, легких» скриптовых языков примерно дохрена. А вся статья состоит из перечисления минусов этого языка. Причем минусы такие, хорошие и жирные.

А после 4х часов утра на хабре сидят очень злые и невыспавшиеся люди. Сейчас народ к 11 на работу подтянется, будут вам плюсы )
Ну так на то это и новая версия, чтобы минусы исправлять, разве нет?
А по поводу «быстрых и лёгких» дохрена — это спорное заявление. К тому же, фишка Луа в том, что в языке достигнут хороший баланс по всем перечисленным показателям, не только по быстроте и скорости.

Но мне холиваров по поводу языка разводить здесь совсем не хочется. Я никого Луа использовать не заставляю. Те, кто использует — те обычно знают «в чём фишка». ;-)
Злых и невыспавшихся всегда хватает, хватает и тех кто минусует то чего не понимает, но хороший пост такими людьми не испортить.
Видел в песочнице хорошее руководство по созданию игры space invaders на lua в ubuntu, но не сохранил =(
Ни у кого не осталось?
UFO just landed and posted this here
lua много в каких играх используется, не только в WoW.
Если подробнее, то, как минимум вот в этих (на самом деле список далеко не полон):

en.wikipedia.org/wiki/Category:Lua-scripted_video_games

Вот неигровые приложения, использующие Луа, про которые знает Википедия:

en.wikipedia.org/wiki/Lua_(programming_language)#Applications

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

http://article.gmane.org/gmane.comp.lang.lua.general/61523

Там дальше в треде народ пошёл ещё раз перечислять проблемы с Юникодом у тех, кто использует Луа под Windows… Можно излить свои печали, иногда это работает.
Хочу уточнить на всякий случай, что проблемы с Юникодом под Windows возникают в основном при работе с юникодной файловой системой через io.* (что всё равно обычно отдаётся на откуп движку — так что не страшно). Сами юникодные строки можно использовать — так же как и на других платформах.
знакомился луа, очень похож на javascript, понравилась идея метатаблиц. Как встраиваемый язык — вещь
А есть ли ссылка на какой-нить вменяемый туториал (желательно под с++), как связать и в чем сила использования Луа? Просьба не минусовать, а отнестись с пониманием. Луа на слуху уже года 3 как (или даже больше), периодически то тут, то там всплывает информация. Но найти простой, и главное содержательный и показательный урок по её использованию пока не удалось. Буду благодарен за толковый линк на статейку, где показаны все прелести и радости от использования Луа.
Сайт посвященный луа на русском. На нем есть список полезных ссылок. К примеру Язык Lua и использование скриптов на нем в программах на С++, Я люблю Lua.
По этим ссылкам недавно обучался один знакомый с нуля.
Туториалы на английском
Большая статья на gamedev.net (перевод, но тут говориться про lua 4.0.1 — а с тех пор язык достаточно изменился, но для начала можно почитать)
статья с gamdev.net есть переведенная на русский на gamedev.ru. видел эту статью, изучал, но понимания чем lua в данных примерах лучше банального ini файла не появилось. остальные ссылки спасибо посмотрю, но кажется там тоже не совсем реальная жизнь отражена.
Ну тогда в статье на ibm.com есть раздел Зачем встраивать язык? — можете его почитать.
Поддерживаю, хорошая статья.

Вот ещё есть паттерн Alternate Hard and Soft Layers, там есть несколько полезных мыслей по поводу использования скриптовых языков вообще. Там, правда довольно сумбурно написано.
всем спасибо за информацию. ссылки сохранил и в ближайшее время вернусь к изучению темы :)
в каком виде? share nothing с изолированными состояними и обменом сообщениями есть в виде минимум нескольких библиотек (lua lanes, например). share everything — авторы против такого подхода.
Распараллеливание кода в Луа отлично получается и без поддержки системных потоков самим языком. (Понятное дело, что для этого нужны изолированные стейты, но это и хорошо, лучше масштабируется.)
Все игрушки, в которых внедрена луа — напрочь отказываются использовать больше одного ядра. Даже если сам движок игры поддерживает многоядерные архитектуры? Чем можно объяснить? Ленью разрабов?

Сразу приведу пример: NWN II (только 1 ядро), GarrysMod (на движе Half-Life 2 Ep2, который поддерживает до 4 ядер).
В отличие от «некоторых других» динамических языков, в Луа можно параллельно работать одновременно с несколькими стейтами в одном процессе.

Если нужно организовать параллельную работу логики на Луа, обычно создаётся по стейту на поток и организуется механизм обмена данными между стейтами. Например, налаживается система посылки сообщений между потоками или данные просто расшариваются тем или иным способом между стейтами с обеспечением синхронизации доступа кодом движка.

Почему разработчики отдельных игр пренебрегают такой возможностью мне сказать сложно. Может быть считают, что овчинка не стоит выделки, и игровая логика отлично будет работать и на одном ядре…
Скорее время пересылки данных между стейтами больше времени обработки микроскриптов, которые предварительно скомпилированы. 100% знаю, что в том же гаррис моде скорость работы Lua очень критична, так как от неё зависит два внутренних языка программирования + все-все добавленные обьекты и физические игрушки.
Тут уже всё сильно зависит от деталей конкретной ситуации.
Хм, хотя в том же крайсисе луа отвечает за все скрипты, и при этом многопоточна. С другой стороны, от поддержки системных потоков самим языком хуже явно не станет, другое дело что внедрить подобное, не нарушив идеологию языка (и желаний разработчиков) — весьма и всемьса сложно.
После анализа этого поста внёс следующие дополнения в статью:

  • Подтверждено, что в 5.2 можно будет делать yield через метаметоды, итераторы цикла for и функции pcall() и xpcall()!
  • Новые коды ошибок: LUA_ERRGCMM и LUA_OK.
  • Функцию lua_arith() теперь считаем документированной.
  • Упомянута функция lua_len(), уважающая, в отличие от lua_rawlen(), метаметод __len у таблиц.
  • Новые функции: lua_copy() и luaL_tolstring().
  • Функции lua_pushstring() и lua_pushlstring() теперь возвращают указатель на внутреннюю копию строки.
  • Если файл был открыт при помощи io.popen(), file:close() вернёт код завершения соответствующего ему процесса.
  • Теперь file:write() возвращает file.
  • Теперь можно узнать, был ли остановлен GC.
  • У корутин больше нет отдельных окружений
  • Тип символа при компиляции теперь не зависит от локали.
  • Увеличено максимальное число констант на функцию (чанк).
  • Парсер теперь отъедает гораздо меньше сишного стека.
  • Улучшена хэш-функция для чисел с плавающей запятой.
  • Улучшена загрузка динамических библиотек под никсами

я вот главное не понял :-D
он быстрей стал?
Куда уж быстрей-то? Есть подозрение, что без JIT-а сильно быстрее уже не получится. А с JIT-ом — см. LuaJIT 2, в среднем всего в 2.37 раза медленнее C++. 5.2, конечно, пока LuaJIT не поддерживает, но ближе к релизу, скорее всего, будет.

Если говорить про стандартную реализацию 5.2, то, говорят, стало где-то чуть медленнее, где-то чуть быстрее. Существенной разницы с 5.1 нет.
ну понятно что быстрей c jit :)
я на луа использовал для lua_newthread, вот у меня там еще проблема была что надо переменные в скриптах как local обновлять. а то они между thread'ами шарились…
но как понял это типа не баг а фича
Переменные в скриптах в Lua в принципе нужно объявлять как local. Иначе они глобальные. Со всеми вытекающими.
угу.
а как тогда быть если мне нужно чтобы скриптам можно было не доверять?
как-то можно перехватить попытку создать глобальную переменную?
Ненадёжный код нужно помещать в песочницу. (По-хорошему ещё нужно ограничивать память через lua_setallocf и время выполнения через debug.sethook, этого по ссылке нет.)

Если нужно только перехватывать «нелегальные» глобальные переменные (а это полезно делать всегда, не только в песочнице), то нужно повесить на глобальное окружение (это же табличка на самом деле) хитрую метатаблицу, которая будет в __index и __newindex перехватывать обращения и проверять их.

См. etc/script.lua в луашном дистрибутиве. (Здесь — версия, которой я пользуюсь)

Подробнее про проблему можно почитать здесь.
о спасибо, что-то типа этого я и искал.
мне правда это надо на уровне си сделать, но тут уже все проще )
спасибо
Ну… Всё, что можно сделать на Луашном API, можно сделать и в Си :-)
Будут проблемы — добро пожаловать в Луашную рассылку, поможем.

www.lua.org/lua-l.html
да давно там, через nntp читаю :)
стеснялся спросить
Уверен, стесняться здесь нечего. ;-)
Обновил описание lua_version() и luaL_checkversion(). Оказывается, крайне полезные функции.
Sign up to leave a comment.

Articles