算你狠:让50种程序设计语言们绕个圈

Github 上的大神 Yusuke Endoh 近日发布了一个 Ruby 程序,它执行以后生成一个 Scala 程序。执行这个 Scala 程序以后会生成一个 Scheme 程序,执行这个 Scheme 程序以后会生成一个 Shell(bash)脚本,执行这个 bash 脚本……历经 50 次执行以后,最后那个 REXX 程序会再次生成和初始状态一模一样的 Ruby 程序。整个过程见下图。


想要编译这个程序,先要安装一大堆编译器(作者在 Ubuntu 13.04 下测试通过):

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

接着在这里下载这个很漂亮(注意到和前面那张图片一样的图形了吗?)的程序代码。

然后就是激动人心的时刻:

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

不信?自己试试这个。

diff QR.rb QR2.rb

详细内容以及在其它平台上的运行方法,参见该项目的 Github 页面

PS:这是开学前最后一篇文章了。明天开学,祝自己好运。

1 thought on “算你狠:让50种程序设计语言们绕个圈

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据