“hello, world!” 與浦島太郎
在日本民間故事《浦島太郎》(Urashima Taro) 裡,因好心救了落難的海龜,而被邀請入龍宮一遊的浦島太郎,渾然不知在龍宮的一晝夜間,陸上的世界已經悠悠過了三百年。在上岸前,龍宮公主給了太郎一個盒子,做為給太郎的紀念。太郎上岸後,打開了盒子,突然間,太郎從一位身強體壯的捕魚少年,變成了一位白髮蒼蒼的老人。
我最近就碰上了一件可以稱得上是浦島太郎般的事。
前一陣子我下載了新版的MinGW。這是一套奠基在 gcc (GNU C Compiler)、供Windows環境使用的C/C++編譯器。我好些年前就用過這套東西,用以取代先前流行的 djgpp。
拿到新的編譯程式,想當然而,一定要拿個什麼程式來測試。拿什麼好呢?我的習慣還停留在寫一個 "hello, world!"。
然而,C++版的 "hello, world",竟然無法在新版的MinGW上編譯了。滿篇我完全看不懂的編譯時期錯誤,從我的 stdout
(就是命令列模式的螢幕啦)上傾洩而出。
我發現,世界變了。
好心的朋友跟我說,不不,程式已經不是這樣寫的了。"hello, world" 的現代版應該是長成這個樣子的:
01: #include <iostream> 02: using namespace std; 03: int main() 04: { 05: cout << "hello, world!" << endl; 06: return 0; 07: }
為了解釋方便,每行程式前面我加上了行號。首先,iostream.h
消失了,取而代之的是不需要 .h
的形式。02行的namespace
是新東西。雖然我好些年前就已經聽聞,沒想到已經是正式的標準了。而且,最重要的是──沒有這第02行的「使用命名空間」指令,第05行的 cout
物件,編譯器是不認的!
「你難道不知道嗎?自從STL (Standard Template Library) 成為標準後,由於太多人使用相同的名字,命名空間被用光了,所以才會把 iostream
的東西放 std
命名空間裡呀!」好心的朋友是這樣跟我解釋的。
我覺得不可思議。
以前覺得有些事情是不會變的。沒有想到連教科書上做為C++語言的第一個範例,那個被認為應該是恆久不變的入門教材,新版的編譯器竟然不認了。兒童相見不相識,怒問客人的code是從哪個時代弄來的,滿紙荒唐。
這個時候我才突然想到,我不再碰觸任何跟程式有關的東西,讓我算算…… 從1994年到現在,正好整整十年的時間。
十年了。我最後一個還需要用到 makefile
的「計劃」,是整整十年前的事情了。在這之間,雖然偶爾還會從堆滿灰塵的 .zip
檔中,挖出舊的程式和編譯器,玩弄一些小東西,但大體上來說我是遠離了寫程式的世界。完完全全地遠離了。
如今,連最簡單的程式,面貌都變了。而我,像是浦島太郎那般,打開了MinGW的盒子,發現自己從當時一個高中快畢業的小毛頭,來到了現在這個奇異的階段。
十年可以改變的事情很多。Linux成熟了,而「正義的味方」不再只有gcc,還多出了Perl、PHP、Python等所謂的 "3P"。中土世界因為Java而多了許多不必要的困擾。至於「黑暗料理界」則多出了ASP、C# (唸做 "C Sharp")、.net,以及在它們之前,每一兩年就新推出、被人大似吹捧的新資料庫存取模型(族繁不及備載)。十年前大家都還在用榆樹 (elm)、松樹 (pine) 在閱讀電子郵件,如今只剩下極少數的人沒被「外觀快遞」給收服。這樣的事還有太多太多。更不用提那些十年來起起落落的火燄舌戰,以及依然有效的摩爾定律。可以確定的是:雖然正義的味方越來越茁壯,但人們卻還沒有看到黑暗料理界倒台的可能 [1]。
我把我的故事說給了 ilya 聽。他說:「能夠自廢武功到你這種程度,也真算是不容易了。」
是啊。
ilya問我當初為什麼做了那樣的選擇,我說那是個難回答的問題。難回答,不是說答不出來,而是那是個需要花時間說明白的過程。而那過程實在是太私人了。叨叨絮絮的成份多,虛妄、愚昧、無力、嘔吐(存在主義式的)的經歷也有。總之我目前都還不認為那是個我有能力處理(而你可能有興趣想聽)的故事。至少在我明白那整個過程的意義之前是如此。
但,不管怎麼說,在看似感傷的敘事線後,最近我倒是有了新的啟示:就在我慢慢恢復、或者說重新點燃了對電腦和技術世界的胃口後,我突然發現像我這樣一個全無武功(或者誠實地講是武功全無,後面這個用法預設了「先前有武功、後來卻丟失」的前提)的人,竟然對著各種新奇的東西充滿了好奇和興趣。我簡直,如新手般,墜入了科技眩目的世界中:
Miranda [2]: O Wonder!
How many goodly creatures are there here!
How beauteous mankind is! O brave new world!
That has such people in’t! (Shakespeare, The Tempest, 5.I)
米蘭達:「人類多麼地美!啊!美麗的新世界,有這樣的人在裡頭!」
(莎士比亞,《暴風雨》,第5幕第1景)[3]
附註
- 誰知道呢?當年某個為錢眼開的傢伙,他如果當時把做為DOS前身的程式碼丟進毀滅之山,那麼一切可能早就結束了。
- 做為某種令人不安 (uncanny; unheimlich) 的巧合,我的第一台notebook就叫Miranda。
- 中譯是從http://www.bwmc.org.tw/Tfr/tfr_02/tfr-02-01.htm找來的。
lukhnos :: Feb.29.2004 :: tekhnologia 技術或者藝術 :: 8 Comments »
8 Responses to ““hello, world!” 與浦島太郎”
雖然我並沒有龍宮一遊,上次寫 C 程式大概也是將近八年前的事情了(印象中並沒有寫過除了玩弄 cout 之外的 C++ 程式)。因此讀到這篇文章我也驚駭不已。這,怎麼會改了呢?怎麼可以改呢?這是標準耶,標準改了,不是跟公分長度變了一樣駭人的事情嗎?
不過也好。luki 要不要乾脆就來投靠函數語言陣營呀? :)
有點好奇想知道 C++ 到底被用得多廣。我從沒編譯安裝過 C++ 寫的程式。以往都是 C, 近來出現一些 Java 程式,連 ML 都有。就是沒有 C++。於是在我的印象中,C++ 是個龐大、生不逢時、處境尷尬的怪物。這樣的印象不知合不合實情。畢竟我很久沒接觸學校外面的東西了。稍微搜尋一下的結果,似乎 C++ 與 Java 的程式設計師需求量大致打平,後者稍多一點。
luki 知道排球規則改了嗎?老消息了,只要落地就得分,沒有先搶到發球權才能得分的事情了。我直到 03 年才知道這事情。那是看同學和敵對校比賽時,覺得看不懂比賽,一問之下才被嚇了一大跳。怎麼可以改呢?改了就不是排球了呀!我同學們大約也嚇了一跳,想不到世上有這種稀有的活化石。
經你一提,我才發現確實難以想像如果當年 DOS 沒給 The Enemy 這樣騙去,世界會是什麼樣子。會是 CP/M 嗎?IBM 衰弱之後的反派角色該給誰演?沒有敵人,這故事怎麼演得下去呢?
從 1984 年到 1994 年,過了十年。
從 1994 年到 2004 年,又過了十年。
沒關係,你現在已經可以用 Python + Tkinter (內建) 在 Mac OS X 上寫漂漂的 GUI, 然後還能跨平台在 Linux 上用…
又,另一個好用、大家都在用的是 mutt .
http://www.mutt.org
“All mail clients suck. This one just sucks less.” -me, circa 1995
OS X 內附的 Python 的 Tkinter 好像少了 _tkinter.so. 只有 fink 的 tkinter 是全的。
看到iostream也嚇一跳,我學的也是iostream.h。唔,好像是1996年的事(默)。反正現在也是幾乎甚麼都不寫了。
mutt處理Big5跟utf8信件時不太行,有點討厭。看到有人寫elm真是眼睛一亮!
進入 STL 之後被拿掉 .h 尾巴的那些… 其實有很多 compiler 還是吃;還有更多更多語言規格方面的實作,不必換平台,只要換廠牌就搞死你。對現在還是會用到 C++ 的我來說,那真是件讓人萬分討厭的事… (這也是一種”There’s more than one way to do it?”)
Java 挑起了許多乾脆令起爐灶革命之的風潮,不過現在 C# 跑得更遠了…
然而,這一切的一切… 總是有人要去做。
好多好多的 SDK,還是連 ++ 都沒有的 C 啊!*泣*
對了,再囉嗦一次,要是對「如果當年某某某沒有怎樣怎樣,今天的世界會如何如何?」這種事感興趣,可以找 Philip K. Dick 的《High Castle Man》來看看,請洽各大 p2p 軟體。:p
我正在學:D
Bloodshed Dev-C++ 非常好用,又是自由軟體。