スタックマシンなプログラミング言語『Stacky』を作った
ふと思い立ってこんなプログラミング言語を作りました、という紹介です。
どんな言語?
スタックマシンをベースとした超シンプルなプログラミング言語です。詳しくはコードを見た方が早いでしょう。
; println("hello, world!")
push "hello, world"
println
; println(1 + 2)
push 1
push 2
add
println
見ての通り、単一のスタックに対して操作を行う典型的なスタックマシンです。
もちろん、goto
やbr
もあるので、繰り返しや条件分岐も(少し頑張れば)実装できます。これでFizzBuzzを実装するとこんな感じ。
; 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:
一応スタックとは別にレジスタをload
/store
で操作できるので、そこまで複雑にはならずに済みます。とはいえif
やwhile
なんて高級で贅沢なものはないので、全てgoto
とbr
でどうにかしていきましょう。
といった感じで実用性は特にないですが、スタックマシンの仕組みを学ぶにはいいんじゃないでしょうか。あと、これでコードゴルフとかやったら楽しいかも。
Playground
後述するCLIをツールを入れればローカルでも動かせますが、軽く試すことができるようにブラウザで動くPlaygroundを用意しました。
こんな感じでコードを書くことができます。
とにかくMonaco Editorが偉い。めっちゃ簡単にこういうコードエディタが作れます。
VSCode拡張
今回なぜかLSP実装とVSCode拡張が用意されています。
これを入れることで、シンタックスハイライトが表示されたり、補完を効かせながらコードを書くことができます。ただし、これを動作させるには事前にcargoからstacky-lspをインストールしておく必要があります。
$ cargo install stacky-lsp
CLIツール
そしてなぜかCLIツールとREPLがあります。
$ cargo install stacky-cli
REPLは実行ごとにスタックの状態が確認できるほか、シンタックスハイライトもちゃんと効いたりします。
まとめ
以上、Stacky言語の紹介でした。最初はGrok Code Fast 1が無料だったから試しに何か作ってみるか〜というきっかけで作り始めたのですが、気づいたらなぜか思ったより凝ったものが出来てしまったという...
一応今はちゃんと実用的なスクリプト言語の開発も進めているので、LSPやらVSCode拡張やら、その辺りの練習になったのは良かったかなーと。VSCode拡張、思ったより簡単にリリースできるんだなあ。
というわけで、特に役に立つかと言われると微妙なところではありますが、是非是非遊んでみてください。
Discussion