7

次の 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と結論付けています。あれは正しいですか?もしそうなら、私が知っておくべき他の同様に特別なケースのフォームはありますか?useDOC CHECK

4

1 に答える 1