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__. Подробности AutoLoader и другое рассмотрение этих различий можно найти в документации этого модуля.
__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' правильно имеют метод AUTOLOAD SelfLoader, когда данные после __DATA__ впервые анализируются.
АВТОР
SelfLoader поддерживается perl5-porters. Пожалуйста, направляйте любые вопросы на канонический список рассылки. Всё, что относится к релизу CPAN, можно отправить его сопровождающему.
Автор и сопровождающий: The Perl5-Porters <perl5-porters@perl.org>
Сопровождающий релиза CPAN: Steffen Mueller <smueller@cpan.org>
АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ
Этот пакет является частью ядра Perl с момента первого выпуска Perl5. Он был выпущен отдельно в CPAN, чтобы старые установки могли воспользоваться исправлениями ошибок.
Этот пакет имеет те же авторские права и лицензию, что и ядро Perl:
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
Все права защищены.
Эта программа является свободной программой; вы можете перераспределять её и/или изменять её на условиях:
- a)
-
GNU General Public License, опубликованной Free Software Foundation; либо версия 1, либо (по вашему выбору) любая более поздняя версия, либо
- b)
-
«Художественная лицензия», которая поставляется с этим комплектом.
Эта программа распространяется в надежде, что она будет полезна, но БЕЗ ГАРАНТИЙ; даже без подразумеваемой гарантии товарной пригодности или пригодности для определенной цели. См. либо GNU General Public License, либо Artistic License для получения дополнительной информации.
Вы должны были получить копию Artistic License вместе с этим набором в файле под названием "Artistic". Если нет, я с удовольствием предоставлю её.
END_OF_DOCUMENT_MARKERВы также должны были получить копию лицензии GNU General Public License вместе с этой программой в файле с именем "Copying". Если нет, напишите в Free Software Foundation, Inc., 51 Franklin St, пятый этаж, Бостон, Массачусетс 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–2021 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.36.0/SelfLoader