莊周夢(mèng)蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理
              題外:從老家從早到晚總算折騰回了杭州,進(jìn)站太早,火車晚點(diǎn),提包帶斷,什么倒霉事也遇上了,先發(fā)個(gè)已經(jīng)整理好的部分,后續(xù)仍待整理。

          多道程序設(shè)計(jì):分離進(jìn)程為獨(dú)立的功能

          無論在協(xié)作進(jìn)程還是在同一進(jìn)程的協(xié)作子過程層面上,Unix設(shè)計(jì)風(fēng)格都運(yùn)用“做單件事并做好的方法“,強(qiáng)調(diào)用定義良好的進(jìn)程間通信或共享文件來連通小型進(jìn)程,提倡將程序分解為更簡單的子進(jìn)程,并專注考慮這些子進(jìn)程間的接口,這至少需要通過以下三種方法來實(shí)現(xiàn):

          1降低進(jìn)程生成的開銷(思考下Erlangprocess)

          2、提供方法(shelloutIO重定向、管道、消息傳遞和socket)簡化進(jìn)程間通信

          3、提倡使用能由管道和socket傳遞的簡單、透明的文本數(shù)據(jù)格式

          Unix IPC方法的分類:

          1、將任務(wù)轉(zhuǎn)給專門程序,如system(3)popen調(diào)用等,稱為shellout

          2Pipe重定向和過濾器,如bcdc

          3包裝器,隱藏shell管線的復(fù)雜細(xì)節(jié)。

          4安全包裝器和Bernstein

          5/進(jìn)程

          6對(duì)等進(jìn)程間通信:

          (1)臨時(shí)文件

          (2)信號(hào)

          (3)系統(tǒng)守護(hù)程序和常規(guī)信號(hào)

          (4)socket

          (5)共享內(nèi)存,mmap

          遠(yuǎn)程過程調(diào)用(RPC)的缺憾:

          1RPC接口很難做到可顯,如果不編寫和被監(jiān)控程序同樣復(fù)雜的專用工具,也難以監(jiān)控程序的行為。RPC接口和庫一樣具有版本不兼容的問題,由于是分布式的,因此更難被追查。

          2、類型標(biāo)記越豐富的接口往往越復(fù)雜,因而越脆弱。隨著時(shí)間的推移,由于在接口之間傳遞的類型總量逐漸變大,單個(gè)類型越來越復(fù)雜,這些接口往往產(chǎn)生類型本體蠕變問題。這是因?yàn)榻涌诒茸址菀资洌蝗绻麅啥顺绦虻谋倔w不能正確匹配,要讓它們通信肯定很難,糾錯(cuò)更是難上加難。

          3、支持RPC的常見理由是它比文本流方法允許“更豐富”的接口,但是接口的功能之一就是充當(dāng)阻隔點(diǎn),防止模塊的實(shí)現(xiàn)細(xì)節(jié)彼此泄漏,因此,支持RPC的主要理由同時(shí)恰恰證明了RPC增加而不是降低了程序的全局復(fù)雜度

          Unix傳統(tǒng)強(qiáng)烈贊成透明、可顯的接口,這是unix文化不斷堅(jiān)持文本協(xié)議IPC的動(dòng)力。

          ESR在這里還談到XML-RPCSOAP等協(xié)議,認(rèn)為是RPCunix對(duì)文本流支持的一種融合,遺憾的是SOAP本身也成為一種重量級(jí)、不那么透明的協(xié)議了,盡管它也是文本協(xié)議。

          線程是有害的:

          線程是那些進(jìn)程生成昂貴、IPC功能薄弱的操作系統(tǒng)所特有的概念。

          盡管線程通常具有獨(dú)立的局部變量棧,它們卻共享同一個(gè)全局內(nèi)存,在這個(gè)共享地址空間管理競(jìng)爭(zhēng)臨界區(qū)的任務(wù)相當(dāng)困難,而且成為增加整體復(fù)雜度和滋生bug的溫床。除了普通的競(jìng)爭(zhēng)問題之外,還產(chǎn)生了一類新問題:時(shí)序依賴

          當(dāng)工具的作用不是控制而是增加復(fù)雜度的時(shí)候,最好扔掉從零開始。

          微型語言:尋找歌唱的樂符

          (注,這里談的微型語言,就是現(xiàn)在比較熱門的詞匯DSL

          對(duì)軟件錯(cuò)誤模式進(jìn)行的大量研究得出的一個(gè)最一致的結(jié)論是,程序員每百行程序出錯(cuò)率和所使用的編程語言在很大程度上是無關(guān)的。更高級(jí)的語言可以用更少的行數(shù)完成更多的任務(wù),也意味著更少的bug

          防御設(shè)計(jì)不良微型語言的唯一方法是知道如何設(shè)計(jì)一個(gè)好的微型語言。

          語言分類法:


          對(duì)微型語言的功能測(cè)試:不讀手冊(cè)可以編寫嗎

          現(xiàn)代微型語言,要么就完全通用而不緊湊,要么就非常不通用而緊湊;不通用也不緊湊的語言則完全沒有競(jìng)爭(zhēng)力。

          一些引申想法:我認(rèn)為這個(gè)評(píng)判標(biāo)準(zhǔn)也可以用在任何編程語言上,以此來判斷一些語言,C語言既通用又緊湊,Java是通用而不緊湊,rubyPython之類的腳本語言也是如此,正則表達(dá)式(如果也算語言的話)是不通用而緊湊,Erlang也是通用而緊湊,awk卻是既不通用也不緊湊,XSLT也可以歸入不通用不緊湊的行列;Javascript是個(gè)另類,按理說它也是不通用不緊湊,說它不通用是因?yàn)樗闹饕獞?yīng)用范圍還是局限在web開發(fā)的UI上,實(shí)際上Javascript也是門通用語言,但是很少會(huì)有人會(huì)用javascript去寫批處理腳本,Javascript顯然是不緊湊的,太多的邊邊角角甚至奇奇怪怪的東西需要你去注意,然而就是這樣一門不通用不緊湊的語言現(xiàn)在卻非常有前途,只能說時(shí)勢(shì)所然。

          設(shè)計(jì)微型語言:

          1、選擇正確的復(fù)雜度,要的是數(shù)據(jù)文件格式,還是微型語言?

          2擴(kuò)展嵌入語言

          3、編寫自定義語法yacclex

          4慎用宏,宏的主要問題是濫用帶來的奇怪、不透明的代碼,以及對(duì)錯(cuò)誤診斷的擾亂。

          5語言還是應(yīng)用協(xié)議




          評(píng)論

          # re: 《Unix編程藝術(shù)》重讀筆記(三)  回復(fù)  更多評(píng)論   

          2010-02-22 11:08 by lispython
          上一次讀TAOUP還是4年之前上大學(xué)的時(shí)候,那個(gè)時(shí)候?qū)Τ绦蛟O(shè)計(jì)的認(rèn)識(shí)還十分淺陋,就已經(jīng)被這本書深深震撼了。

          看了博主的筆記,我也準(zhǔn)備重讀TAOUP了,希望能跟您多交流。
          主站蜘蛛池模板: 和平县| 甘孜| 准格尔旗| 鲁甸县| 安乡县| 桦川县| 吉林省| 英超| 探索| 阿拉善右旗| 崇左市| 前郭尔| 泗洪县| 武功县| 遂宁市| 光泽县| 红河县| 西贡区| 汝州市| 南岸区| 志丹县| 化隆| 吴江市| 金塔县| 麟游县| 平顶山市| 丰县| 石嘴山市| 开江县| 陵水| 新乡县| 德江县| 滕州市| 阳曲县| 临湘市| 牟定县| 天水市| 苍南县| 南充市| 息烽县| 澎湖县|