2010年6月23日 星期三

第一隻 Brain Fuck 程式

所有程式語言遍歷一次,是我的夢想。

LISP, COBOL, Fortran, Pascal,無聊的時候都有拿來玩過,不求精,有 Hello World 就好。

在軍中有幸見識到迪吉多 1988 年出產的 VAX6000 ,還用它寫過  PL/I

這台高貴不貴的電冰箱…不是,這台性能強大的工作站,可是當資訊兵 7、8 個月天天在碰的東西。

第一次看到兩台跟 UPS 一樣大的硬碟,驚訝程度可想而知...它的腳本語言也是十分怪異,有點像 bash 混合 MSDOS。不過工作需求,我竟然還把它玩精了。

這玩意很 high,處理個 3MB 的 txt 檔,包括解密,比對項目 db 到印出報表要 8 小時,常常整天龜在資訊室就是弄這 shit。




後來一個不爽,用 .NET 改寫整個 flow 才花 15 秒就做完原本三天份的量,剩下 7 小時 59 分鐘就拿來打茫,這又是後話了...

啊啊!! 離題太遠,回到 Brain Fuck。這玩意超級恐怖,果然不負其名,光是寫個小小的 Hi! Matt 就快把我的 Brain 給 Fuck 了。不過它的優點是很原始,很野性,指標和位址的移動,有種 asm 的直觀爽感,而且符合圖靈完全思維…閒話不多說,來看 code:
+++++ +++++
[
  > +++
  > +++++ ++
  > +++++ ++++
  > +++++ +++++
  > +++++ +++++ +
  <<<<< -
]
>> ++.
>> +++++.
<<< +++.
>+. 
< +++++ +.
>>> ++++.
<<< ----- --.
> ++++.
> +++++ ++.
>> +++++ +.
  .
<<<< +.

連成一條龍也不是不行,不過那個太刻意 fuck 了,這樣就夠 fuck 。
換成 c code:

unsigned char arr[30000] = {0};
*arr = 10; 

while (*arr) {
  *(arr + 1) += 3;
  *(arr + 2) += 7;
  *(arr + 3) += 9;
  *(arr + 4) += 10;
  *(arr + 5) += 11;
  *arr-=1;
} 

putchar (*(arr + 2) += 2);
putchar ((*(arr + 4) += 5));
putchar ((*(arr + 1) += 3));
putchar (++*(arr + 2));
putchar ((*(arr + 1) += 6));
putchar ((*(arr + 4) += 4));
putchar ((*(arr + 1) -= 7));
putchar ((*(arr + 2) += 4));
putchar ((*(arr + 3) += 7));
putchar ((*(arr + 5) += 6));
putchar (*(arr + 5));
putchar ((*(arr + 1) += 1));

或許你會問:有 compiler 嗎?
別說 compiler,連 IDE 都有!!

可在這邊下載 4mhz.de/bfdev.html

最後還是想說一句…雖然忙,該玩的東西還是要玩一下的...

沒有留言:

張貼留言