Когда BEGIN действительно запускается (или запускается)? - PullRequest
0 голосов
/ 18 декабря 2018

Это связано с этой проблемой в репозитории документации Perl 6

Не очень ясно, на какой фазе BEGIN блоков на самом деле запустить.Документация говорит «время компиляции», но Perl предварительно скомпилирован, так что может быть pre время компиляции .На самом деле, давайте использовать этот код

unit module Beginner;

BEGIN {
    say "This is where all started";
}

отсюда

require Beginner;

say "Begun";

в новом каталоге (rm -rf .precomp run).Он выводит:

This is where all started
Begun

К настоящему времени каталог .precomp, содержащий кэш, уже создан.

Так что давайте использовать его здесь:

use Beginner;
say "Already started";

И это, очевидно, возвращает только Already started.(То же самое происходит, если мы запускаем первую программу).Это может быть проблемой, потому что пользователь может не знать заранее, может ли иметь место прекомпиляция или нет, что, в свою очередь, означает, что неясно, когда происходит «время компиляции».В любом случае, вопрос заключается в следующем: как мы можем правильно сформулировать это, чтобы объяснить это в документации?Кроме того, следует ли поощрять использование BEGIN (поскольку вычисленные там значения будут сохраняться в кэше предварительной компиляции и, таким образом, эффективно исключаться из среды выполнения) или не рекомендуется?Есть ли хороший вариант использования для этого?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Что Мориц написал (и вы согласились).

Но я чувствую, что готовлю аналогию.

как мы можем сформулировать это правильно, чтобы объяснить это в документации?

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


Программа - это как рецепт торта.В нашей аналогии он смешивает инструкции по его приготовлению и выпечке.

При компиляции программы следуйте инструкциям по приготовлению пирога.

Запуск программы следует инструкциям по расстановке пирога впечь и выпекание.

Прекомпиляция - это как приготовление торта и помещение его в холодильник для выпечки в другой день.

BEGIN Время - время приготовления.Если инструкция начинается с BEGIN, то эту инструкцию следует выполнять, как только кто-то читает ее во время приготовления пирога.

Время приготовления может быть непосредственно перед выпечкой пирога или в предыдущий день..

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

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

Быть готовым, как правило, хорошо.В большинстве случаев работа по подготовке кекса для выпечки одинакова, независимо от того, хранится ли готовый кек в холодильнике некоторое время или выпекается сразу после его приготовления.

Так что я быскажем поощряется.Конечно, не dis отважно, по крайней мере, не в целом .

Но иногда имеет смысл откладывать некоторые работы, которые можно было бы назвать «подготовительными», до тех пор, пока выпечка неначалось.В этом случае не используйте BEGIN для этого, потому что BEGIN специально означает время компиляции в смысле перед временем выполнения , как объяснено далее.

Есть ли хороший пример использования для этого?

Константа является хорошим кандидатом для сортировки в рамках "подготовки".

Константа, представляющая Рождество2018 год является хорошим кандидатом для определения во время компиляции.

Константа, представляющая Рождество, вероятно, является хорошим кандидатом для определения во время выполнения.опущено.)


Эта аналогия отстой, потому что как только вы выпекаете торт (запускаете программу), готовый торт (запись в кэше прекомпиляции) исчезает.

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

Дополнительные отметки, если аналогия имеет ту же странность, что используемый инструмент называется «нижний колонтитул», даже если он используетсяи "foo" ("compile") и "bar" ("run") вещь (программа).

0 голосов
/ 18 декабря 2018

BEGIN происходит во время компиляции, и, как вы правильно заметили, это может быть время предварительной компиляции.

Я не вижу никаких проблем с этим, если вы не предполагаете, что компиляция происходитпри запуске скрипта.Точно так же, как шаблоны C ++ оцениваются во время компиляции, которое обычно сильно отличается от времени выполнения.

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

Все должно поощряться для их соответствующих случаев использования и не рекомендуется для всего остального.

Если вы хотите что-то запустить при запуске программы, используйте INIT, а не BEGIN.

Есть ли хороший пример использования для этого?

Множество метапрограммирования можно (и нужно) выполнять ввремя компиляции, например, создание списка методов и атрибутов на основе фиксированного списка имен.Делать это при каждом запуске программы - пустая трата времени, а другим частям программы может понадобиться полный тип во время компиляции.

...