Перейти к публикации
Форум - ComputerCraft
SergOmarov

The A Environment

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

Что дает эта среда?

Стандартные библиотеки можно теперь не загружать при помощи require, это обеспечит среда.

 

Про оперативную память слышали? Нет? :facepalm:

 

 

Планируемые функции: замена l <name> на local <name> и аналогично для функций.

 

Если и делаешь, то добавь выключатель, не каждым глазам удобно смотреть на код типа

l f main()
  l a = "hello"
  a = a .. "!"
  print(a)
end

Мне кажется это просто клон моего servercore, из отличий только:

  • off метод. Честно говоря не вижу смысла этому методу, удалить слушателя можно и on'ом.
  • .aa формат
  • Like 2

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


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

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

  • Like 4

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


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

 

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

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

Странно, я пробовал - не виснет.

Вот какой результат загрузки пустого: Pr6maJR.png

 

 

Мне кажется это просто клон моего servercore, из отличий только: on'ом. .aa формат

 

Вызов только 1 файла и без вызова самой среды явно.

 

 

off метод. Честно говоря не вижу смысла этому методу, удалить слушателя можно и on'ом.

 

Плохой стиль.

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

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


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

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

 

А require по твоему маг, он загружает либы, не в оперативную память, а в магическое хранилище розовых пони какающих конфетами, в котором можно хранить сколько хочешь информации. :facepalm:

 

Например, когда мы пишем в коде:

local lib = require "lib"

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

 

 

Плохой стиль.

 

Ну если для тебя a.on("func") - плохой стиль, то так тому и быть, твоя функция, не моя.

  • Like 3

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


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

 

Можно и писать local, он его просто проигнорит.

 

 

А require по твоему маг, он загружает либы, не в оперативную память, а в магическое хранилище розовых пони какающих конфетами

 

Именно так и происходит: package.preload - это хранилище)

 

 

Что это даёт, и какая польза от этой программы?
 

Меньше и легче код писать.

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

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


Ссылка на сообщение
Поделиться на других сайтах
Именно так и происходит: package.preload - это хранилище)

 

:facepalm:

package.preload - это хранилище либ, которые получаются не из файла, а из таблицы. Например:

package.preload["lox"] = {fuck = print, lol = table.insert}
...
lox = require "lox" -- файла lox.lua нету нигде
lox.print("lox") -- >> lox

:smile14: :smile14: :smile14:

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

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


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

Пардон, package.loaded, перепутал немного)

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


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

Пардон, package.loaded, перепутал немного)

 

А по твоему package.loaded - это переменная которая хранится не в оперативной памяти, а в облаке из радужных какашек и пони, в котором бесконечное количество прострнанства?

Если ты загружаешь все либы, они по твоему не займут никакого места? Фигушки. Они хоть и будут сидеть в package.loaded, но оперативку выжирать все равно будут.

 

:smile89:

Изменено пользователем LeshaInc
  • Like 2

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


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

 

 

А по твоему package.loaded - это переменная которая хранится не в оперативной памяти, а в облаке из радужных какашек и пони, в котором бесконечное количество прострнанства? Если ты загружаешь все либы, они по твоему не займут никакого места? Фигушки. Они хоть и будут сидеть в package.loaded, но оперативку выжирать все равно будут.
 

Софист ты, Леша) Хоть ты сам напишешь require, хоть среда за тебя это сделат, какая разница? Но во втором случае тебе не нужно думать о require)

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


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

Софист ты, Леша) Хоть ты сам напишешь require, хоть среда за тебя это сделат, какая разница? Но во втором случае тебе не нужно думать о require)

 

В моей практике были программы которые ели довольно много оперативной памяти компьютера. Но они подгружали совсем немного библиотек. А теперь представь если это немного превратиться в много? Компьютеру просто памяти не хватит

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

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


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

 

 

Но они подгружали совсем немного библиотек. А теперь представь если это немного превратиться в много?

Грузиться будут только те, что используются в программе, вызываемой через среде. 

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


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

Грузиться будут только те, что используются в программе, вызываемой через среде. 

 

Ты еще не понял? Вот добавили мы библиотеку - lol = require "lol". Она сразу загружается в оперативную память, сразу выжирает память. Пофиг, когда мы будем вызывать функции либы, она в любом случае будет жрать память

Изменено пользователем LeshaInc
  • Like 3

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


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

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

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


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

А для чего нужна среда? Если не считать автозагрузку библиотек - интересная фича. Вон слушатели событий есть и в стандартных либах: http://ocdoc.cil.li/api:event.

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


Ссылка на сообщение
Поделиться на других сайтах
Установка: pastebin run 7wMLkbK1

 

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

 

0Oo6Fmh.jpg

Изменено пользователем qwertyMAN
  • Like 4

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


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

lol = require "lol"
бла-бла-бла
lol = nil
бла-бла-бла
  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
lol = require "lol"
бла-бла-бла
lol = nil
бла-бла-бла

Если этим демонстрируется освобождение памяти от модуля "lol", то ничего не выйдет, модуль всё ещё хранится в таблице package.loaded. Да, я кеп.

Изменено пользователем Ktlo
  • Like 2

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


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

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

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

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

component = require('component')

Так ведь?


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

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

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

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


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

Если этим демонстрируется освобождение памяти от модуля "lol", то ничего не выйдет, модуль всё ещё хранится в таблице package.loaded. Да, я кеп.

Спасибо, хорошее замечание. 

 

Глянул по диагонали код package.lua, насколько я понял, все что было когда-то require остается в памяти "навечно". Не взирая на то, что программа, для которой это require, уже отработала и выгружена. Поправьте меня если это не так... 

 

Думаю, что package.loaded["lol"] = nil исправит ситуацию. Грубо, но вполне корректно.


Можно пойти дальше, и добавить в систему модуль (назовем его rampurge.lua) с коротким кодом:

local loaded = {
  ["_G"] = _G,
  ["bit32"] = bit32,
  ["coroutine"] = coroutine,
  ["math"] = math,
  ["os"] = os,
  ["package"] = package,
  ["string"] = string,
  ["table"] = table
}
package.loaded = loaded

Теоретически, вызов require("rampurge") обнулит кеш package до состояния "после загрузки".

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


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

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

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

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

component = require('component')

Так ведь?


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

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

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

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

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

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

  • Like 2

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


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

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

  • Like 2

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


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

 

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

 

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

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

 

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

 

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

 

З.Ы. 

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

  • Like 2

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


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

Может и так :)

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

 

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

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

 

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

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


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

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

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

 

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

 

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

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

 

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

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

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


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

 

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

 

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×