Перейти к содержимому

За сколько можно выучить lua

  • автор:

Сложно ли детям научиться программировать на языке Lua в Roblox

Разбираемся, можно ли быстро научиться писать скрипты на Lua и как это поможет детям.

Популярная игровая песочница Роблокс остается лидером среди онлайн-платформ не только для детей и подростков со всего мира. Удобный интерфейс, кроссплатформенность и наличие огромного количества игровых миров выгодно отличают Роблокс среди аналогичных игровых площадок.

Помимо этого, в Роблокс используется язык программирования Lua, с помощью которого дети могут создавать свои 2D- и 3D-миры, а также сложные многопользовательские игры.

Программисты называют Lua одним из самых простых в освоении языков программирования. В свою очередь, те, кто уже владеет им, могут браться за изучение более сложных языков для написания кода, таких как Python, JavaScript и С#.

Создание игр на Lua в Роблокс — отличный способ изучить язык программирования на примере использования внутриигровых скриптов. Именно поэтому курсы по программированию на языке Lua в Роблокс так популярны среди детей. В игровой форме освоить структуру языка намного проще и быстрее, а платформа Роблокс позволяет в режиме реального времени протестировать только что написанную игру.

Изучение основ Lua

Lua — популярный скриптовый язык программирования, который был изобретен в Бразилии. Lua используется не только в игровом конструкторе Roblox, но и в популярных многопользовательских ролевых играх, таких как World of Warcraft и Heroes of Might and Magic.

сколько времени займет изучение Lua ?

Столько, сколько ты на него потратишь. Поставь себе практическую задачу и решай ее.

Deleted
( 05.02.12 19:48:23 MSK )
Ответ на: комментарий от Deleted 05.02.12 19:48:23 MSK

как раз есть задача, для ее решения нужно знать ЯП.

nickionn ★☆
( 05.02.12 19:50:18 MSK ) автор топика

Обращаться по мере надобности. А также гугл.

Deleted
( 05.02.12 19:51:14 MSK )
Ответ на: комментарий от Deleted 05.02.12 19:51:14 MSK

это как раз то что нужно

nickionn ★☆
( 05.02.12 19:54:05 MSK ) автор топика

Зависит от того, какие языки изучались до того.
http://lua-users.org/wiki/LuaDirectory

krakatau ★
( 05.02.12 19:59:48 MSK )

6 месяцев вполне

n0b0dy
( 05.02.12 20:32:19 MSK )
Ответ на: комментарий от n0b0dy 05.02.12 20:32:19 MSK

. Ты это серьезно? За 6 месяцев можно шесть таких языков как Lua освоить.

m-ua
( 05.02.12 21:23:44 MSK )
Ответ на: комментарий от m-ua 05.02.12 21:23:44 MSK

Ой, а сколько языков можно НЕ осилить за шесть месяцев — и не перечесть.

tiandrey ★★★★★
( 05.02.12 22:05:26 MSK )

сколько времени займет изучение Lua ?

Вечер и две любимых дозировки любимого напитка. Как язык lua создавался тупым и примитивным. Вот прикручивать lua к чему-нибудь другому — задача уже менее простая.

PolarFox ★★★★★
( 05.02.12 22:11:21 MSK )
Ответ на: комментарий от PolarFox 05.02.12 22:11:21 MSK

Твое сообщение является правдой только относительно тех, кто имел дело с JS и другими ECMAScript-ами.

Deleted
( 05.02.12 22:22:57 MSK )
Ответ на: комментарий от n0b0dy 05.02.12 20:32:19 MSK

за это время я asm c lispom выучу.

nickionn ★☆
( 05.02.12 22:25:55 MSK ) автор топика
Ответ на: комментарий от Deleted 05.02.12 22:22:57 MSK

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

PolarFox ★★★★★
( 05.02.12 22:27:55 MSK )
Ответ на: комментарий от nickionn 05.02.12 22:25:55 MSK

асм и лисп — самые простые языки в плане грамматики. Только вот область применения первого очень узка, а второй требует переконфигурирования мозгов.

Deleted
( 05.02.12 22:30:06 MSK )
Ответ на: комментарий от PolarFox 05.02.12 22:27:55 MSK

Да, зная до этого языки, Lua можно осилить очень быстро. Но как первый язык за столь короткий срок не выйдет, типичному человеку для программирования нужно еще мозги переконфигурировать 🙂

Deleted
( 05.02.12 22:31:45 MSK )

А вообще, если цель — изучить этот ЯП именно для всяких игрушек, то бери игрушку и делай к ней мод потихонечку. Я так начал питон учить, препарировал четвёртую цивилизацию.

PolarFox ★★★★★
( 05.02.12 22:34:09 MSK )

сколько времени займет изучение Lua ?

4 часа. Проверено на себе.

Около получаса чтение доки, чтобы получить общее представление. Остальное время — практическое решение конкретной задачи с применением Lua. Далее — никаких затруднений, Lua — язык, вообще говоря, несложный.

Книг даже и не знаю. У меня была дока. Ах, да — ещё цикл статей Андрея Боровского в LinuxFormat. Неплохо написано, в т.ч. и для совсем начинающих. Легко и быстро усваивается.

за сколько можно выучить язык программирования lua

Ronald Lee

Одним из таких накопителей являются SSD eMLC, которые обеспечивают высокую производительность и надежность. Наши VPS/VDS серверы поддерживают работу как на операционных системах Windows, так и на Linux и предоставляют доступ к этим накопителям. Это гарантирует бесперебойную работу ваших приложений независимо от выбранной операционной системы.

Другой важный аспект при выборе виртуального сервера – защита от DDoS-атак. Наши VPS/VDS серверы предоставляют встроенную защиту от таких атак, обеспечивая непрерывную работу вашего проекта даже при массированных атаках. Независимо от того, работаете ли вы на Windows или Linux, ваша безопасность будет на первом месте.

Центры обработки данных (ЦОД) также играют важную роль в обеспечении надежности сервера. Наши VPS/VDS серверы размещаются в ЦОД уровня TIER III, что гарантирует надежность и доступность сервера на уровне 99,982%. Независимо от выбранной операционной системы, вы можете быть уверены в надежности нашей инфраструктуры.

Высокоскоростной интернет – еще один важный фактор для успешной работы вашего проекта. Наши VPS/VDS серверы предоставляют доступ к интернету со скоростью до 1000 Мбит/с, что обеспечивает быструю загрузку веб-страниц и высокую производительность онлайн-приложений как на операционной системе Windows, так и на Linux.

Мы предлагаем скидку 10% от существующей цены на все VPS/VDS серверы Windows и Linux. Таким образом, вы получаете высокую производительность, надежную защиту, надежную инфраструктуру и высокоскоростной интернет по доступной цене. Не упустите возможность улучшить работу вашего веб-проекта с помощью VPS/VDS серверов Windows и Linux от 13 рублей.

Lua за 60 минут

Я сентиментальный программист. Иногда я влюбляюсь в языки программирования, и тогда я могу говорить о них часами. Одним из этих часов я поделюсь с вами.

Lua? Что это?

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

Зачем?

Lua может вам пригодится:

* если вы геймер (плагины для World of Warcraft и множества других игр)
* если вы пишете игры (очень часто в играх движок пишут на C/C++, а AI — на Lua)
* если вы системный программист (на Lua можно писать плагины для nmap, wireshark, nginx и других утилит)
* если вы embedded-разработчик (Lua очень быстрый, компактный и требует очень мало ресурсов)

Что надо для того, чтобы читать дальше?

1. Научитесь программировать. Хотя бы немного. Не важно на каком языке.
2. Установите Lua. Для этого либо скачайте здесь версию 5.2 (http://www.lua.org/download.html), либо ищите ее в репозиториях. Версия 5.1 тоже пойдет, но знайте, что она очень старая.

Все примеры из статьи запускайте в терминале командой наподобие «lua file.lua».

Первые впечатления

Lua — язык с динамической типизацией (переменные получают типы «на лету» в зависимости от присвоенных значений). Писать на нем можно как в императивном, так и в объектно-ориентированном или функциональном стиле (даже если вы не знаете как это — ничего страшного, продолжайте читать). Вот Hello world на Lua:

-- my first lua app: hello.lua print "hello world"; print("goodbye world")

Что уже можно сказать о языке:

* однострочные комментарии начинаются с двух дефисов «—»
* скобки и точки-с-запятыми можно не писать

Операторы языка

Набор условных операторов и циклов довольно типичен:

-- условные операторы (ветки else может не быть) if a == 0 then print("a is zero") else print("a is not zero") end -- сокращенная форма if/elseif/end (вместо switch/case) if a == 0 then print("zero") elseif a == 1 then print("one") elseif a == 2 then print("two") else print("other") end -- цикл со счетчиком for i = 1, 10 do print(i) end -- цикл с предусловием b = 5 while b > 0 do b = b - 1 end -- цикл с постусловием repeat b = b + 1 until b >= 5

ПОДУМАЙТЕ: что может означать цикл «for i = 1, 10, 2 do . end» ?

В выражениях можно использовать такие вот операторы над переменными:

* присваивание: x = 0
* арифметические: +, -, *, /, % (остаток от деления), ^ (возведение в степень)
* логические: and, or, not
* сравнение: >, =, ~= (не-равно, да-да, вместо привычного «!=»)
* конкатенация строк (оператор «..»), напр.: s1=»hello»; s2=»world»; s3=s1..s2
* длина/размер (оператор #): s=»hello»; a = #s (‘a’ будет равно 5).
* получение элемента по индексу, напр.: s[2]

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

Типы данных

Я вам соврал, когда сказал что у языка один тип данных. Их у него много (как и у каждого серьезного языка):

* nil (ровным счетом ничего)
* булевы числа (true/false)
* числа (numbers) — без деления на целые/вещественные. Просто числа.
* строки — кстати, они очень похожи на строки в паскале
* функции — да, переменная может быть типа «функция»
* поток (thread)
* произвольные данные (userdata)
* таблица (table)

Если с первыми типами все понятно, то что же такое userdata? Вспомним о том, что Lua — язык встраиваемый, и обычно тесно работает с компонентами программ, написанными на других языках. Так вот, эти «чужие» компоненты могут создавать данные под свои нужды и хранить эти данные вместе с lua-объектами. Так вот, userdata — и есть подводная часть айсберга, которая с точки зрения языка lua не нужна, но и просто не обращать внимания на нее мы не можем.

А теперь самое важное в языке — таблицы.

Таблицы

Я вам снова соврал, когда сказал, что у языка 8 типов данных. Можете считать что он один: всё — это таблицы (это, кстати, тоже неправда). Таблица — это очень изящная структура данных, она сочетает в себе свойства массива, хэш-таблицы («ключ»-«значение»), структуры, объекта.

-- Итак, вот пример таблицы как массива: a = -- массив из 3-х элементов print(a[2]) -- выведет "2", потому что индесы считаются с единицы -- А таблица в виде разреженного массива (у которого есть не все элементы) a = <> -- пустая таблица a[1] = 1 a[3] = 5

ПОДУМАЙТЕ: чему равно a[2] в случае разреженного массива?

В примере выше таблица ведет себя как массив, но на самом деле — у нас ведь есть ключи (индексы) и значения (элементы массива). И при этом ключами могут быть какие угодно типы, не только числа:

a = <> a["hello"] = true a["world"] = false a[true] = 1 -- или так: a = < hello = 123, world = 456 >print(a["hello")) print(a.hello) -- то же самое, что и a["hello"], хотя выглядит как структура с полями

Кстати, раз уж у таблицы есть ключи и значения, то можно в цикле перебрать все ключи и соответствующие им значения:

t = < a = 3, b = 4 >for key, value in pairs(t) do print(key, value) -- выведет "a 3", потом "b 4" end

А как же объекты? О них мы узнаем чуть позже, вначале — о функциях.

Функции

Вот пример обычной функции.

function add(a, b) return a + b end print(add(5, 3)) -- напечатает "8"

Функции языка позволяют принимать несколько аргументов, и возвращать несколько аргументов. Так аргументы, значения которых не указаны явно, считаются равными nil.

ПОДУМАЙТЕ: зачем может понадобиться возвращать несколько аргументов?

function swap(a, b) return b, a end x, y = swap(x, y) -- кстати, это можно сделать и без функции: x, y = y, x -- и если уж функция возвращает несколько аргументов, -- а они вам не нужны - игнорируйте их с помощью -- специальной переменной-подчеркивания "_" a, _, _, d = some_function()

Функции могут принимать переменное количество аргументов:

-- в прототипе переменное число аргументов записывается как троеточие function sum(. ) s = 0 for _, n in pairs(arg) do -- в функции обращаются к ним, как к таблице "arg" s = s + n end return a end sum(1, 2, 3) -- вернет 6 sum(1, 2, 3, 4) -- вернет 10

Поскольку функции — это полноценный тип данных, то можно создавать переменные-функции, а можно передавать функции как аргументы других функций

a = function(x) return x * 2 end -- функция, умножающая на 2 b = function(x) return x + 1 end -- функция, увеличивающая на 1 function apply(table, f) result = <> for k, v in pairs(table) do result[k] = f(v) -- заменяем элемент на какую-то функцию от этого элемента end end -- ПОДУМАЙТЕ: что вернут вызовы t = apply(t, a) apply(t, b)

Объекты = функции + таблицы

Раз мы можем сохранять функции в переменных, то и в полях таблиц тоже сможем. А это уже получаются как-бы-методы. Для тех, кто не знаком с ООП скажу, что основная его польза (по крайней мере в Lua) в том, что функции и данные, с которыми они работают находятся рядом — в пределах одного объекта. Для тех, кто знаком с ООП скажу, что классов здесь нет, а наследование прототипное.

Перейдем к примерам. Есть у нас объект, скажем, лампочка. Она умеет гореть и не гореть. Ну а действия с ней можно сделать два — включить и выключить:

lamp = < on = false >function turn_on(l) l.on = true end function turn_off(l) l.on = false end -- это просто функции для работы со структурой turn_on(lamp) turn_off(lamp)

А если лампочку сделать объектом, и функции turn_off и turn_on сделать полями объекта, то получится:

lamp = < on = false turn_on = function(l) l.on = true end turn_off = function(l) l.on = false end >lamp.turn_on(lamp) lamp.turn_off(lamp)

Мы вынуждены передавать сам объект лампочки в качестве первого аргумента, потому что иначе наша функция не узнает с какой именно лампочкой надо работать, чтобы сменить состояние on/off. Но чтобы не быть многословными, в Lua есть сокращенная запись, которую обычно и используют — lamp:turn_on(). Итого, мы уже знаем несколько таких упрощений синтаксиса:

lamp:turn_on() -- самая общепринятая запись lamp.turn_on(lamp) -- то с точки зрения синтаксиса это тоже правильно lamp["turn_on"](lamp) -- и это

Продолжая говорить о сокращениях, функции можно описывать не только явно, как поля структуры, но и в более удобной форме:

lamp = < on = false >-- через точку, тогда аргумент надо указывать function lamp.turn_on(l) l.on = true end -- через двоеточкие, тогда аргумент неявно задается сам, как переменная "self" -- "self" - и есть та лампочка, для которой вызвали метод function lamp:turn_off() self.on = false end

Специальные функции

Некоторые имена функций таблиц (методов) зарезервированы, и они несут особый смысл:

* __add(a, b), __sub(a, b), __div(a, b), __mul(a, b), __mod(a, b), __pow(a, b) — вызываются, когда выполняются арифметические операции над таблицей
* __unm(a) — унарная операция «минус» (когда пишут что-то типа «x = -x»)
* __lt(a, b), __le(a, b), __eq(a, b) — вычисляют результат сравнения ( * __len(a) — вызывается, когда делается «#a»
* __concat(a, b) — вызывается при «a..b»
* __call(a, …) — вызывается при «a()». Переменные аргументы — это аргументы при вызове
* __index(a, i) — обращение к a[i], при условии, что такого элемента не существует
* __newindex(a, i, v) — создание «a[i] = v»
* __gc(a) — когда объект удаляется при сборке мусора

Подменяя эти методы, можно перегружать операторы и использовать синтаксис языка для своих целей. Главное не переусердствовать.

Наследование

Для тех, кто не знает ООП, наследование позволяет расширить функциональность уже существующего класса. Например, просто лампочка умеет включаться-выключаться, а супер-ламкочка будет еще и яркость менять. Зачем нам переписывать методы turn_on/turn_off, если можно их повторно использовать?

В Lua для этого есть понятие мета-таблицы, т.е. таблицы-предка. У каждой таблицы есть одна таблица-предок, и дочерняя таблица умеет делать все, что умеет предок.

Допустим, что объект-таблицу lamp мы уже создали. Тогда супер-лампочка будет выглядеть так:

superlamp = < brightness = 100 >-- указываем родительскую таблицу setmetatable(superlamp, lamp) -- и ее методы теперь доступны superlamp:turn_on() superlamp:turn_off()

Расширение функциональности

Родительские таблицы есть у многих типов (ну у строк и таблиц точно, у чисел и булевых чисел, и у nil их нет). Допустим, мы хотим складывать все строки с помощью оператора «+» , а не «..» . Для этого надо подменить функцию «+» (__add) для родительской таблицы всех строк:

s = getmetatable("") -- получили родительскую таблицу строки s.__add = function(s1, s2) return s1..s2 end -- подменили метод -- проверяем a = "hello" b = "world" print(a + b) -- напишет "helloworld"

Собственно, мы еще можем заменить функцию print с помощью «print = myfunction», да и много других хакерских дел можно сделать.

Области видимости

Переменные бывают глобальные и локальные. При создании все переменные в Lua являются глобальными.

Для указания локальной области видимости пишут ключевое слово local:

local x local var1, var2 = 5, 3

Не забывайте об этом слове.

Обработка ошибок

Часто, если возникают ошибки, надо прекратить выполнение определенной функции. Можно, конечно, сделать множество проверок и вызывать «return», если что-то пошло не так. Но это увеличит объем кода. В Lua используется что-то наподобие исключений (exceptions).

Ошибки порождаются с помощью функции error(x). В качестве аргумента можно передать все, что угодно (то, что имеет отношение к ошибке — строковое описание, числовой код, объект, с которым произошла ошибка и т.д.)

Обычно после этой функции вся программа аварийно завершается. А это надо далеко не всегда. Если вы вызываете функцию, которая может создать ошибку (или ее дочерние функции могут создать ошибку), то вызывайте ее безопасно, с помощью pcall():

function f(x, y) . if . then error("failed to do somthing") end . end status, err = pcall(f, x, y) -- f:функция, x-y: ее аргументы if not status then -- обработать ошибку err. В нашем случае в err находится текст ошибки end

Стандартные библиотеки

Стандартных библиотек мало, зато это позволяет запускать Lua где угодно. Подробнее можно получить их список здесь — http://www.lua.org/manual/5.2/manual.html

Нестандартных библиотек много, их можно найти на LuaForge, LuaRocks и в других репозиториях.

Между Lua и не-Lua

ВНИМАНИЕ: эту часть рекомендуется читать людям со знанием языка C.

А если нам недостаточно функциональности стандартных библиотек? Если у нас есть наша программа на C, а мы хотим вызывать ее функции из Lua? Для этого есть очень простой механизм.

Допустим, мы хотим создать свою функцию, которая возвращает случайное число (в Lua есть math.random(), но мы хотим поучиться). Нам придется написать вот такой код на C:

#include #include #include /* собственно, что делать при вызове `rand(from, to)` */ static int librand_rand(lua_State *L) < int from, to; int x; from = lua_tonumber(L, 1); /* первый параметр функции */ to = lua_tonumber(L, 2); /* второй параметр функции */ x = rand() % (to - from + 1) + from; lua_pushnumber(L, x); /* возвращаемое значение */ return 1; /* возвращаем только один аргумент */ >/* в Lua "rand" соответствует нашей функции librand_rand() */ static const luaL_reg R[] = < , /* конец списка экспортируемых функций */ >; /* вызывается при загрузке библиотеку */ LUALIB_API int luaopen_librand(lua_State *L) < luaL_openlib(L, "librand", R, 0); srand(time(NULL)); return 1; /* завершаемся успешно */ >

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

random = require("librand") -- загружаем библиотеку print(random.rand(1, 100)) print(random.rand(0, 1))

А если мы хотим вызывать код, написанный на Lua из наших программ? Тогда наши программы должны создавать виртуальную машину Lua, в которой и будут выполняться Lua-скрипты. Это намного проще:

#include "lua.h" #include "lauxlib.h" int main() < lua_State *L = lua_open(); // создаем виртуальную машину Lua luaL_openlibs(L); // загружаем стандартные библиотеку luaL_dofile(L, "rand.lua"); // выполняем скрипт lua_close(L); // закрываем Lua return 0; >

Все.

Вы теперь можете писать на Lua. Если вы узнаете интересные моменты про Lua, которые можно было бы отразить в статье — пишите!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *