Github 上的大神 Yusuke Endoh 近日发布了一个 Ruby 程序,它执行以后生成一个 Scala 程序。执行这个 Scala 程序以后会生成一个 Scheme 程序,执行这个 Scheme 程序以后会生成一个 Shell(bash)脚本,执行这个 bash 脚本……历经 50 次执行以后,最后那个 REXX 程序会再次生成和初始状态一模一样的 Ruby 程序。整个过程见下图。
想要编译这个程序,先要安装一大堆编译器(作者在 Ubuntu 13.04 下测试通过):
1 2 3 4 5 6 |
sudo apt-get install algol68g bash beef boo clisp clojure1.4 coffeescript f2c fp-compiler g++ gauche gawk gcc gforth gfortran ghc gnat gnu-smalltalk gobjc golang groovy icont intercal iverilog jasmin-sable llvm lua5.2 make mono-devel mono-mcs nodejs ocaml octave open-cobol openjdk-6-jdk parrot perl php5-cli pike7.8 python r-base regina-rexx ruby1.9.3 scala swi-prolog tcc tcl8.5 ucblogo valac |
接着在这里下载这个很漂亮(注意到和前面那张图片一样的图形了吗?)的程序代码。
然后就是激动人心的时刻:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
ruby QR.rb > QR.scala scalac QR.scala && scala QR > QR.scm $(SCHEME) 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 logo QR.logo > QR.lua lua QR.lua > QR.makefile make -f QR.makefile > QR.il ilasm QR.il && mono QR.exe > QR.js $(NODE) 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 |
不信?自己试试这个。
1 |
diff QR.rb QR2.rb |
详细内容以及在其它平台上的运行方法,参见该项目的 Github 页面。
PS:这是开学前最后一篇文章了。明天开学,祝自己好运。
确实够狠。