プログラミングとバージョン管理は切っても切り離せないものです。それは開発者であれば誰しもが納得するでしょう。しかし、プログラミングとバージョン管理を一つにして、学習すべき要素を減らしてしまおうという発想はなかなか出てこないはずです。 それを実現してしまったのがlegitです。何を言っているのかよく分からないと思いますが、ぜひご覧ください。

legitの使い方

例です。例えば以下のコードはHello worldを出力します。しかしこのディレクトリにはGitリポジトリがあるだけで、中身は何もありません。

$ ruby interpreter.rb examples/hello/
Hello world

ディレクトリでログを見たところです。怪しくHello worldだのputだのといった文字が見えます。

$ git plog --graph
* 8f56f0b 2019-05-14 11:11:52 +0900 "Hello world\n"  (HEAD -> master) [Atsushi]
*   60914b1 2019-05-14 11:11:52 +0900 dup  (tag: reverse-loop) [Atsushi]
|\  
| * 91c8adb 2019-05-14 11:11:52 +0900 write 1 left [reverse-loop]  [Atsushi]
*   35a1a29 2019-05-14 11:11:52 +0900 1 right read dup  (tag: print-loop) [Atsushi]
|\  
| * 593c6d9 2019-05-14 11:11:52 +0900 put [print-loop]  [Atsushi]
* b35e95b 2019-05-14 11:11:52 +0900 quit  [Atsushi]

さらにコードとして出力し、さらにそれをコンパイルして実行もできます。

$ ruby compiler.rb examples/hello/
$ clang -O3 hello.ll -o hello
$ ./hello 
Hello world

入力を受け付ける例です。これもGitのログでコードを確認できます。

$ git plog --graph
*   0cef7f2 2019-05-14 11:11:39 +0900 get dup  (HEAD -> master, tag: loop) [Atsushi]
|\  
| *   651b1c7 2019-05-14 11:11:39 +0900 dup "A" 1 sub cmp  [Atsushi]
| |\  
| | *   9755518 2019-05-14 11:11:39 +0900 dup "M" cmp  [Atsushi]
| | |\  
| | | *   018d2b9 2019-05-14 11:11:39 +0900 dup "Z" cmp  [Atsushi]
| | | |\  
| | | | *   aa3d739 2019-05-14 11:11:39 +0900 dup "a" 1 sub cmp  [Atsushi]
| | | | |\  
| | |_|/ /  
| |/| | |   
| | | | *   42c887a 2019-05-14 11:11:39 +0900 dup "m" cmp  [Atsushi]
| | | | |\  
| | | |/ /  
| | |/| |   
| | | | *   8427b4b 2019-05-14 11:11:39 +0900 dup "z" cmp  [Atsushi]
| | | | |\  
| | | |/ /  
| | |_| /   
| |/| |     
| | | * 9a7ba07 2019-05-14 11:11:39 +0900 13 sub  [Atsushi]
| | |/  
| |/|   
| | * e6f24f5 2019-05-14 11:11:39 +0900 13 add  [Atsushi]
| |/  
| * 7ce8fb4 2019-05-14 11:11:39 +0900 put [loop]  [Atsushi]
* 55d5b96 2019-05-14 11:11:39 +0900 quit  [Atsushi]

実行すると、標準入力を受け取って、変換して出力します。

$ ruby interpreter.rb examples/rot13
Hello
Uryyb
MOONGIFT
ZBBATVSG

legitはGitのログ、それ自体がプログラミングになっています。そしてRubyで作られたコードを通して実行したり、ファイルに変換できます。開発はもちろん、デバッグも非常に大変な気がします。世の中には面白い発想をする方もいるものです。

legitはRuby製のソフトウェア(ソースコードは公開されていますがライセンスは明記されていません)です。

blinry/legit: An esoteric programming language where programs are defined by the graph of commits in a Git repository.