-
P3217, Π₯ΠΎΡΠΎΡΠΈΡ ΠΠΌΠΈΡΡΠΈΠΉ ΠΠ°ΠΊΡΠΈΠΌΠΎΠ²ΠΈΡ
-
forth | stack | neum | mc -> hw | tick -> instr | struct | stream | mem | pstr | prob1 | cache
-
Π£ΡΠ»ΠΎΠΆΠ½ΡΠ½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ
<program> ::= <program> <program>
| <primitive expr>
| <word>
| <comment>
<comment> ::= "(" <any symbols except: ")" >")"
<print> ::= ".\"" <str literal>"\""
<str literal> ::= <any symbols except: "\"" >
<word> ::= ":" <word name> <expr> ";"
<loop> ::= <do-loop>|<begin-until>
<do-loop> ::= "do" [<leave expr>] "loop"
<begin-until> ::= "begin" [<leave expr>] "until"
<if-else-then> ::= "if" [<expr>] ["else" <expr>] "then"
<expr> ::= <expr> <expr>
| <token>
| <loop>
| <if-else-then>
| <word name>
<leave expr> ::= [<expr>] "leave"
| [<expr>] <leave-if-else-then> [<expr>]
| <expr>
<leave-if-else-then> ::= "if" [<leave expr>] ["else" <leave expr>] "then"
<primitive expr> ::= <primitive expr> <primitive expr>
| <token>
| <variable>
| <sallot>
| <word name>
<sallot> ::= "sallot" <int literal>
<variable> ::= "variable" <word name>
token ::= "dup"
| "drop" | "swap" | "@" | "!" | "+" | "-"
| "*" | "/" | "mod" | "or" | "and" | "=" | "emit"
| "key" | "<" | ">=" | "." | <int literal> | <print>
<word name> = <any symbols>
<int literal> ::= ['-']<natural num>
<natural num> ::= [<decimal digit>]<decimal digit>
<decimal digit> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
Π ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΌΠ°ΡΠΈΠ½Ρ ΡΠ·ΡΠΊΠ°, ΠΊΠ°ΠΊ ΠΈ Π² ΡΠΈΠΌΡΠ»ΠΈΡΡΠ΅ΠΌΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ΅, ΡΡΡΠ΅ΡΡΠ²ΡΡΡ 2 ΡΡΡΠΊΠ°: Data Stack (DS) Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΏΡΡΠΌΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° ΠΈ Return Stack (DS) - Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΡΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈ Π² do-loop ΡΠΈΠΊΠ»Π΅. ΠΠ° ΡΠ΅ΠΊΡΡΡΡ ΡΡΠ΅ΠΉΠΊΡ ΠΏΠ°ΠΌΡΡΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ DP - data pointer, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΡΠ΅ΡΡΡ Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡΠΈ variable <ΠΈΠΌΡ>. DP cΠ΄Π²ΠΈΠ³Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ sallot.
ΠΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ, ΠΊΡΠΎΠΌΠ΅ Π·Π°ΠΊΠ»ΡΡΡΠ½Π½ΡΡ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΡΠ΅Π΄ΡΡ, ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ.
Π¦ΠΈΠΊΠ»Ρ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ. Π Π°Π·ΡΠ΅ΡΠ΅Π½Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠ΅ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡ.
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ Π°Π»Π»ΠΎΠΊΠ°ΡΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π° ΡΠΎΠ»ΡΠΊΠΎ Π²Π½Π΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡ.
ΠΠ±Π»Π°ΡΡΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΠΌΡΠ½ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ - Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ. ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· DS.
ΠΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π½Π°Π΄ 32-Ρ -Π±ΠΈΡΠ½ΡΠΌΠΈ Π·Π½Π°ΠΊΠΎΠ²ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ.
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ :
ΠΠΏΠ΅ΡΠ°ΡΠΈΡ | (DS Π΄ΠΎ -- DS ΠΏΠΎΡΠ»Π΅) | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|---|
"dup" | (x -- x x) | |
"swap" | (y x -- x y) | |
"@" | (adr -- mem(adr)) | |
"!" | (val adr -- ) | ΠΠ°ΠΏΠΈΡΠ°ΡΡ val Π² ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ adr |
"+" | (x y -- x+y) | |
"-" | (x y -- x-y) | |
"*" | (x y -- x*y) | |
"/" | (x y -- x/y) | |
"mod" | (x y -- x mod y) | |
"or" | (x y -- x or y) | |
"and" | (x y -- x and y) | |
"=" | (x y -- x==y) | -1 Π΅ΡΠ»ΠΈ x==y, 0 - Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ |
"<" | (x y -- x<y) | -1 Π΅ΡΠ»ΠΈ x<y, 0 - Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ |
">=" | (x y -- x>=y) | -1 Π΅ΡΠ»ΠΈ x>=y, 0 - Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ |
"." | (x -- ) | ΠΡΠ²ΠΎΠ΄ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ ΡΠΈΡΠ»Π° Π² stdout |
"emit" | (x -- ) | ΠΡΠ²ΠΎΠ΄ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ ASCII-ΡΠΈΠΌΠ²ΠΎΠ»Π° Π² stdout |
"key" | ( -- x ) | ΠΠ²ΠΎΠ΄ ASCII-ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΈΠ· stdin |
-
: <ΡΠ»ΠΎΠ²ΠΎ> <Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅> ; - ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ
-
variable <ΡΠ»ΠΎΠ²ΠΎ> - ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
-
sallot <Π½Π°Ρ. ΡΠΈΡΠ»ΠΎ> - Π‘Π΄Π²ΠΈΠ½ΡΡΡ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ DP Π½Π° <Π½Π°Ρ. ΡΠΈΡΠ»ΠΎ>
-
<ΡΠ»ΠΎΠ²ΠΎ> - ΠΡΠ»ΠΈ <ΡΠ»ΠΎΠ²ΠΎ> - ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΠΎ ( -- adr), ΠΈΠ½Π°ΡΠ΅ - Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° <ΡΠ»ΠΎΠ²ΠΎ>
-
if <true-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅> [else <false-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅>] then - ΠΠ΅ΡΡΠΈΠ½Π° ΡΡΠ΅ΠΊΠ° ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ != 0, ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ <true-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅> Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΠ°Π΅, ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ else - Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ <false-Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅>
-
begin <Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅> until - ΠΡΠΈ Π²ΡΡΡΠ΅ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° until Π²Π΅ΡΡΠΈΠ½Π° ΡΡΠ΅ΠΊΠ° ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° != 0, ΡΠΎ ΡΠΈΠΊΠ» Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ, Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ - ΡΠΈΠΊΠ» Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ
-
do <Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅> loop - ΠΡΠΈ Π²ΡΡΡΠ΅ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° do - (limit start -- ), <Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ> Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΠΎΠΊΠ° start != limit, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΡΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ: start++. Π ΡΠΈΠΊΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ i: ( -- cur_start)
-
( <ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ>) - ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ
ΠΠΈΠ΄Ρ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΎΠ²:
- <32i> - ( -- <32i>) 32-Ρ -Π±ΠΈΡΠ½ΠΎΠ΅ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ
- ." <ΡΡΡΠΎΠΊΠ°>" - ΠΠ΅ΡΠ°ΡΡ Π² stdout ASCII ΡΡΡΠΎΠΊΠΈ <ΡΡΡΠΎΠΊΠ°>
ΠΠ°ΠΌΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ°Ρ, Π°Π΄ΡΠ΅Ρ 26-Π±ΠΈΡΠ½ΡΠΉ. ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ 2 ΡΡΡΠΊΠ°: Data Stack (DS) Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΏΡΡΠΌΡΠΌ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° ΠΈ Return Stack (DS) - Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΡΡΠΊ. Π ΡΡΡΠΊΠ°Ρ ΠΈ Π² ΠΏΠ°ΠΌΡΡΠΈ Ρ ΡΠ°Π½ΡΡΡΡ 32-Ρ -Π±ΠΈΡΠ½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΡΠ΅ ΡΠ»ΠΎΠ²Π°.
ΠΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ° ΠΏΠ°ΠΌΡΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½Π°, Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ° ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ Data Pointer'ΠΎΠΌ. DP ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°ΡΡ Π²ΠΏΠ΅ΡΡΠ΄, Π°Π»Π»ΠΎΡΠΈΡΡΡ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠ°ΠΌΡΡΡ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½ΡΡΡ Π°Π΄ΡΠ΅ΡΠ° Π² ΡΡΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π°Π΄ΡΠ΅Ρ Π² ΡΡΠ΅ΠΊΠ΅ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ. ΠΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΠ°ΠΌ, ΠΌΠ΅Π½ΡΡΠΈΠΌ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»ΡΡΠΈΠΌ DP - Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
ΠΡΠΈ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠΎΡΠΌΠΈΡΡΡΡΡΡ 3 ΡΠ°Π·Π΄Π΅Π»Π°: ΡΠ°Π·Π΄Π΅Π» ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΡΠ°Π·Π΄Π΅Π» ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈ ΡΠ°Π·Π΄Π΅Π» Π΄Π°Π½Π½ΡΡ . ΠΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π²Π½Π΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π» ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π» ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ. Π ΡΠ°Π·Π΄Π΅Π»Π΅ Π΄Π°Π½Π½ΡΡ Ρ ΡΠ°Π½ΡΡΡΡ ΡΡΡΠΎΠΊΠΎΠ²ΡΠ΅ Π»ΠΈΡΠ΅ΡΠ°Π»Ρ ΠΈ ΠΏΡΡΡΡΠ΅, Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΈΠ»ΠΈ sallot, ΡΡΠ΅ΠΉΠΊΠΈ.
ΠΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· 2-Ρ ΡΡΡΠΊΠΎΠ², ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄ Ρ ΠΏΠ°ΠΌΡΡΡΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΡΠΎΠΊ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ (ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΈ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ).
ΠΠ²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ Π·Π°ΠΏΠΈΡΠΈ/ΡΡΠ΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ· ΠΎΡΠΎΠ±ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ² (ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠΊΠΎΠ»ΠΎ Π½ΡΠ»Π΅Π²ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΏΠ°ΠΌΡΡΠΈ)
DS ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΏΡΡΠΌΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈ Π² TOS - ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΠ΅Π³ΠΈΡΡΡ, Ρ ΡΠ°Π½ΡΡΠΈΠΉ Π²Π΅ΡΡΠΈΠ½Ρ DS. ΠΠ±Π° ΡΡΡΠΊΠ°, DS ΠΈ RS, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΡΠ΅ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Ρ Π² ΠΠΠ£. ΠΠ°ΠΏΠΈΡΡ Π² DS ΠΈ RS Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈΠ· ΠΠΠ£.
Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· DS ΠΈ RS Π΄ΠΎΡΡΡΠΏΠ½Π° Ρ (stack.pop()) ΠΈ Π±Π΅Π· (stack.peek()) ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π²Π΅ΡΡΠΈΠ½Ρ.
- DS - Data Stack
- RS - Return Stack
- TOS - Top of Data Stack register
- IR.lit - ΠΎΠΏΠ΅ΡΠ°Π½Π΄ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π² IR
- PUSH (LIT)
- DS.push(TOS) | TOS <- IR.lit
- POP
- TOS <- DS.pop()
- DUP
- DS.push(TOS)
- SWAP
- RS.push(TOS) | TOS <- DS.pop()
- DS.push(RS.pop())
- FETCH
- ADR <- TOS
- TOS <- MEM.out(ADR)
- STORE
- ADR <- TOS
- MEM.in <- DS.pop()
- TOS <- DS.pop()
- ADD
- TOS <- DS.pop() + TOS
- SUB
- TOS <- DS.pop() - TOS
- MUL
- TOS <- DS.pop() * TOS
- DIV
- TOS <- DS.pop() / TOS
- MOD
- TOS <- DS.pop() % TOS
- OR
- TOS <- TOS or DS.pop()
- AND
- TOS <- TOS and DS.pop()
- EQUAL
- Z <- TOS or DS.pop()
- | IF(Z==1): TOS <- 1 | ELSE: TOS <- 0
- LESS
- NV <- DS.pop() - TOS
- | IF(N==1): *| IF(V==0): TOS <- 1 | ELSE: TOS <- 0 | ELSE: *| IF(V==1): TOS <- 1 | ELSE: TOS <- 0
- GREATEQ
- NV <- DS.pop() - TOS
- | IF(N==1): *| IF(V==1): TOS <- 1 | ELSE: TOS <- 0 | ELSE: *| IF(V==0): TOS <- 1 | ELSE: TOS <- 0
- JMPZ (ADDR)
- Z <- TOS | TOS <- DS.pop()
- | IF(Z==1): PC <- IR.lit
- JMP (ADDR)
- PC <- IR.lit
- STASH
- RS.push(TOS) | TOS <- DS.pop()
- UNSTASH
- DS.push(TOS)
- TOS <- RS.pop()
- CPSTASH //COPY STASH
- DS.push(TOS)
- TOS <- RS
- LOOP (ADDR)
-
DS.push(TOS)
-
TOS <- RS.pop()
-
Z <- (TOS + 1) - RS
-
| IF(Z==1): RS.pop() | TOS <- DS.pop()
| ELSE: RS.push(TOS + 1) | TOS <- DS.pop() | PC <- IR.lit
-
- CALL (ADDR)
- RS.push(PC) | PC <- IR.lit
- RET
- PC <- RS.pop()
- HALT
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ° forthc:
forthc.py [-s START_ADR] [-d IO_ADR] SOURCE TARGET
ΠΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ:
SOURCE ΡΠ°ΠΉΠ» Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
TARGET ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°
ΠΠΏΡΠΈΠΈ:
-s START_ADR, --start-adr START_ADR
Π°Π΄ΡΠ΅Ρ Π½Π°ΡΠ°Π»Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° (Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ PC)
-d IO_ADR, --device-adr IO_ADR
Π°Π΄ΡΠ΅Ρ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°
-
ΠΡΠ°ΠΏ - Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΎΠ²ΡΡ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΎΠ²
-
ΠΡΠ°ΠΏ - Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½ΠΎΠ²
-
ΠΡΠ°ΠΏ - ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ Π³ΡΡΠΏΠΏ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΠ° ΡΡΠΎΠΌ Π²ΠΌΠ΅ΡΡΠΎΠ² Π°Π΄ΡΠ΅ΡΠΎΠ² (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΈ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°Ρ ) ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡΡΡ "Π·Π°ΡΡΡΠΊΠΈ" - ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΡΠ°Π·Π΄Π΅Π»Π°Ρ (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΡΠ»ΠΎΠ² ΠΈ Π΄Π°Π½Π½ΡΡ )
-
ΠΡΠ°ΠΏ - Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ².
βββββββββββββββββββββββββββββββββββββββββββββββββ
β mux_tos β
β ------βΊββββββ β
β mux_stck βββDS βββββββ
ββββββββββββ β ββββββ-------- β / β
β βββββββ΄βββββΊDS ββ βββββββββ β MEM ββββββββββββ
β β β / βββββββ β TOS ββββββ€ / β β
β DATA β ββββΊRS ββ β βββββ¬ββββ β IR βββββ β ββββββββββββββ
β STACK β β βββββ β β β / β β β β β
β β β alu_l β β alu_r βββALU βββ βIR.litβ β MEMORY β
β βββββββββΌβββββ ----βΊ β β β---- ββββββ β β[26:0]β MOUT[31:0]β UNIT & β
ββββββββββββ β β β β β β ββββββββββββββββ€ CACHE β
β β ββββΌβββ ββββΌβββ βββββββ β β mrd β β
ββββββββββββ β β β βββββ β CTRL β β β ---βΊ β β
β βββββββββ β β β UNIT β ββ΄βββββββΌβ mwr β β
β β β ββ ALU ββ β² β β IR βββ ---βΊ β β
β RETURN β β ββ ββ β β ββββββββββ β β β
β STACK β βββββ β ----βΊβββββββ¬βββ¬βββ βββ΄ββ β β MIN[31:0]β β
β β ββALUββββββ€ alu_op β β βββΊβNZVβ βββββββββββββββββββΌββββββββββββΊ β
β ββββ€ / β β β ββββββ βββββ β β β β
ββββββββββββ ββPC ββββ β β β βββββ β β β
-----βΊβββββ β βββββββββββββββ΄ββ¬βββββββββββββββ΄ββΊALUββ ββββββ β ADR[26:0]β β
mux_rs β β β / ββββΊ AR ββββΌββββββββββββΊ β
ββββββββββββββ¬βββββΌβββββββββββββββββΊPC ββ ββββββ β β β
β β ββββββ------ β β β
IR ββββββββββββββ β βββββββββββββ mux_ar β β β
ββββββΊ β β mux_pc β β ββββββββββββββ
NZV β β β -----βΊββββββ β β
ββββββΊ CONTROL β β βββ βββ βIR.lit
β UNIT β β β ALU β β[26:0]
β----β β βββββ΄βββ β / β β
signalsβ β β PC ββββββ€ IR ββββββββββββββββββββββββ€
ββββββββββββββ βββββ¬βββ β / β β
β β +1 β βΌ
β βββ ββββββ CTRL
β ββββββ β UNIT
β βββ΄β
βββββββββββββββββββΊ+1β
ββββ
ΠΡΠ°ΡΠΈΠ²ΠΎ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° datapath
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ:
- NZV - ΡΠ»Π°Π³ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π²ΡΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² ΠΠΠ£
- ΠΠ° ΡΡ Π΅ΠΌΠ΅ ΡΠ°Π΄ΠΈ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ ΠΎΠΏΡΡΠ΅Π½Ρ ΡΠΈΠ³Π½Π°Π»Ρ Π·Π°ΠΌΡΠΊΠ°Π½ΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² *_latch
- Π‘ΠΈΠ³Π°Π½Π» alu_op - ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΡΠΉ, Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ
- Memory Unit ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Cache ΠΈ Memory
STCK.peek():
ββββββββββββββ mux_stck_adr = -1
stck_rd β βSTCKOUT[31:0]
-------βΊ β SRAM βββββββΊ mux_sp = X
β UNIT β
stck_wr β β sp_latch = 0
-------βΊ β 128x32 β
β β STCK.push(Y):
β βSTCKIN[31:0]
β βββββββ mux_stck_adr = SP
β β
ββββββ²ββββββββ mux_sp = +1
βADR[6:0]
β sp_latch = 1
βββ΄βββ
ββ ββ mux_stck_adr STCK.pop():
β-1/ SPβ β------------
βββ²βββ²ββ mux_stck_adr = -1
β β
ββββΌβββββββββββββββββββ mux_sp = -1
β β β
βββ΄β β ββββ β sp_latch = 1
β-1β ββββββββΊ+1ββββββ β
βββ²β β ββββ β β
β β βββΌββββΌββ mux_sp
β β β+1 / -1β β------
β β ββ ββ
β β ββββ¬βββ
βββ΄βββ΄ββ β
β SP ββββββββββββββββ
ββββββββ
ΠΡΠ°ΡΠΈΠ²ΠΎ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° ΡΡΡΠΊΠ°
βββββββββββββββββββββββββββββββ
β mux_mpc βmIR.adr
β ββββββ------- β
ββββΊmIRββ ββββββ΄ββββββ
β / β βββββββ β β
ββββββββββΊ IR βββββββΊ mPC βββ¬βββΊ mPROGRAM β
β β / β βββββββ β β β
β ββββΊ +1ββ β ββββββββββββ
β β βββββ β β² |
β β β β |
β β β β NZV | signals
β β ββββ β β |
β ββββββββββ€+1βββββββββββ β |
βββββ΄ββββ ββββ β βΌ
βIR->mPCβ
βββββ²ββββ ββββββββββββ
β β β
β IR.opcode[31:27] β β
ββββββββββββββββββββββββββββββββ€ DATAPATH β
β β
β β
ββββββββββββ
mPROGRAM
βββββββββββββββββββββββββββββββββββββββββββββββ
β β
β β² β
β | β
β | signals β
β | β
β βββββββββ β
β --βΊ βsignalsβ β
β | βββββ²ββββ β
β | β ββββββββββββ β
β | βββββ΄ββββ M.out βmPROGRAM β β
β mIR.type ----β mIR ββββββββββ€MEMORY β β
β | βββββββββ β β β
β | | β β β
β | mIR.z| βββββββ²βββββ β
β | | βmAddr β
β mJMP βΌ βΌ β β
β β------AND β--EQβ--( Z/0 ) mPC β β
β β² β² β β
β | | β
β Z can be one of NZV Z| |0 β
β depending on mInstr | | β
β β
βββββββββββββββββββββββββββββββββββββββββββββββ
ΠΡΠ°ΡΠΈΠ²ΠΎ ΠΎΡΡΠ΅Π½Π΄Π΅ΡΠ΅Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° control unit
ΠΡΡ set-associative - ΡΠΎ Π΅ΡΡΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π°Π±ΠΎΡΠ° set'ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· Π»ΠΈΠ½ΠΈΠΉ.
ΠΠΈΠ½ΠΈΠΈ ΠΈΠΌΠ΅ΡΡ dirty-Π±ΠΈΡ, Π²ΡΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΉ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 1 ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π»ΠΈΠ½ΠΈΠΈ. ΠΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ Π»Π΅Π½ΠΈΠ²ΠΎ - ΡΠΎ Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ copy-back.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ Π²ΡΡΠ΅ΡΠ½Π΅Π½ΠΈΡ PLRUm.
Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ golden test-ΠΎΠ².
ΠΠ°ΠΏΡΡΠΊ golden-ΡΠ΅ΡΡΠΎΠ²: golden_test.py
Π’Π΅ΡΡΡ:
- tests/hello.yml - ΠΠ΅ΡΠ°ΡΠ°Π΅Ρ "Hello World!" Π² stdout
- test/hello_user_name.yml - ΠΠ°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π΅ΡΡΡ ΠΈ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π΅Π³ΠΎ
- test/cat.yml - ΠΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ Π² stdin, Π΄ΠΎ ΠΈΡΡΠΎΡΠ΅Π½ΠΈΡ Π±ΡΡΠ΅ΡΠ°
- test/prob1.yml - Euler problem 1
- test/bubble_sort.yml - Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠ·ΡΡΡΠΊΠΎΠΌ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Cache'Π°
- test/factorial.yml - ΠΠΎΠ΄ΡΡΡΡ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π»Π°, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΠΈΠΉ ΡΠ΅ΠΊΡΡΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ
CI ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π²Π·ΡΡΡ ΠΈΠ· ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ.
ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ²: poetry run pytest . -v
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: poetry run pytest . -v --update-goldens
CI ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Github Action:
name: Python CI
on:
push:
branches:
- master
paths:
- ./*.py
- ./*.lock
- ./pyproject.toml
- ./tests/*
- .github/workflows/python.yaml
pull_request:
branches:
- master
paths:
- ./*.py
- ./*.lock
- ./pyproject.toml
- ./tests/*
- .github/workflows/python.yaml
defaults:
run:
working-directory: ./
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.11
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install poetry
poetry install
- name: Run tests and collect coverage
run: |
poetry run coverage run -m pytest .
poetry run coverage report -m
env:
CI: true
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.11
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install poetry
poetry install
- name: Check code formatting with Ruff
run: poetry run ruff format --check .
- name: Run Ruff linters
run: poetry run ruff check .
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΆΡΡΠ½Π°Π» ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ cat
:
$ cat ./programs/cat.f
: cat
begin
key dup dup if
emit
then
0 = until
;
cat
$ python forthc.py -d 0 -s 10 ./programs/cat.f target.out
Translated successfully. Source LoC: 8 Machine Instructions: 13
$ cat target.out
[{"opcode": "call", "operand": 12, "token": {"val": "cat", "line": 8, "num": 1}, "offset": 10},
{"opcode": "halt", "offset": 11},
{"opcode": "push", "operand": 0, "token": {"val": "key", "line": 3, "num": 1}, "offset": 12},
{"opcode": "fetch", "token": {"val": "key", "line": 3, "num": 1}, "offset": 13},
{"opcode": "duplicate", "token": {"val": "dup", "line": 3, "num": 2}, "offset": 14},
{"opcode": "duplicate", "token": {"val": "dup", "line": 3, "num": 3}, "offset": 15},
{"opcode": "jump on zero", "operand": 19, "token": {"val": "if", "line": 3, "num": 4}, "offset": 16},
{"opcode": "push", "operand": 0, "token": {"val": "emit", "line": 4, "num": 1}, "offset": 17},
{"opcode": "store", "token": {"val": "emit", "line": 4, "num": 1}, "offset": 18},
{"opcode": "push", "operand": 0, "token": {"val": "0", "line": 6, "num": 1}, "offset": 19},
{"opcode": "equal", "token": {"val": "=", "line": 6, "num": 2}, "offset": 20},
{"opcode": "jump on zero", "operand": 12, "token": {"val": "until", "line": 6, "num": 3}, "offset": 21},
{"opcode": "return", "token": {"val": ";", "line": 7, "num": 1}, "offset": 22}]
$ python machine.py -j -d 0 -s 10 -m 1024 -c 32 target.out -i "St"
[JRNL] TCK: 0 TOS: 0 ALU: 0
[JRNL] DS (LEN: 0): []...
[JRNL] RS (LEN: 0): []...
[JRNL] PC: 10 IR: {}
[JRNL] ADR: 0 MEM: 0
[JRNL] mPC: 0 mPROG: ARLatch.PC, MemSignal.MemRD
[JRNL] Prefetch finishing: 0 extra ticks
[JRNL] Cache read 10 miss for 0 extra ticks
[JRNL] Cache insert 10
[JRNL] Memory store/fetch: 10 extra ticks
[JRNL] Started PARALLEL FETCHING of 14:
[JRNL] Cache miss on lookup 14
[JRNL] Cache insert 14
[JRNL] planned finish on 22 tick:
[JRNL] In total CPU waited for 10 extra ticks
[JRNL] TCK: 11 TOS: 0 ALU: 0
[JRNL] DS (LEN: 0): []...
[JRNL] RS (LEN: 0): []...
[JRNL] PC: 10 IR: {}
[JRNL] ADR: 10 MEM: CALL 12 'cat'@8:1
[JRNL] mPC: 1 mPROG: DPSignal.IRLatch, PCLatch.PLUS1
[JRNL] TCK: 12 TOS: 0 ALU: 0
[JRNL] DS (LEN: 0): []...
[JRNL] RS (LEN: 0): []...
[JRNL] PC: 11 IR: CALL 12 'cat'@8:1
[JRNL] ADR: 10 MEM: CALL 12 'cat'@8:1
[JRNL] mPC: 2 mPROG: mPCLatch.IR
...
[JRNL] TCK: 193 TOS: 0 ALU: 0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL] PC: 13 IR: PUSH 0 'key'@3:1
[JRNL] ADR: 12 MEM: PUSH 0 'key'@3:1
[JRNL] mPC: 0 mPROG: ARLatch.PC, MemSignal.MemRD
[JRNL] Prefetch finishing: 0 extra ticks
[JRNL] Cache read 13 hit for 0 extra ticks
[JRNL] In total CPU waited for 0 extra ticks
[JRNL] TCK: 194 TOS: 0 ALU: 0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL] PC: 13 IR: PUSH 0 'key'@3:1
[JRNL] ADR: 13 MEM: FETCH 'key'@3:1
[JRNL] mPC: 1 mPROG: DPSignal.IRLatch, PCLatch.PLUS1
[JRNL] TCK: 195 TOS: 0 ALU: 0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL] PC: 14 IR: FETCH 'key'@3:1
[JRNL] ADR: 13 MEM: FETCH 'key'@3:1
[JRNL] mPC: 2 mPROG: mPCLatch.IR
[JRNL] TCK: 196 TOS: 0 ALU: 0
[JRNL] DS (LEN: 1): [0]...
[JRNL] RS (LEN: 1): [11]...
[JRNL] PC: 14 IR: FETCH 'key'@3:1
[JRNL] ADR: 13 MEM: FETCH 'key'@3:1
[JRNL] mPC: 12 mPROG: ALUop, ARLatch.ALU, MemSignal.MemRD
[JRNL] Prefetch finishing: 0 extra ticks
[WARN] Input buffer was empty on fetch!
[INFO] Cache miss rate: 8.696%
[INFO] Ticks: 197
St
[JRNL] Output Buffer: St
[JRNL] Output Buffer(ASCII codes): 83, 116
[WARN] Input buffer was empty on fetch!
[INFO] Cache miss rate: 8.696%
[INFO] Ticks: 197
St
Cache miss rate: 8.696% Ticks: 197
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:
$ poetry run pytest . -v
====================================================================================== test session starts ======================================================================================
platform win32 -- Python 3.11.5, pytest-7.4.4, pluggy-1.5.0 -- C:\Users\marin\AppData\Local\pypoetry\Cache\virtualenvs\stack-processor-ibGfME1p-py3.11\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\marin\OneDrive\Documents\ITMOStudies\Computer Architecture\stack_processor
configfile: pyproject.toml
plugins: golden-0.2.2
collected 6 items
golden_test.py::test_forthc_and_machine[tests/bubble_sort.yml] PASSED [ 16%]
golden_test.py::test_forthc_and_machine[tests/cat.yml] PASSED [ 33%]
golden_test.py::test_forthc_and_machine[tests/factorial.yml] PASSED [ 50%]
golden_test.py::test_forthc_and_machine[tests/hello.yml] PASSED [ 66%]
golden_test.py::test_forthc_and_machine[tests/hello_user_name.yml] PASSED [ 83%]
golden_test.py::test_forthc_and_machine[tests/prob1.yml] PASSED [100%]
============================================================================== 6 passed in 145.76s (0:02:25) ==============================================================================
$ poetry run ruff check .
$ poetry run ruff format .
10 files left unchanged