Сохранить ресурсы, только загружая части модуля?

108
12

Я читаю объекты O'Reilly Perl, ссылки и модули, а точнее раздел о модулях. В нем указано, что при использовании use Some::Module вы можете указать список импорта. Из его объяснения кажется, что единственное преимущество использования этого списка состоит в том, чтобы сохранить чистое пространство имен. Другими словами, если у вас есть подпрограмма some_sub в вашем пакете main, а загруженный модуль имеет sub с тем же именем, ваша подпрограмма будет переопределена. Однако, если вы укажете список импорта и оставьте some_sub из этого списка, у вас не будет этого конфликта. Затем вы можете запустить some_sub из модуля, объявив его так: Some::Module::some_sub.


Есть ли другое преимущество, чем описанное выше? Я спрашиваю об этом, потому что в некоторых случаях вы загружаете модули с множеством функциональных возможностей, хотя вас интересуют только некоторые из его методов. Сначала я подумал, что, указав список импорта, вы только загрузили эти методы, а не раздували память методами, которые вы не использовали бы в любом случае. Однако из приведенного выше объяснения это не так. Можете ли вы выборочно экономить ресурсы, только загружая части модуля? Или Perl достаточно умен, чтобы сделать это при компиляции без необходимости вмешательства программиста?

спросил(а) 2017-04-12T11:48:00+03:00 3 года, 6 месяцев назад
1
Решение
90

Обратите внимание, что "список импорта" - это просто соглашение. Функция модуля import позволяет делать все, что угодно, с этим списком, и вы можете увидеть ее (ab), используемую многими так называемыми модулями pragma. Поэтому частичная загрузка НЕ ​​привязана к use. Например, модуль может загружать тяжелые заглушки функций, если вы их импортировали или нет, и динамически загружать большую реализацию при первом первом вызове.


Следовательно, use с частичным списком импорта может или фактически не может сохранять какие-либо ресурсы - все зависит от фактической реализации модуля use d.


Пока require и use действительно загружают весь файл .pm - этот файл может быть просто небольшим заглушкой и загрузчиком для фактического кода, расположенного в другом месте. Существует еще одно соглашение для вызова этих модулей ::Heavy.

Модули могут свободно выполнять частичную загрузку любым способом, который им нравится. Вот лишь некоторые возможности, по которым модуль может экономить ресурсы:


    AUTOLOAD (с его бесплатными модулями AutoLoader, AutoSplit и SelfLoader).
    Используйте заглушки, которые загружают необходимые подмодули.
    Динамически загружать тяжелые данные (т.е. словари или карты кодирования), когда они впервые получают доступ к их имени.
    Если вы зависнете от других тяжелых модулей, динамически require их во время выполнения в функциях, которые зависят от них, а не от времени компиляции use в самом начале.

Все в этом списке может работать автоматически за кулисами, отображаться через список импорта use или работать/вызываться другим, совершенно произвольным образом. Еще раз, это полностью до реализации модуля.

ответил(а) 2017-04-12T14:39:00+03:00 3 года, 6 месяцев назад
100

Из use мы видим, что use Module LIST; означает точно


BEGIN { require Module; Module->import( LIST ); }



С другой стороны, из require


В противном случае require требует, чтобы файл библиотеки был включен, если он еще не был включен. Файл включен через механизм do-FILE, [...]


и do 'file' выполняет 'file' как Perl script. Таким образом, при use мы загружаем весь модуль.


"Импортирование" суб означает, что его имя добавляется (или перезаписывается) в таблице символов (через слот CODE для типаglob, обычно с псевдонимом), с помощью функции пакета import. Дополнительный код не копируется. Теперь import может быть написан любым способом, который автор хочет, но обычно список импорта в операторе use просто контролирует, какие символы вводятся в пространство имен. Предпочтительным способом предоставления import в модуле является использование метода Exporter import.


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


Еще одно явное преимущество - это то, что он хорошо документирует то, что используется в коде.

ответил(а) 2017-04-12T12:02:00+03:00 3 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема