2024-12-17: DAY 17 - Oak (Quine AC 2024)
DAY 17
Oakというプログラミング言語があります。
Rustっぽい文法ですが、17種類の命令を持つIRを介して、C言語やGo言語のバックエンドでコンパイルできる言語のようです。
スタックマシンっぽい命令です。これで何でもコンパイルするのは流石に効率が悪いのではないか?
標準ライブラリがちょっと足りてない感じがします。
Quineはputstr
とputchar
はあったのでそれで書きました。
for
文が微妙に不便で初期化部分を省けないので、適当な文を置いておきました。
#[std]
fn main() {
let s = "#[std]
fn main() {
let s = %;
let i = 0;
for (i = 0; s[i] != '%'; i = i + 1) {
putchar(s[i]);
}
putchar(34 as char);
putstr(s);
putchar(34 as char);
for (i = i + 1; s[i] != (0 as char); i = i + 1) {
putchar(s[i]);
}
}
";
let i = 0;
for (i = 0; s[i] != '%'; i = i + 1) {
putchar(s[i]);
}
putchar(34 as char);
putstr(s);
putchar(34 as char);
for (i = i + 1; s[i] != (0 as char); i = i + 1) {
putchar(s[i]);
}
}
拡張子は .ok
みたいです。
コンパイルすると main
という実行ファイルができるので、それを実行します。
$ oak c quine.ok && ./main | diff quine.ok -
ちなみに oak -g c
とするとGo言語バックエンドでコンパイルされるみたいです。