February 13, 2008

C 語言的 trigraph/digraph

身為「慣 C」迷,喔,我是說「天習C 語言」者,每每在拜讀 Linux kernel 原始程式碼後,都能感受將 C 語言發揮得淋漓盡致的美妙,無怪乎,Linus Torvalds 本人就說 [Stick to C for kernel coding],端看用 C 語言實做 OOP、garbage collector、mixin、... 等高級特性,令人大呼過癮與打從心底的讚嘆。

不過,今天要談的 C trigraph 卻是基於歷史因素的產物,看看以下程式碼: (trigraph.c)
??=include <stdio.h>
%:include <stdlib.h>
 
int main(int argc, char *argv<::>) ??<
    char msg??(:> = {'O', 'r', 'z'??>;
    printf("Hello world!??/n");
    return 0;
%>
這是貨真價實的 C99 合法程式,編譯並執行看看:
    $ gcc --std c99 trigraph.c
    $ ./a.out
    Hello world!
以上展示了 Trigraph (ANSI C) 與 Digraph (C99 規範),此乃一種特別的表示法。依據執行的結果,我們可以推論置於 "include" 之前的 "??=" 與 "%:" 都表示 '#' 字元,為何如此設計呢?我們得思量 C 語言發明的年代,也就是 1970 年代,儲存與運算設備都相當匱乏,1972 年 ISO 標準 ISO 646 被提出,以 7-bit 編碼表示字元,但缺乏九個 C 語言所需的字元,也就是 '#'、'\'、'^'、'['、']'、'|'、'{'、'}',以及 '~'。儘管在後續的資訊系統已著手修正,但總得克服透過終端機連線到 Unix 主機時,鍵盤上的字元可能會闕漏以上九個字元 (早期依據 ISO 646 標準去設計) 而無法 coding 的窘境,所以 ANSI C 委員會就提出「以三個字元構成的 trigraph」來表示上述字元的語法,到了C99,除了予以納入外,還提出修正性的 digraph,也就是簡化為「以兩個字元構成的 digraph」來表示之中五個字元,詳情可參考 wikipedia [C trigraph]。

話說,「慣 C」迷如我,好像也很喜歡偷窺,至少是偷窺 C99 spec 啦 *笑*
由 jserv 發表於 February 13, 2008 05:32 PM
迴響

酷捏

cclien 發表於 February 13, 2008 07:20 PM

在工作的中遇到這種東西會讓人笑不出來

小影 發表於 February 13, 2008 10:45 PM

如果要離職就應該寫這種 Code # flee~~~~

richliu 發表於 February 14, 2008 12:52 AM

C语言的mixin是怎样的?

bamanzi 發表於 February 15, 2008 01:02 PM
發表迴響









記住我的資訊?