Stacky is a simple stack-oriented programming language
Stackyはスタックマシンの学習目的で設計された、スタック指向のシンプルなプログラミング言語です。一般的なスタックマシンに基づく明快な構文を備え、実際にコードを書きながらその動作原理を学ぶことができるようになっています。
Web上で動作するStacky Playgroundから簡単に試すことができます。
また、REPLや.stackyファイルを実行するためのCLIツールをcargoからインストールできます。
$ cargo install stacky-cliまずは以下のコードを実行してみましょう。
; hello.stacky
push "hello, world!"
println
Stacky Playgroundの場合はRunボタンを押してコードを実行します。CLIの場合は以下のコマンドを実行します。
stacky hello.stacky
コードを実行するとhello, world!という文字列が出力されるはずです。
Stacky言語はさまざまな命令をサポートしています。もう少し複雑な例を見てみましょう。
; let i = 0
push 0
store i
start:
; i++
load i
push 1
add
store i
; if i == 100 return
load i
push 100
eq
br end
; if i % 15 == 0
load i
push 15
mod
push 0
eq
br fizz_buzz
; if i % 3 == 0
load i
push 3
mod
push 0
eq
br fizz
; if i % 5 == 0
load i
push 5
mod
push 0
eq
br buzz
goto other
fizz_buzz:
println "fizz buzz"
goto start
fizz:
println "fizz"
goto start
buzz:
println "buzz"
goto start
other:
load i
println
goto start
end:
Stackyは行単位でコードを解釈します。各行には1つのコマンドまたはラベルを記述できます。
push 1
push 2
add
println
コメントは;で記述します。
; this is comment
push "comment"
println
Stackyの値は以下のいずれかの型を持ちます。
- nil
- int
- float
- string
- bool
これらの値はpushコマンドでスタックに積むことができます。
push nil
push 10
push 1.2
push "foo"
push true
store/loadコマンドを用いることで、スタックとは独立したレジスタに値を保存することが可能です。
; i = 2
push 2
store i
; println(i + 3)
load i
push 3
add
println
ラベルとgotoコマンドを利用することで、プログラムの制御を移動することができます。ラベルはlabel:で定義できます。
goto label
push "unreachable"
println
label:
また、brコマンドを利用することで、スタックのトップがtrueである場合にのみ、ラベルへの移動を実行することができます。
; a = 1
push 1
store a
; b = 2
push 2
store b
; a == b
load a
load b
eq
br then
goto else
then:
println "a is equal to b"
goto end
else:
println "a is not equal to b"
goto end
end:
コマンドはデフォルトで引数をスタックからポップします。
; println "hello"
push "hello"
println
; 1 + 2
push 1
push 2
add
引数が定数である場合、これをインラインで記述することが可能です。
push "hello"
add 1 2
このリポジトリはMIT Licenseの下で公開されています。
