次の 2 つのプログラムを検討してください。
unit module Comp;
say 'Hello, world!'
と
unit module Comp;
CHECK { if $*DISTRO.is-win { say 'compiling on Windows' }}
say 'Hello, world!'
単純に、両方のプログラムがまったく同じバイトコードにコンパイルされることを期待していました。CHECK
ブロックは、コンパイルの最後に実行するコードを指定します。変数をチェックしてから何もしないことは、プログラムの実行時の動作に影響を与えないため、コンパイルされたバイトコードに含める必要はありません。
ただし、これら 2 つのプログラムをコンパイルしても、同じバイトコードにはなりません。具体的には、CHECK
ブロックを使用しないバージョンをコンパイルすると、24K のバイトコードが作成されますが、ブロックを使用するバージョンでは 60K が作成されます。これら 2 つのバージョンでバイトコードが異なるのはなぜですか? このバイトコードの違いには、ランタイム コストがありますか (または潜在的に) ありますか? (そうしなければならないように思えますが、私は確信したいのです)。
そして、もう 1 つの関連する質問:DOC CHECK
ブロックはどのように上記に適合しますか? 私の理解では、フラグを指定して実行されていない場合、コンパイラDOC CHECK
でさえブロックをスキップします。--doc
それと一致して、hello-world プログラムのバイトコードは、上記のようなブロックが与えられたときにサイズが増加しません。DOC CHECK
ただし、ブロックにステートメントが含まれている場合はサイズが大きくなります。そのことから、それはどういうわけか特殊なケースであり、ブロック内でも実行されるuse
と結論付けています。あれは正しいですか?もしそうなら、私が知っておくべき他の同様に特別なケースのフォームはありますか?use
DOC CHECK