Forthが条件付き実行にプロセッサフラグを使用しないのはなぜですか?Forthとプロセッサフラグ
代わりに、比較結果がパラメータスタックに配置されます。それは内部のインタプリタループが次の命令に行くときにフラグを変更する可能性があるからですか?それとも、単に条件付き論理を抽象化するのでしょうか?
など。 x86では、フラグレジスタは、すべてがフラグレジスタを持たない場合は、ほとんどのプロセッサとして比較結果を保持します。
Forthが条件付き実行にプロセッサフラグを使用しないのはなぜですか?Forthとプロセッサフラグ
代わりに、比較結果がパラメータスタックに配置されます。それは内部のインタプリタループが次の命令に行くときにフラグを変更する可能性があるからですか?それとも、単に条件付き論理を抽象化するのでしょうか?
など。 x86では、フラグレジスタは、すべてがフラグレジスタを持たない場合は、ほとんどのプロセッサとして比較結果を保持します。
これはForthと最適化のレベルによって異なります。 Gforthので
see tt
808376F 4 # EBP SUB 83ED04
8083772 EBX 0 [EBP] MOV 895D00
8083775 0 # EBX MOV BB00000000
808377A EBX EBX OR 09DB
808377C 0 [EBP] EBX MOV 8B5D00
808377F 4 [EBP] EBP LEA 8D6D04
8083782 808379D JZ 0F8415000000
8083788 804D06F ((S")) CALL E8E298FCFF
808378D "true"
8083793 804C5BF (TYPE) CALL E8278EFCFF
8083798 80837AE JMP E911000000
808379D 804D06F ((S")) CALL E8CD98FCFF
80837A2 "false"
80837A9 804C5BF (TYPE) CALL E8118EFCFF
80837AE RET C3 ok
:SwiftForth(x86_64のGNU/Linuxの)において
: tt 0 if ." true" else ." false" then ;
see tt
: tt
0
IF .\" true"
ELSE .\" false"
THEN ; ok
フォースとして内部動作を規定するために、スタックベースの言語であります言語の中にあるものを変更するには、結果を定義する必要があります。フラグレジスタは言語ではありません。明らかに、最適化コンパイラの場合、同じ最終結果を与えるどのようなアプローチでも同じように受け入れられます。
偉大な答え。これは、フラグレジスタを最適化として使用することを意味し、第4のVMは、フラグレジスタを定義の一部として含むように変更しなければならず、レガシーコードを破棄する必要があります。これは有利かもしれません。複雑さを犠牲にしてスピードを上げることができます。 – Daryl
@Darylでは、最適化コンパイラはソースコードレベルで変更を必要としません。つまり、定義の一部としてレジスタを含める必要はありません。 Forthコンパイラは、特定のケースでスタックの代わりにフラグレジスタを使用するマシンコードを生成するだけです。 – ruvim