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 до конца файла или маркера __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' корректно имеют метод SelfLoader AUTOLOAD после первого разбора данных после __DATA__.
АВТОР
SelfLoader поддерживается perl5-porters. Пожалуйста, задавайте вопросы на соответствующем списке рассылки. Всё, что относится к выпуску CPAN, можно отправлять его владельцу.
Автор и разработчик: 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 Лэрри Уолл и другие
Все права защищены.
Эта программа является свободным программным обеспечением; вы можете распространять и/или модифицировать её на условиях:
- а)
-
GNU Общая публичная лицензия, опубликованная Фондом свободного программного обеспечения; либо версия 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–2023 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.38.0/SelfLoader