Anonymous
Привет, инженер Короны. Пока не требуется помощь, спасибо, я пока тыкаюсь в джаву, думаю это будет тоже не шибко длинный путь к моей цели
fgntfg
Меня больше всего расстраивает то, что программировать для телефона на телефоне практически невозможно
Anonymous
Я щас этим занимаюсь
Anonymous
Программа aide
fgntfg
У меня.
Anonymous
Только она платная
fgntfg
Три
Elias
И сюда репостну, т. к. людей тут много :)
Elias
Слайды
Как бонус - почти вся моя речь в заметках к ним
Elias
Tverd
Elias
Да
Snusmumriken
Там даже моя страшная морда есть.
Tverd
реквестирую видео... за презентацию спасибо!
Snusmumriken
Все, деанон, все срочно перестают уважать мой авторитет, потому что видели что в жизни я злобный карлик.
Tverd
Tverd
😄
Snusmumriken
Блин, кстати тема. На следующий митап приду таким, сила моего авторитета тоже придет в норму.
Snusmumriken
Я про него и говорю :Р
Elias
K
Парни, а кто может поянить почему в Lua 5.2.4 require в одном случае результат функция, а в другом таблица?
K
Делаю pumakira = require './pumakira'; print(type(pumakira)) и получаю function
K
А как понять где разраб это решил? По каким признакам в коде?
K
Благодарствую! Пошел ковырять исходник.
_AMD_
Где можно почитать про утечки памяти в луа и как их не допускать?
Snusmumriken
Так же как и в любом другом языке.
а) все типы кроме атомарных (строки, числа) являются ссылками.
б) цикл из ссылок таблиц-объектов друг на друга образуют "остров", чтобы не допускать - вешаешь слабую ссылку на что-нибудь, разрывая кольцо.
_AMD_
Можно пример по б)?
Snusmumriken
tbl1 = {}
tbl2 = {link = tbl1}
tbl3 = {link = tbl2}
tbl1.link = tbl3
tbl1, tbl2, tbl3 = nil, nil, nil
Всё, у нас есть остров.
_AMD_
Тоесть, тут утечка. А как ее предотвратить?
Snusmumriken
tbl1 = setmetatable({}, {__mode = 'v'})
tbl2 = {link = tbl1}
tbl3 = {link = tbl2}
tbl1.link = tbl3
tbl1, tbl2, tbl3 = nil, nil, nil
Всё, острова нет, ссылка на значения у tbl1 - слабая, если удалилась tbl3 - всё остальное по цепочке удалится.
_AMD_
Все из-за mode v?
Snusmumriken
Ага.
_AMD_
С этими mode как раз и не разобрался в метатаблицах
Snusmumriken
https://habrahabr.ru/post/163679/
_AMD_
Да, видел твой пост (если это твой. Сейчас смотреть неудобно)
_AMD_
Но честно скажу — не читал) считал, что в метатаблицах разбираюсь достаточно хорошо)
Snusmumriken
Это не мой. Я давал в моём посте ссылку на это, как раз для близкого рассмотрения слабых ссылок.
Snusmumriken
На самом деле можно и без метатаблиц.
tbl1 = {}
tbl2 = {link = tbl1}
tbl3 = {link = tbl2}
tbl1.link = tbl3
tbl1.link = nil -- разрываем кольцо ручками
tbl1, tbl2, tbl3 = nil, nil, nil
Ну тут типа чистка ссылок чтобы не было колец.
_AMD_
Спасибо. Буду дома, то, если найду спрошу еще кое-что на эту тему у тебя
Snusmumriken
Я прост сам всегда делаю деревья из таблиц, а если где-то есть лишние буферы/индексы - или они удаляются сами, или выставляется режим слабых ссылок.
Данный режим я практически никогда не использую, ибо организация проектов не способствует циклическим ссылкам.
Но вот если у тебя, допустим, есть игрушка, в которой есть персонажи с инвентарём, и ты удаляешь объект из игрового мира и хочешь чтобы он удалился и из инвенторя тоже - делаешь инвентарь таблицей слабых ссылок и собираешь мусор после удаления объекта из игрового мира.
_AMD_
А можно как-то быстро найти все «дырявые» места?
Vasiliy
Снус, ты чего? ГЦ же все отлично соберет в твоем примере.
Vasiliy
острова пофигу, если до объекта никак не добраться из рантайма (через _G к примеру) то его соберут
Vasiliy
помимо _G, наверное еще есть registry - туда С код может что-то пихать
Snusmumriken
Tverd
Я тоже заинтриговался тем, что если три таблицы в nil то они не удалятся, если есть кроссылки... я так понимаю для этого и есть стадии в сборщике мусора... с чего Снус ты это взял?
Tverd
щас даже проверю...
Snusmumriken
Сборщик мусора считает количество жёстких ссылок на объект.
Если количество >0 то объект остаётся жив. Ссылки по умолчанию - жёсткие.
Tverd
local tbl1 = {}
local tbl2 = {link = tbl1}
local tbl3 = {link = tbl2}
tbl1.link = tbl3
tbl1._proxy = newproxy(true)
getmetatable(tbl1._proxy).__gc = function()
print('__GC')
end
-- tbl1.link = nil -- разрываем кольцо ручками
tbl1, tbl2, tbl3 = nil, nil, nil
Tverd
ну в общем сборщик сработал
Snusmumriken
Тут - конечно сработает, кольцо-то разорвано.
Tverd
неа, закоменчено
Snusmumriken
А.
Tverd
в осли бы такая фигня была, это был бы очень фатальный недостаток... И фиг тогда как это дебажить
Snusmumriken
Ну, утечки памяти - довольно стрёмная штука которую сложно дебажить.
Snusmumriken
Ну, значит у луёв сборка мусора ещё проверяет на связь с таблицей _G, хе.
Век живи век учись ))
Тогда утечки в несколько раз сложнее организовать.
В питоне аналогичное замечательно работает, и острова примерно так же легко сделать, хоть там и сборка мусора значительно быстрее.
Vasiliy
не проверяет на _G. Просто он помечает доступность. Остров, который не доступен ни откуда - обречен.
Snusmumriken
А как он обнаружит доступность у острова? Генерировать граф для Каждого Объекта?
Очень медленно.
Snusmumriken
И да, "не доступен ни откуда" - а откуда можно быть доступным? Из другого острова? Чем вообще остров отличается от не-острова, и где "корень который точно нельзя вычищать" как не таблица _G?
Anonymous
Ребята в питоне гц обнаруживает циклы
Snusmumriken
Ну я про древние питоны, начало второй версии.
Anonymous
Странно что в луа такой стремный гц
Anonymous
Уж циклы то надо
Anonymous
Или может снус не про это говорит
Anonymous
Я чет не понимаю. Луа же хороший сам интерпретатор, гц тоже должен быть норм
Snusmumriken
Не совсем, гц в луа полирует много чего лишнего при сборке. Роберто на прошлом митапе в мейле как раз говорил о его модификациях в lua 5.4.
Но да, ща читаю про гц, он типа обсервативный, т.е. шарит по ссылкам начиная с _G и помечает объекты как "живые", как пройдёт по всем объектам - удалит всё не помеченное (ссылочно не стыкуется к _G).
Да, он удалит вообще всё, островов не будет, хоть и не особо быстро.
Snusmumriken
Майк Пол тоже много вопил на тему "нового сборщика мусора", мб даже закончит, особенно если его профинансируют : )
Snusmumriken
Ребзя, ни у кого не завалялось пол ляма-лям?
Snusmumriken
Ну, сначала надо же спросить, вдруг завалялось в весенней ветровке.
Snusmumriken
Кидаем в Майка деньги!
Tverd
Vasiliy
лям - это же доллариев, да?
Snusmumriken
Ну хотя бы рублиев. Ты перерыл весенние ветровки и нашёл закатившийся в дырку кармана лям?
Vasiliy
а этот, registry он тоже в _G валяется? тот куда пинятся объекты с помощью luaL_ref()
Vasiliy
думается, кроме _G можно еще места найти )
но это детали
Vasiliy
Лям рублей это 16к баксов. Даже я бы не взялся
Snusmumriken
А ещё, лям - это всего 20 таких монеток. Они по 5кг, кстати, быстро дырки в карманах делают и теряются там навсегда.
Vasiliy
да )