「Hello World」是程序員的入門禮,但在極客手中卻能演繹出令人嘆為觀止的藝術品。本文解析六個變態版本,從 C 預處理器濫用、指針算術、Goto 狀態機、遞歸主函數、位運算編碼,到圖靈完備的 Brainfuck 語言,展示計算本質的多重面相。
#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include
_____
層層宏定義構建語法骨架,最終 _____ 展開為完整 main(){ putchar(0x48)... }。展示預處理器的圖靈完備性(雖非設計初衷)。
int x=0, y[14], *z=&y;
*(z++)=0x48; *(z++)=y[x++]+0x1D; ... // 利用已寫入值計算下一字符
x=*(--z);
while(y[x]!=NULL) putchar(y[x++]);
巧妙利用數組自身作為查表表,通過差分編碼生成 "Hello, World!",最後反向遍歷輸出。無顯式字符串字面量。
#define __(a) goto a;
#define ___(a) putchar(a);
#define _(a,b) ___(a) __(b);
main() { _:__(t) a:_('r',g) b:_('$',p) ... z:___(0x0) }
將每個字符輸出建模為狀態,goto 驅動狀態轉移。宏將代碼壓縮為狀態轉移表,極具自動機理論美感。
int n[]={0x48,0x65,...,0x0A,0x00}, *m=n;
main(n){ putchar(*m)!= '\0' ? main(m++) : exit(n++); }
利用 main 遞歸遍歷數組,n 參數作為遞歸深度計數器(未實際使用),m 全局指針推進。展示 C 允許遞歸調用 main(C++ 禁用)。
所有字符 ASCII 碼均由 1<<1 (即 2) 的組合通過加減乘除移位構造,無任何字面常數。展示「從零構建常數」的極致邏輯。
僅用 ++/-- 操作 int i,通過海量前綴/後綴運算將 i 逐步變為目標 ASCII 碼,_(expr) 宏調用 putchar(i)。需 C++ 編譯器 (g++) 支持運算符重載解析。
僅 8 指令:>< < + - . , [ ],對應指針移動、增減、輸入輸出、循環。
Hello World 程序:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
50 行 ANSI C 解釋器 完整實現,展示「最小指令集也能構建通用計算」的理論基石。
HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE。這些「變態」程序不僅是技術炫技,更是對計算模型、語言設計、編譯原理的深度探索。它們提醒我們:語法糖之下,是圖靈機的萬變不離其宗。保持好奇,偶爾寫寫「無用」代碼,或能觸摸到計算的本質之美。