📚

スタックマシンなプログラミング言語『Stacky』を作った

に公開

ふと思い立ってこんなプログラミング言語を作りました、という紹介です。

https://github.com/stacky-language/stacky

どんな言語?

スタックマシンをベースとした超シンプルなプログラミング言語です。詳しくはコードを見た方が早いでしょう。

; println("hello, world!")
push "hello, world"
println

; println(1 + 2)
push 1
push 2
add
println

見ての通り、単一のスタックに対して操作を行う典型的なスタックマシンです。

もちろん、gotobrもあるので、繰り返しや条件分岐も(少し頑張れば)実装できます。これで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で操作できるので、そこまで複雑にはならずに済みます。とはいえifwhileなんて高級で贅沢なものはないので、全てgotobrでどうにかしていきましょう。

といった感じで実用性は特にないですが、スタックマシンの仕組みを学ぶにはいいんじゃないでしょうか。あと、これでコードゴルフとかやったら楽しいかも。

Playground

後述するCLIをツールを入れればローカルでも動かせますが、軽く試すことができるようにブラウザで動くPlaygroundを用意しました。

https://stacky-language.github.io/playground/

こんな感じでコードを書くことができます。

とにかくMonaco Editorが偉い。めっちゃ簡単にこういうコードエディタが作れます。

VSCode拡張

今回なぜかLSP実装とVSCode拡張が用意されています。

https://marketplace.visualstudio.com/items?itemName=nuskey8.vscode-stacky

これを入れることで、シンタックスハイライトが表示されたり、補完を効かせながらコードを書くことができます。ただし、これを動作させるには事前にcargoからstacky-lspをインストールしておく必要があります。

$ cargo install stacky-lsp

CLIツール

そしてなぜかCLIツールとREPLがあります。

$ cargo install stacky-cli

REPLは実行ごとにスタックの状態が確認できるほか、シンタックスハイライトもちゃんと効いたりします。

まとめ

以上、Stacky言語の紹介でした。最初はGrok Code Fast 1が無料だったから試しに何か作ってみるか〜というきっかけで作り始めたのですが、気づいたらなぜか思ったより凝ったものが出来てしまったという...

一応今はちゃんと実用的なスクリプト言語の開発も進めているので、LSPやらVSCode拡張やら、その辺りの練習になったのは良かったかなーと。VSCode拡張、思ったより簡単にリリースできるんだなあ。

というわけで、特に役に立つかと言われると微妙なところではありますが、是非是非遊んでみてください。

Discussion