Ktlo 789 Опубликовано: 8 января, 2016 Кстати,а если я напишу c=require('component') --код идёт дальше То среда дополнительно сделает component = require('component') Так ведь? Если это так,то появляется лишняя переменная с библиотекой.Которая не используется в программе,но использует память. Хотя,возможно,сборщик мусора уберёт это,но не сразу.(А вдруг у кого-то памяти есть мало,а требуется много,причём сразу) В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение. Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц: setmetatable(package.loaded, { __mode = "v" }) Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 8 января, 2016 В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение. Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц: setmetatable(package.loaded, { __mode = "v" }) Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся. Красивый способ. Метатаблицы сильны. Насколько я помню, есть метаметод вызываемый при обращении к несуществующему индексу. Теоретически, если повесить на _G такой метаметод, и попросить его искать и подгружать найденный модуль, то можно вообще избавиться от всяких там require() в программах. Я не уверен, можно ли проделать такой фокус с _G. Если не получится, то думаю, что можно создавать заглушки для подгружаемых модулей с этим же метаметодом. Хотя это менее красиво, и требует дополнительных действий по предварительному поиску модулей, и созданию заглушек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 8 января, 2016 Напомните, что делает метод __mode? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 8 января, 2016 (изменено) Указывает, защищает ли таблица свои элементы от сборщика мусора Вроде в lua 5.2 есть _ENV Изменено 8 января, 2016 пользователем evgkul Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 8 января, 2016 Слабость таблицы t управляется полем __mode ее метатаблицы. Если поле __mode, это строка, содержащая символ 'к', ключи в таблице являются слабыми. Если __mode содержит 'v', значения в таблице являются слабыми. В любом случае сборщик удалит пару ключ=значение. t = {} setmetatable(t, { __mode = 'v' }) t['foo'] = {1,2,5} collectgarbage() print(t['foo']) --> nil t = {} setmetatable(t, { __mode = 'v' }) t['foo'] = {1,2,5} -- collectgarbage() print(t['foo']) --> table: 0x239af20 Справедливо, если t['foo'] - таблица, если же t['foo'] - число или стринг, сборщик пропустит его. П.С. В эмуляторе Луа в моде ОС вызов collectgarbage() отключен. Что там и как работает на детских комПуктерах и нужен ли нам весь этот огород и безумная возня в нашем конкретном случае для майна со сборщиками мусора, "средами разработки" и прочей дребеденью, один крипер знает. Скорее всего, это только снизит производительность и будет грузить сервер ненужными операциями. Там все работает автоматически, сборщики мусора, "укладчики" и "сохраняльщики", нам нужно лишь следить за тем, чтобы не писать говно-проги и говно-циклы, локализировать переменные, следить за памятью свободной, так как у нас ее сотни килобайт какие-то, проверять фри-мемори на этапе разработки программы, использовать только необходимые библиотеки, исходить из здравого смысла и понимать, что таблицы длинной в 2^100 элементов в ОЗУ игрового комПуктера не поместить никак (если, конечно, админ в конфиге не выделит на один игровой комПуктер и планку 3 ур. 1ГБ ОЗУ) и нам не нужно писать новый ОпенВиндовс какой-то вместо копалки, как некоторые любят. Мод ОС НЕ рассчитан на гигантские проги и великие рекорды мира и Гиннеса, а также на космические проекты для расчета орбиты Вояджера-2, чтобы тут сидеть ночами и "ломать голову" над тем, как освободить лишние пару килобайт ОЗУ. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 8 января, 2016 П.С. В эмуляторе Луа в моде ОС вызов collectgarbage() отключен. Что там и как работает на детских комПуктерах и нужен ли нам весь этот огород и безумная возня в нашем конкретном случае для майна со сборщиками мусора, "средами разработки" и прочей дребеденью, один крипер знает. Скорее всего, это только снизит производительность и будет грузить сервер ненужными операциями. Там все работает автоматически, сборщики мусора, "укладчики" и "сохраняльщики", нам нужно лишь следить за тем, чтобы не писать говно-проги и говно-циклы, локализировать переменные, следить за памятью свободной, так как у нас ее сотни килобайт какие-то, проверять фри-мемори на этапе разработки программы, использовать только необходимые библиотеки, исходить из здравого смысла и понимать, что таблицы длинной в 2^100 элементов в ОЗУ игрового комПуктера не поместить никак и нам не нужно писать новый ОпенВиндовс вместо копалки, как некоторые любят. Мод ОС НЕ рассчитан на гигантские проги и великие рекорды мира и Гиннеса, а также на космические проекты для расчета орбиты Вояджера-2, чтобы тут сидеть ночами и "ломать голову" над тем, как освободить лишние пару килобайт ОЗУ. Окстись, неверный! Мы тут учимся программировать! Не пытайся нас остановить, и ограничить копалками! Мы будем писать свои ОпенВиндовсы, ставить великие рекорды Гиннеса, и рассчитывать траектории Вояджеров, ведь мы так учимся! З.Ы. Сборщики мусора оттого и появились, что погромисты забиывали как оно все работает внутри, и оставляли много мусора + пикча про лень, выше. А то, что мусорщик в моде отключен и, в данном конкретном случае, работать не будет - вовсе не мешает теоретическому исследованию проблемы в образовательных целях. Не так ли? 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 8 января, 2016 Не так ли? Может и так Вот только эта теория скорее всего интересна и нужна будет дай Бог одному человеку из 1000 юзеров форума, а многих даже отпугнет от изучения программирования В основной массе игроки жалуются, что табла почему-то не конкатенейтится со стрингом и орет ошибкой и спрашивают, как получить заряд МФСУ-шки через адаптер и как запихать в робота сундук с киркой=) Куча либ лежит прекрасных на форуме и никто их не юзает, а игроки упорно в программках своих пишут свои ванильные "файле.опен" и "файле.рид" с "файле.клоузе". =) Что толку от теории, если практической пользы нет? П.С. "ОпенВиндовс" и "копалка" - это образное сравнение, если вдруг что Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 624 Опубликовано: 8 января, 2016 2^100 1267650600228229401496703205376 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 8 января, 2016 Вот только эта теория скорее всего интересна и нужна будет дай Бог одному человеку из 1000 юзеров форума, а многих даже отпугнет от изучения программирования Именно на этого одного мы и ориентируемся. Хотя... Я думаю ты недооцениваешь процент любознательных людей. Лично я пришел на этот форум с вопросом: "Как получить доступ к локальному окружению из функции загружаемой через load()", и получил продуктивный диалог как минимум с двумя оппонентами. В основной массе игроки жалуются, что табла почему-то не конкатенейтится со стрингом и орет ошибкой и спрашивают, как получить заряд МФСУ-шки через адаптер и как запихать в робота сундук с киркой=) Куча либ лежит прекрасных на форуме и никто их не юзает, а игроки упорно в программках своих пишут свои ванильные "файле.опен" и "файле.рид" с "файле.клоузе". =) Изобретая велосипед ребенок учится изобретать и изучает устройство велосипеда. Что толку от теории, если практической пользы нет? Да. Трактористу от цилов Карно нет никакой пользы. По крайней мере он в этом уверен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 8 января, 2016 Да. Трактористу от цилов Карно нет никакой пользы. По крайней мере он в этом уверен. Тракторист - это юзверь считай, ему циклы Карно знать и необязательно, чтобы трактор куда-то ездил, а тем более не нужно морочить ему этими циклами башню. А вот научить почистить форсунку(образно, конечно, форсунки, и те испытываются и настраиваются на стендах, скажем, лучше свечу) и куда ее впендюрить, вот это рассказать ему желательно П.С. Чего ты прицепился) Я ж вам не запрещаю писать ОпенВиндовсы или игру Крайзис 6. Пишите там хоть программу управления Большим адронным колайдером на Луа и ОС-ких комПуктерах. Главное, чтобы сервер не лагал, а что там на нем крутится, админу до лампочки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 8 января, 2016 П.С. Чего ты прицепился) ... Прицепился потому, что, по моему скромному мнению, столь авторитетное лицо не должно допускать высказываний типа, - Ваши действия не имеют смысла. - А наоборот, должен всячески поощрять любые дискуссии по теме проекта, в том числе дискуссии по построению велосипедов и прочих самокатов. (хотя бы потому, что это релевантный контент) Даешь больше оригинальных велосипедов! Вернемся к теме сред. Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ktlo 789 Опубликовано: 8 января, 2016 Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек? Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы. Код типа: variable = 12 Для Lua значит тоже, что и: _ENV["variable"] = 23 -- или _ENV.variable = 23 -- и почти то же самое _G.variable = 23 _ENV — локальная переменная, которая выступает в роли окружения функции, изначально _G — окружение любой функции, разумеется это можно изменить, просто сменив значение _ENV или создав более локальную _ENV 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 9 января, 2016 Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы. Отлично! Дело за малым. Накидать код который будет цеплять на _G метаметод подгрузки запрашиваемой библиотеки, и запихнуть его в автозагрузку. И с require() можно прощаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 9 января, 2016 Стоит надеятся, что в opencomputers _G работает так-же _ENV вон не работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ktlo 789 Опубликовано: 9 января, 2016 Стоит надеятся, что в opencomputers _G работает так-же _ENV вон не работает Не надо дезинформировать людей, _ENV работает. С чего бы он перестал работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 9 января, 2016 странно, я попытался в opencomputers, не сработало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ktlo 789 Опубликовано: 9 января, 2016 странно, я попытался в opencomputers, не сработало Ну я тоже пытался, прямо после ваших слов. На Lua 5.2 и 5.3 всё прекрасно работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
swg2you 403 Опубликовано: 9 января, 2016 Стоит надеятся, что в opencomputers _G работает так-же _ENV вон не работает _G прекрасно работает... в смысле, что таблица с именем _G это глобальное окружение доступное для манипуляций. А с _ENV немного непонятки, поскольку _G==_ENV. P.S. Видится мне, что простейшим/лучшим вариантом функции для автоматической загрузки библиотек будет использование существующего кода. Т.е. метаметод _newindex в простейшем варианте будет делать require(). Если кто имеет возможность проверить такой финт, отпишитесь пожалуйста, работает ли. А то я уж все майнкрафты с луа поудалял давно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 9 января, 2016 Может есть смысл тут тоже еще глянуть, вдруг нужные кому-то, дополнительные крупицы знаний: ссылка П.С. Полную версию книжки можно скачать с нашего сайта в сайдбаре "Ссылки" 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
SergOmarov Автор темы 34 Опубликовано: 12 января, 2016 Кстати,а если я напишу c=require('component') --код идёт дальше То среда дополнительно сделает component = require('component') Так ведь? В последней версии впилил проверку, есть ли требование этой библиотеки, написанное самим пользователем. Доделаю еще пару фич и залью. Отлично! Дело за малым. Накидать код который будет цеплять на _G метаметод подгрузки запрашиваемой библиотеки, и запихнуть его в автозагрузку. И с require() можно прощаться. Прочитал и посты ниже, очень интересная идея, но с одним недостатком: имхо это не очень эффективно, ведь обращение к local-переменной осуществляется быстрее и было бы лучше создать такую переменную на стадии инициализации(как в моей среде), а не юзать поле таблицы _G Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся. Это хорошая идея, ты не против, если я ее добавлю в патчер-установщик? Нельзя было сделать работоспособную ссылку, чтобы из браузер просто нажать и посмотреть код? Пожелания учитываются) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах