2016-04-26 6 views
2

Forthが条件付き実行にプロセッサフ​​ラグを使用しないのはなぜですか?Forthとプロセッサフ​​ラグ

代わりに、比較結果がパラメータスタックに配置されます。それは内部のインタプリタループが次の命令に行くときにフラグを変更する可能性があるからですか?それとも、単に条件付き論理を抽象化するのでしょうか?

など。 x86では、フラグレジスタは、すべてがフラグレジスタを持たない場合は、ほとんどのプロセッサとして比較結果を保持します。

答えて

2

これは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 
2

フォースとして内部動作を規定するために、スタックベースの言語であります言語の中にあるものを変更するには、結果を定義する必要があります。フラグレジスタは言語ではありません。明らかに、最適化コンパイラの場合、同じ最終結果を与えるどのようなアプローチでも同じように受け入れられます。

+0

偉大な答え。これは、フラグレジスタを最適化として使用することを意味し、第4のVMは、フラグレジスタを定義の一部として含むように変更しなければならず、レガシーコードを破棄する必要があります。これは有利かもしれません。複雑さを犠牲にしてスピードを上げることができます。 – Daryl

+1

@Darylでは、最適化コンパイラはソースコードレベルで変更を必要としません。つまり、定義の一部としてレジスタを含める必要はありません。 Forthコンパイラは、特定のケースでスタックの代わりにフラグレジスタを使用するマシンコードを生成するだけです。 – ruvim

関連する問題