「自分自身を出力する REXX プログラムを出力する Python プログラムを出力する R プログラムを出力する (...略...) を出力する Scala プログラムを出力する Ruby プログラム」を実現した「Quine リレー」が公開されています(Github、Hacker News)。
Quineとは、自身のソースコードと完全に同じ文字列を出力するプログラム。Quine リレーはこれを言語を変えつつ循環させ、最終的に元のRubyスクリプトと同じものが出力されるように作られたプログラムということ。
これはスゴイ
Githubの説明によると、Quine リレーは以下のように実行します。開始はQR.rb。でここからQR.scalaを生成します。以下続行し…。
$ ruby QR.rb > QR.scala $ scalac QR.scala && scala QR > QR.scm $ gosh QR.scm > QR.bash $ bash QR.bash > QR.st $ gst QR.st > QR.tcl $ tclsh QR.tcl > QR.unl $ ruby unlambda.rb QR.unl > QR.vala $ valac QR.vala && ./QR > QR.v $ iverilog -o QR QR.v && ./QR -vcd-none > QR.ws $ ruby whitespace.rb QR.ws > qr.adb $ gnatmake qr.adb && ./qr > QR.a68 $ a68g QR.a68 > QR.awk $ awk -f QR.awk > QR.boo $ booi QR.boo > QR.bf $ beef QR.bf > QR.c $ gcc -o QR QR.c && ./QR > QR.cpp $ g++ -o QR QR.cpp && ./QR > QR.cs $ mcs QR.cs && mono QR.exe > QR.clj $ clojure QR.clj > QR.cob $ cobc -x QR.cob && ./QR > QR.coffee $ coffee QR.coffee > QR.lisp $ clisp QR.lisp > QR.fs $ gforth QR.fs > QR.f $ f2c QR.f && tcc -o QR QR.c -L/usr/lib -lf2c && ./QR > QR.f90 $ gfortran -o QR QR.f90 && ./QR > QR.go $ go run QR.go > QR.groovy $ groovy QR.groovy > QR.hs $ runghc QR.hs > QR.icn $ icont -s QR.icn && ./QR > QR.i $ CC=tcc ick -b QR.i && ./QR > QR.j $ jasmin QR.j && java QR > QR.java $ javac QR.java && java QR > QR.ll $ llvm-as QR.ll && lli QR.bc > QR.logo $ ucblogo QR.logo > QR.lua $ lua QR.lua > QR.makefile $ make -f QR.makefile > QR.il $ ilasm QR.il && mono QR.exe > QR.js $ nodejs QR.js > QR.m $ gcc -o QR QR.m && ./QR > QR.ml $ ocaml QR.ml > QR.octave $ octave -qf QR.octave > QR.pasm $ parrot QR.pasm > QR.pas $ fpc QR.pas && ./QR > QR.pl $ perl QR.pl > QR.php $ php QR.php > QR.pike $ pike QR.pike > QR.prolog $ swipl -q -t qr -f QR.prolog > QR.py $ python QR.py > QR.R $ R --slave < QR.R > QR.rexx $ rexx ./QR.rexx > QR2.rb
最終的に、QR2.rbが生成されます。これだけのステップを踏んで最初のQR.rbとQR2.rbが全く同じになっているというのだからスゴイです(汗。
実際にこれだけの言語処理系をインストールするのはかなり大変なので作者の方は「debootstrap + chroot」の使用を推薦しています。さらに簡単に済ませたい場合HackerNewsで生成されたファイルをアップしている人がいました。
QR.rbです。模様が。