第(1/3)頁(yè) 而這么長(zhǎng)的時(shí)間里面,葉新晨也是在解決上面這個(gè)bug的嘗試中,才發(fā)覺(jué)tcl這種語(yǔ)言先天不足。 因?yàn)橐坏┏绦蜻壿嫃?fù)雜,它那變量無(wú)需聲明、變量無(wú)類(lèi)型等等對(duì)初學(xué)者來(lái)說(shuō)不可多得的“優(yōu)點(diǎn)”就成了致命缺陷。 這會(huì)讓人不得不付出比c/c++之類(lèi)“正規(guī)語(yǔ)言”多得多的努力去跟蹤去區(qū)分?jǐn)?shù)據(jù)類(lèi)型。 而且為了避免錯(cuò)誤,葉新晨也不得不把數(shù)據(jù)類(lèi)型也“打包”進(jìn)數(shù)據(jù),然后在程序入口寫(xiě)代碼分辨它——尤其是,這些數(shù)據(jù)類(lèi)型還是動(dòng)態(tài)的,是從輸入數(shù)據(jù)識(shí)別出來(lái)的;不結(jié)合輸入誰(shuí)都不知道某個(gè)數(shù)據(jù)在某個(gè)時(shí)刻會(huì)是什么。 這使得代碼幾乎無(wú)法靜態(tài)分析;而測(cè)試用例很難覆蓋每一條執(zhí)行路線(xiàn)——不要忘了,這個(gè)程序“吃”進(jìn)去的數(shù)據(jù)是多變的,幾乎不可能列出所有情況。 這使得葉新晨又產(chǎn)生了一個(gè)想法。那就是,要給它增加一些功能,把專(zhuān)業(yè)語(yǔ)言的core dump、變量先聲明后使用等等功能搞出來(lái),使得出現(xiàn)類(lèi)似高危行為時(shí)可以得到提醒甚至直接對(duì)相關(guān)不良行為報(bào)錯(cuò)。 當(dāng)然,葉新晨是沒(méi)有這么自覺(jué)的,只是葉新晨跟他們說(shuō)了,他們立刻就私發(fā)了一個(gè)六萬(wàn)的懸賞讓葉新晨幫忙! 原本葉新晨是不愿意的,因?yàn)槟瞧咛煲呀?jīng)夠累的了,晚上都熬到凌晨三四點(diǎn),每天就睡三四個(gè)小時(shí),這讓葉新晨深刻的明白為什么程序員容易頭禿了。 雖然葉新晨不愿意,但是奈何對(duì)面又把這個(gè)六萬(wàn)的懸賞又加了四萬(wàn)…… 嗯,葉新晨覺(jué)得這個(gè)功能也不是那么難,熬夜那就熬夜唄…… 所以葉新晨也是立刻就進(jìn)入狀態(tài)了,tcl號(hào)稱(chēng)一切都是字符串,這甚至可以把系統(tǒng)庫(kù)函數(shù)/運(yùn)算符/關(guān)鍵字都給rename掉,然后自己寫(xiě)一個(gè)替代品。 這給了它的用戶(hù)極大的自由度。 比如itcl就是用命名空間模擬的面向?qū)ο笳Z(yǔ)法——這種語(yǔ)言仍然是面向過(guò)程的;但你可以自己定義一個(gè)class關(guān)鍵字(實(shí)質(zhì)上是一個(gè)過(guò)程),把它變得和一個(gè)真正的面向?qū)ο笳Z(yǔ)言幾乎一模一樣。 葉新晨首先盯上的是它的過(guò)程/函數(shù)聲明關(guān)鍵字proc。 在這種語(yǔ)言里,你聲明一個(gè)函數(shù)fun,格式就是 第(1/3)頁(yè)