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

The A Environment

Рекомендуемые сообщения

Кстати,а если я напишу

c=require('component')
--код идёт дальше

То среда дополнительно сделает 

component = require('component')

Так ведь?


Если это так,то появляется лишняя переменная с библиотекой.Которая не используется в программе,но использует память.

Хотя,возможно,сборщик мусора уберёт это,но не сразу.(А вдруг у кого-то памяти есть мало,а требуется много,причём сразу)

В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение.

Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц:

setmetatable(package.loaded, { __mode = "v" })

Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В данном случае память особо не тратится, т. к. не библиотека второй раз не загружается с диска, а уже хранится в package.loaded, оттуда и берётся в при вызове require(), следовательно (c == component). То-есть память тратится только на переменную, но не на её значение.

Я использую другой метод, я заставляю сборщик мусора решать за меня, какая библиотека используется, а какая нет. Как известно сборщик мусора удаляет те объекты (таблицы, функции, потоки, userdata) в Lua, которые не используются ни в одной переменной, к которым нет доступа ни откуда. Значит мы можем использовать эту особенность у удалять неиспользуемую библиотеку с помощью метатаблиц:

setmetatable(package.loaded, { __mode = "v" })

Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся.

Красивый способ.

 

Метатаблицы сильны.

 

Насколько я помню, есть метаметод вызываемый при обращении к несуществующему индексу. Теоретически, если повесить на _G такой метаметод, и попросить его искать и подгружать найденный модуль, то можно вообще избавиться от всяких там require() в программах.

 

Я не уверен, можно ли проделать такой фокус с _G. Если не получится, то думаю, что можно создавать заглушки для подгружаемых модулей с этим же метаметодом. Хотя это менее красиво, и требует дополнительных действий по предварительному поиску модулей, и созданию заглушек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Указывает, защищает ли таблица свои элементы от сборщика мусора

Вроде в lua 5.2 есть _ENV

Изменено пользователем evgkul

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Слабость таблицы 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, чтобы тут сидеть ночами и "ломать голову" над тем, как освободить лишние пару килобайт ОЗУ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

П.С. В эмуляторе Луа в моде ОС вызов collectgarbage() отключен. Что там и как работает на детских комПуктерах и нужен ли нам весь этот огород и безумная возня  в нашем конкретном случае для майна со сборщиками мусора, "средами разработки" и прочей дребеденью, один крипер знает. Скорее всего, это только снизит производительность и будет грузить сервер ненужными операциями.

 

Там все работает автоматически, сборщики мусора, "укладчики" и "сохраняльщики", нам нужно лишь следить за тем, чтобы не писать говно-проги и говно-циклы, локализировать переменные, следить за памятью свободной, так как у нас ее сотни килобайт какие-то, проверять фри-мемори на этапе разработки программы, использовать только необходимые библиотеки, исходить из здравого смысла и понимать, что таблицы длинной в 2^100 элементов в ОЗУ игрового комПуктера не поместить никак и нам не нужно писать новый ОпенВиндовс вместо копалки, как некоторые любят. Мод ОС НЕ рассчитан на гигантские проги и великие рекорды мира и Гиннеса, а также на космические проекты для расчета орбиты Вояджера-2, чтобы тут сидеть ночами и "ломать голову" над тем, как освободить лишние пару килобайт ОЗУ.

Окстись, неверный! Мы тут учимся программировать!

 

Не пытайся нас остановить, и ограничить копалками!

 

Мы будем писать свои ОпенВиндовсы, ставить великие рекорды Гиннеса, и рассчитывать траектории Вояджеров, ведь мы так учимся!

 

З.Ы. 

Сборщики мусора оттого и появились, что погромисты забиывали как оно все работает внутри, и оставляли много мусора + пикча про лень, выше. А то, что мусорщик в моде отключен и, в данном конкретном случае, работать не будет - вовсе не мешает теоретическому исследованию проблемы в образовательных целях. Не так ли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Не так ли?

Может и так :)

Вот только эта теория скорее всего интересна и нужна будет дай Бог одному человеку из 1000 юзеров форума, а многих даже отпугнет от изучения программирования :D

 

В основной массе игроки жалуются, что табла почему-то не конкатенейтится со стрингом и орет ошибкой  и спрашивают, как получить заряд МФСУ-шки через адаптер и как запихать в робота сундук с киркой=) Куча либ лежит прекрасных на форуме и никто их не юзает, а игроки упорно в программках своих пишут свои ванильные "файле.опен" и "файле.рид" с "файле.клоузе". =)

Что толку от теории, если практической пользы нет?

 

П.С. "ОпенВиндовс" и "копалка" - это образное сравнение, если вдруг что ;) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот только эта теория скорее всего интересна и нужна будет дай Бог одному человеку из 1000 юзеров форума, а многих даже отпугнет от изучения программирования :D

Именно на этого одного мы и ориентируемся. Хотя...

 

Я думаю ты недооцениваешь процент любознательных людей. Лично я пришел на этот форум с вопросом: "Как получить доступ к локальному окружению из функции загружаемой через load()", и получил продуктивный диалог как минимум с двумя оппонентами. 

 

В основной массе игроки жалуются, что табла почему-то не конкатенейтится со стрингом и орет ошибкой  и спрашивают, как получить заряд МФСУ-шки через адаптер и как запихать в робота сундук с киркой=) Куча либ лежит прекрасных на форуме и никто их не юзает, а игроки упорно в программках своих пишут свои ванильные "файле.опен" и "файле.рид" с "файле.клоузе". =)

Изобретая велосипед ребенок учится изобретать и изучает устройство велосипеда.

 

Что толку от теории, если практической пользы нет?

Да. Трактористу от цилов Карно нет никакой пользы. По крайней мере он в этом уверен. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Да. Трактористу от цилов Карно нет никакой пользы. По крайней мере он в этом уверен. 

 

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

 

П.С. Чего ты прицепился) Я ж вам не запрещаю писать ОпенВиндовсы или игру Крайзис 6.  Пишите там хоть программу управления Большим адронным колайдером на Луа и ОС-ких комПуктерах. Главное, чтобы сервер не лагал, а что там на нем крутится, админу до лампочки  :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

П.С. Чего ты прицепился) ...

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

 

Даешь больше оригинальных велосипедов!


Вернемся к теме сред.

 

Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно ли на _G повесить метаметод __newindex, и обеспечить таким образом автоматическую загрузку библиотек?

Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы. Код типа:

variable = 12

Для Lua значит тоже, что и:

_ENV["variable"] = 23
-- или
_ENV.variable = 23
-- и почти то же самое
_G.variable = 23

_ENV — локальная переменная, которая выступает в роли окружения функции, изначально _G — окружение любой функции, разумеется это можно изменить, просто сменив значение _ENV или создав более локальную _ENV

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да. С _G можно взаимодействовать, как с обычной таблицей, на ней будут работать все свойства и методы метатаблицы. 

Отлично! 

Дело за малым. Накидать код который будет цеплять на _G метаметод подгрузки запрашиваемой библиотеки, и запихнуть его в автозагрузку. И с require() можно прощаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Стоит надеятся, что в opencomputers _G работает так-же :) _ENV вон не работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Стоит надеятся, что в opencomputers _G работает так-же :) _ENV вон не работает

Не надо дезинформировать людей, _ENV работает. С чего бы он перестал работать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

странно, я попытался в opencomputers, не сработало

Ну я тоже пытался, прямо после ваших слов. На Lua 5.2 и 5.3 всё прекрасно работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Стоит надеятся, что в opencomputers _G работает так-же :) _ENV вон не работает

_G прекрасно работает... в смысле, что таблица с именем _G это глобальное окружение доступное для манипуляций. А с _ENV немного непонятки, поскольку _G==_ENV. 

 

P.S.

Видится мне, что простейшим/лучшим вариантом функции для автоматической загрузки библиотек будет использование существующего кода. Т.е. метаметод _newindex в простейшем варианте будет делать require().

 

Если кто имеет возможность проверить такой финт, отпишитесь пожалуйста, работает ли. А то я уж все майнкрафты с луа поудалял давно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может есть смысл тут тоже  еще глянуть, вдруг нужные кому-то, дополнительные крупицы знаний:  ссылка

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Кстати,а если я напишу c=require('component') --код идёт дальше То среда дополнительно сделает  component = require('component') Так ведь?
 

В последней версии впилил проверку, есть ли требование этой библиотеки, написанное самим пользователем. Доделаю еще пару фич и залью.


 

 

Отлично!  Дело за малым. Накидать код который будет цеплять на _G метаметод подгрузки запрашиваемой библиотеки, и запихнуть его в автозагрузку. И с require() можно прощаться.
 

Прочитал и посты ниже, очень интересная идея, но с одним недостатком: имхо это не очень эффективно, ведь обращение к local-переменной осуществляется быстрее и было бы лучше создать такую переменную на стадии инициализации(как в моей среде), а не юзать поле таблицы _G


 

 

Теперь неиспользуемые модули будут выгружаться автоматически, когда сборщик мусора до них доберётся.
 

Это хорошая идея, ты не против, если я ее добавлю в патчер-установщик?


 

 

Нельзя было сделать работоспособную ссылку, чтобы из браузер просто нажать и посмотреть код?
 

Пожелания учитываются)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...