SelfLoader
СОДЕРЖАНИЕ
- ИМЯ
- СИНТЕКС
- ОПИСАНИЕ
- Несколько пакетов и полностью квалифицированные имена подпрограмм
- АВТОР
- АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ
ИМЯ
SelfLoader - загружает функции только по требованию
СИНТЕКС
package FOOBAR;
use SelfLoader;
... (initializing code)
__DATA__
sub {.... ОПИСАНИЕ
Этот модуль сообщает своим пользователям, что функции в пакете FOOBAR должны быть загружены автоматически после токена __DATA__. См. также "Автозагрузка" в perlsub.
Токен __DATA__
Токен __DATA__ сообщает компилятору Perl, что код Perl для компиляции завершён. Всё после токена __DATA__ доступно для чтения через файловый дескриптор FOOBAR::DATA, где FOOBAR — имя текущего пакета, когда достигнут токен __DATA__. Это работает точно так же, как __END__ в пакете 'main', но для других модулей данные после __END__ не извлекаются автоматически, тогда как данные после __DATA__ извлекаются. Токен __DATA__ не распознаётся в версиях Perl до 5.001m.
Обратите внимание, что в одном пакете в нескольких файлах могут быть токен __DATA__, и что последним __DATA__ токеном в данном пакете, который встречает компилятор, является доступный через файловый дескриптор. Это также относится к __END__ и main, т.е. если у программы 'main' есть __END__, но модуль 'require'd' (_не_ 'use'd) этой программой имеет объявление 'package main;' с последующим '__DATA__', то файловый дескриптор DATA устанавливается для доступа к данным после __DATA__ в модуле, _а не_ к данным после __END__ в программе 'main', поскольку компилятор встречает файл 'require'd' позже.
Автозагрузка SelfLoader
SelfLoader работает, помещая пользователь токен __DATA__ _после_ кода Perl, который должен быть скомпилирован и запущен во время 'require', но _перед_ объявлениями подпрограмм, которые могут быть загружены позже — обычно потому, что они могут никогда не быть вызваны.
SelfLoader будет читать из файлового дескриптора FOOBAR::DATA, чтобы загрузить данные после __DATA__, и загрузить любую подпрограмму при её вызове. Стоимость — однократный разбор данных после __DATA__, и задержка загрузки для _первого_ вызова любой автоматически загружаемой функции. Преимущества (в надежде) — ускорение фазы компиляции без необходимости загрузки функций, которые никогда не используются.
SelfLoader прекратит чтение из __DATA__ при встрече с токеном __END__ — как и ожидалось. Если присутствует токен __END__, и за ним следует токен DATA, то SelfLoader оставляет файловый дескриптор FOOBAR::DATA открытым на строке после этого токена.
SelfLoader экспортирует подпрограмму AUTOLOAD в пакет, использующий SelfLoader, и это загружает вызванную подпрограмму при её первом вызове.
Нет преимуществ в размещении подпрограмм, которые _всегда_ будут вызваны после токена __DATA__.
Автозагрузка и лексические переменные пакета
Выражение 'my $pack_lexical' делает переменную $pack_lexical локальной _только_ для файла до токена __DATA__. Подпрограммы, объявленные в другом месте, _не_ могут видеть эти типы переменных, так же как если бы вы объявляли подпрограммы в пакете, но в другом файле, они не могут видеть эти переменные.
Таким образом, конкретно, автоматически загружаемые функции не могут видеть лексические переменные пакета (это относится как к SelfLoader, так и к Autoloader). Предикат vars предоставляет альтернативу определению глобальных переменных на уровне пакета, которые будут видны автоматически загружаемым процедурам. См. документацию по vars в разделе предиката в perlmod.
SelfLoader и AutoLoader
SelfLoader может заменить AutoLoader — просто измените 'use AutoLoader' на 'use SelfLoader' (хотя обратите внимание, что SelfLoader экспортирует функцию AUTOLOAD — но если у вас есть свой AUTOLOAD и вы также используете AutoLoader, вы, вероятно, знаете, что делаете), и токен __END__ на __DATA__. Для использования этого вам понадобится версия Perl 5.001m или выше (версия 5.001 со всеми исправлениями до исправления m).
Нет необходимости наследоваться от SelfLoader.
SelfLoader работает аналогично AutoLoader, но подбирает подпрограммы из после __DATA__ вместо каталога 'lib/auto'. Преимущество в обслуживании — нет необходимости запускать AutoSplit на модуле при установке, а преимущество во времени выполнения — нет необходимости постоянно открывать и закрывать файлы для загрузки подпрограмм. Есть потеря времени выполнения из-за необходимости анализа кода после __DATA__.
__DATA__, __END__ и файловый дескриптор FOOBAR::DATA
Этот раздел актуален только если вы хотите использовать FOOBAR::DATA вместе с SelfLoader.
Данные после токена __DATA__ в модуле считываются с помощью файлового дескриптора FOOBAR::DATA. __END__ по-прежнему может использоваться для обозначения конца раздела __DATA__, если за ним следует токен DATA — это поддерживается SelfLoader. Файловый дескриптор FOOBAR::DATA остается открытым, если найден __END__ с последующим DATA, при этом файловый дескриптор размещен в начале строки после токена __END__ . Если токен __END__ отсутствует или токен __END__ без токена DATA в той же строке, то файловый дескриптор закрывается.
SelfLoader читает из позиции текущей позиции файлового дескриптора FOOBAR::DATA до EOF или __END__. Это означает, что если вы хотите использовать этот файловый дескриптор (и ТОЛЬКО если вы хотите), вы должны:
1. Разместить все ваши объявления подпрограмм непосредственно после токена __DATA__ и поместить свои собственные данные после этих объявлений, используя токен __END__ для обозначения конца объявлений подпрограмм. Также необходимо убедиться, что SelfLoader читает сначала, вызвав 'SelfLoader->load_stubs();', или используя функцию, которая загружена сама;
или
2. Вы должны сначала прочитать файловый дескриптор FOOBAR::DATA , оставив дескриптор открытым и расположенным на первой строке объявлений подпрограмм.
Вы можете сделать и то, и другое.
Классы и унаследованные методы
Для модулей, которые не являются классами, этот раздел не актуален. Этот раздел актуален только если у вас есть методы, которые могут быть унаследованы.
Заглушка подпрограммы (или объявление вперёд) выглядит так:
sub stub; т.е. это объявление подпрограммы без тела подпрограммы. Для модулей, которые не являются классами, заглушки фактически не нужны для автозагрузки.
Для модулей, которые _являются_ классами и должны обрабатывать унаследованные методы, заглушки необходимы для обеспечения правильной работы механизма наследования методов. Вы можете загрузить заглушки в модуль во время 'require', добавив оператор 'SelfLoader->load_stubs();' в модуль для этого.
Альтернатива заключается в размещении заглушек перед токеном __DATA__ ДО выпуска модуля, и для этой цели доступен модуль Devel::SelfStubber. Однако это требует дополнительного шага, чтобы убедиться, что заглушки находятся в модуле. Если это делается, настоятельно рекомендуется делать это до выпуска модуля — это НЕ должно делаться во время установки, как правило.
Несколько пакетов и полностью квалифицированные имена подпрограмм
Подпрограммы в нескольких пакетах в одном файле поддерживаются — но обратите внимание, что это требует экспорта SelfLoader::AUTOLOAD в каждый пакет, который его требует. Это делается автоматически SelfLoader, когда он впервые загружает подпрограммы в кеш, но вам действительно следует указать это в инициализации перед __DATA__ путём вставки оператора 'use SelfLoader' в каждом пакете.
Поддерживаются и полностью квалифицированные имена подпрограмм. Например,
__DATA__
sub foo::bar {23}
package baz;
sub dob {32} все будут загружены правильно SelfLoader, и SelfLoader обеспечит, что пакеты 'foo' и 'baz' корректно получат метод AUTOLOAD SelfLoader, когда данные после __DATA__ будут проанализированы в первый раз.
АВТОР
SelfLoader поддерживается perl5-porters. Пожалуйста, обращайтесь с вопросами на соответствующий список рассылки. Любое, что применимо к выпуску CPAN, может быть отправлено его менеджеру.
Автор и разработчик: The Perl5-Porters <perl5-porters@perl.org>
Разработчик CPAN выпуска: Steffen Mueller <smueller@cpan.org>
АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ
Этот пакет входит в ядро Perl с момента первого выпуска Perl5. Он был выпущен отдельно в CPAN, чтобы устаревшие установки могли воспользоваться исправлениями ошибок.
Этот пакет имеет те же авторские права и лицензию, что и ядро Perl:
Авторские права (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Larry Wall и другие
Все права защищены.
Эта программа является свободно распространяемым программным обеспечением; вы можете перераспределять её и/или изменять её в соответствии с условиями:
- а)
-
GNU Общая публичная лицензия, опубликованная Free Software Foundation; либо версия 1, либо (по вашему выбору) любая более поздняя версия, или
- б)
-
«Художественная лицензия», которая поставляется с этим набором.
Эта программа распространяется в надежде, что она будет полезна, но БЕЗ ГАРАНТИИ; даже без подразумеваемой гарантии КОММЕРЧЕСКОЙ СПОСОБНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Смотрите GNU Общую публичную лицензию или Художественную лицензию для получения дополнительной информации.
Вы должны были получить копию Художественной лицензии с этим набором в файле с именем «Artistic». Если нет, я с удовольствием предоставлю её.
END_OF_DOCUMENT_MARKERВы также должны были получить копию лицензии GNU General Public License вместе с этой программой в файле с именем "Copying". Если нет, напишите в Free Software Foundation, Inc., 51 Franklin St, пятый этаж, Бостон, MA 02110-1301, США или посетите их веб-страницу в Интернете по адресу http://www.gnu.org/copyleft/gpl.html.
Для тех из вас, кто выбирает использовать лицензию GNU General Public License, моя интерпретация лицензии GNU General Public License заключается в том, что ни один Perl-скрипт не попадает под условия GPL, если вы не укажете явно, что данный скрипт подпадает под условия GPL. Кроме того, любой объектный код, связанный с perl, не автоматически попадает под условия GPL, при условии, что такой объектный код только добавляет определения подпрограмм и переменных и не препятствует исполнению стандартного Perl-скрипта результирующим интерпретатором. Я считаю, что связывание C-подпрограмм таким образом является моральным эквивалентом определения подпрограмм на языке Perl. Вы можете продавать такой объектный файл как собственность при условии, что вы предоставите или предложите предоставить исходный код Perl, как указано в лицензии GNU General Public License. (Это всего лишь альтернативный способ задания входных данных для программы.) Вы также можете продать двоичный файл, созданный путем выгрузки работающего Perl-скрипта, который принадлежит вам, при условии, что вы предоставите или предложите предоставить исходный код Perl, как указано в GPL. (Тот факт, что Perl-интерпретатор и ваш код находятся в одном двоичном файле, в данном случае является всего лишь формой агрегации.) Это моя интерпретация GPL. Если у вас все еще есть вопросы или трудности в понимании моих намерений, не стесняйтесь обращаться ко мне. Конечно, лицензия Artistic License подробно описывает все это для вашей защиты, поэтому вы можете предпочесть использовать ее.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/SelfLoader