• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            桃源谷

            心靈的旅行

            人生就是一場(chǎng)旅行,不在乎旅行的目的地,在乎的是沿途的風(fēng)景和看風(fēng)景的心情 !
            posts - 32, comments - 42, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            From 長(zhǎng)城
             

            跟著開(kāi)源/來(lái)學(xué)習(xí)源C語(yǔ)言代碼的讀法

            http://itpro.nikkeibp.co.jp/article/COLUMN/20070622/275606/

             

            まつもと ゆきひろ
            (Yukihiro "Matz" Matsumoto)

            翻譯: Lymons

             「Code Reading―從開(kāi)源里學(xué)習(xí)軟件開(kāi)發(fā)的技法」有這樣一本書。我是這本書日本版的譯者, 呵呵有點(diǎn)王婆賣瓜---自賣自夸的感覺(jué),但是把讀源代碼作為主題的在市面還沒(méi)有其他的書。我認(rèn)為這是一本網(wǎng)羅了從技法到工具,數(shù)據(jù)結(jié)構(gòu),構(gòu)架,還有利用代碼的實(shí)際讀法的實(shí)例的好書。

            照片1●「Code Reading―跟著開(kāi)源來(lái)學(xué)習(xí)軟件的開(kāi)發(fā)技法」

             這本書的前言里,編程高手Dave Thomas寫下了下面的話。

             沒(méi)有研讀過(guò)其他作家作品的偉大作家,沒(méi)有研究過(guò)其他畫家筆法的偉大畫家,沒(méi)有盜取過(guò)并肩作戰(zhàn)的同事的技術(shù)的技巧高明的外科醫(yī)生,沒(méi)有在副駕駛的位置積累實(shí)際經(jīng)驗(yàn)的波音767的機(jī)長(zhǎng),在現(xiàn)實(shí)生活中真的會(huì)存在他們這樣的人嗎?

             的確是不存在上面降到的那些人。我們通常說(shuō)的,在軟件開(kāi)發(fā)以外的領(lǐng)域里進(jìn)行的修煉,也就是去觀摩他人的工作,先是去模仿,然后是盡全力的做而后拿出自己的獨(dú)有特點(diǎn)。在拳術(shù)里有句話就叫”守.破.離“。

            注:

            “守破離“ 就是指:

            遵從繼承過(guò)來(lái)的東西

            摒棄與現(xiàn)代不合適的東西

            加入新的東西,獨(dú)自專研,而后超越了前人 

            『守(しゅ)』『破(は)』『離(り)』とは 指導(dǎo)者から何かを?qū)Wび始めてから、ひとり立ちしていくまでに人は、『守』?『破』?『離』という順に段階を進(jìn)んでいきます。

             

            『守』

             最初の段階では、指導(dǎo)者の教えを守っていきます。 できるだけ多くの話を聞き、指導(dǎo)者の行動(dòng)を見(jiàn)習(xí)って、指導(dǎo)者の価値観をも自分のものにしていきます。 學(xué)ぶ人は、すべてを習(xí)得できたと感じるまでは、指導(dǎo)者の指導(dǎo)の通りの行動(dòng)をします。 そして、指導(dǎo)者が「疑問(wèn)に対して自分で考えろ」と言うことが多くなったら、次の段階に移っていきます。

            『破』

             次の段階では、指導(dǎo)者の教えを守るだけではなく、破る行為をしてみます。 自分獨(dú)自に工夫して、指導(dǎo)者の教えになかった方法を試してみます。 そして、うまくいけば、自分なりの発展を試みていきます。

            『離』

             最後の段階では、指導(dǎo)者のもとから離れて、自分自身で學(xué)んだ內(nèi)容を発展させていきます。

             先去模仿別人這是當(dāng)然的,但是在IT業(yè)界里卻不必遵守的一面也有.在商用軟件的世界里源代碼是一個(gè)企業(yè)生存的飯碗,外界的人是看不到它們的.商用軟件里,這些私有的代碼也就是財(cái)產(chǎn),這些代碼是無(wú)論如何也不能被讀到的.軟件開(kāi)發(fā)的很多技術(shù),在各個(gè)軟件公司中都是前輩通過(guò)口頭教授的方式來(lái)傳遞給后輩.

            清楚閱讀代碼的目的

             多虧了開(kāi)源.軟件,我們才能把這些實(shí)際的代碼看的一清二楚,能夠?qū)λ鼈冞M(jìn)行學(xué)習(xí)了.雖然是這樣,但是僅僅通過(guò)毫無(wú)目的地去讀代碼,并不能讓誰(shuí)都能成為一名優(yōu)秀的程序員.很遺憾,源代碼并不像小說(shuō),音樂(lè),電影一樣,能夠根據(jù)人類的感性直接進(jìn)行運(yùn)轉(zhuǎn)起來(lái)的.源代碼是在讓人和計(jì)算機(jī)都能理解的,用編程語(yǔ)言這種稍微特殊的形式來(lái)描寫出來(lái)的.因此,不能像普通小說(shuō)那樣去讀它.在有數(shù)萬(wàn)行的代碼,如果漫無(wú)目的地從最開(kāi)頭去讀,我想幾乎沒(méi)有人能夠去輕而易舉地理解其中的內(nèi)容.但是,因?yàn)樵谠创a中并沒(méi)有像小說(shuō)那樣的故事,所以沒(méi)有必要把源代碼全部的通讀一遍*1.還不如只截取非常有意思的地方,或者有必要的地方,來(lái)學(xué)習(xí)先人的智慧就足夠了.

             那么,閱讀源代碼有各種各樣的必要的東西,最開(kāi)始的一個(gè)必要的東西恐怕就是目的了吧.根據(jù)想要學(xué)習(xí)什么來(lái)閱讀源代碼,可以富有成效地去理解它,學(xué)習(xí)到其中的知識(shí). 例如,”學(xué)習(xí)遞歸下降語(yǔ)句解析的實(shí)現(xiàn)方法”啊,”處理系中垃圾回收機(jī)制是如何實(shí)現(xiàn)”的啦,”這個(gè)處理系為什么運(yùn)行速度會(huì)這么快”等. 把哪些東西學(xué)到手作為閱讀的目的,是一個(gè)在膨脹的代碼中要選擇閱讀那個(gè)地方的方針.

             讀代碼的目的,不僅僅是為了學(xué)習(xí). 例如, 在軟件維護(hù)和調(diào)試的時(shí)候,必須要讀懂相關(guān)的源代碼. 因?yàn)楣ぷ鞯脑蛉ゾS護(hù)其他人寫的軟件的情況并不是一間稀奇的事情. 為了又要改善軟件,又要追加功能,又要修正BUG, 必要要對(duì)目標(biāo)的源代碼進(jìn)行閱讀和理解. 即使是自己寫過(guò)的源代碼,經(jīng)過(guò)很長(zhǎng)的一段時(shí)間后它的內(nèi)容和背景也幾乎記不清楚的情況也經(jīng)常發(fā)生. 在軟件業(yè)里,有”半年前的自己就是別人”的這樣一個(gè)諺語(yǔ). 因此, 即使自己寫過(guò)的軟件, 最終自己也有必要去閱讀它.

            要擁有閱讀方法的策略

             即使完全地了解目的了,胡亂地對(duì)源代碼瞎讀一通也是不能達(dá)成目的的. 讀代碼的測(cè)試有好幾種, 但是我只給大家介紹我經(jīng)常使用的那幾種(圖1)。

            圖1●閱讀源代碼的的三種策略

            降落傘法

             有目的地去閱讀源代碼的時(shí)候, 必須要讀完程序的全部代碼是非常少見(jiàn)的事情.實(shí)際上是, 那些想要知道的知識(shí)是代碼中被隱藏的部分, 存在BUG的部分, 從全體看來(lái),找到只不過(guò)是其中的一小部分而已的地方, 僅僅閱讀這部分代碼就足夠了. 所謂“降落傘法”就是, 找到其中的重要的地方, 僅僅閱讀這個(gè)地方的源代碼的策略. 就像降落傘部隊(duì)在突襲某個(gè)重要據(jù)點(diǎn)一樣. 降落傘法的本質(zhì)則是, 要找到哪個(gè)部分是重要的. 實(shí)際的例子在后面要介紹,但是檢索是這里的關(guān)鍵.

            深度優(yōu)先探索法

             極其少見(jiàn)地,想要把握程序的全體流程的情況也是有的. 例如想要把握Linux啟動(dòng)時(shí)的控制流程時(shí). 在這個(gè)場(chǎng)合, 從程序啟動(dòng)時(shí)最開(kāi)始被執(zhí)行的main函數(shù)開(kāi)始, 按照深度優(yōu)先的方式一個(gè)一個(gè)地去遍歷被調(diào)用的函數(shù), 一直到不再調(diào)用其他的函數(shù)的最末端函數(shù)為止, 然后是開(kāi)始反向遍歷閱讀這個(gè)路徑上的代碼. 利用像這樣的自底向上的閱讀方式,在”不知道的函數(shù)假設(shè)它不存在”的狀態(tài)下能夠進(jìn)行閱讀, 能夠高效率地去閱讀源代碼. 為了肯定這個(gè)方法的發(fā)明人,根據(jù)他的名字這種方式也被叫做”hira方法”,實(shí)際上,在閱讀Linux源代碼的時(shí)候經(jīng)常會(huì)使用這種方法*2

            調(diào)試法

             程序的狀態(tài)是伴隨著運(yùn)行有這個(gè)各種各樣的變化. 因此, 雖說(shuō)讀解程序, 但是僅僅通過(guò)閱讀程序的字面意思并不能理解它的真意. 有時(shí)候,閱讀者有必要把自己想象成一臺(tái)計(jì)算機(jī)來(lái)判斷變量和對(duì)象的狀態(tài).

             但是, 試著考慮一下, 即使我們不用想象, 計(jì)算機(jī)最終還是要執(zhí)行這個(gè)程序, 所以如果我們能觀察它在執(zhí)行時(shí)候的樣子的話, 就能正確的知道運(yùn)行時(shí)候的狀態(tài)了.  這就是調(diào)試(debug). 使用調(diào)試的話,能讓程序在任意的地點(diǎn)停止,就可以調(diào)查這個(gè)時(shí)侯的變量的狀態(tài). 調(diào)試就是為了找到BUG而被引入的軟件, 但是為了能夠知道軟件在運(yùn)行時(shí)候的狀態(tài), Code.Reading也同樣有效.

            尋找源代碼的方法

             閱讀源代碼的時(shí)候,必須要得到關(guān)鍵的源代碼. 可以利用互聯(lián)網(wǎng)無(wú)限制的得到免費(fèi)的源代碼. 在這里介紹幾種開(kāi)源.軟件的獲取方法.

            freshmeat 略

            SourceForge 略

            Google 略

            源代碼檢索

             最近,即使不下載全部的源代碼,也能登陸即刻檢索源代碼的Web網(wǎng)站. 有代表的網(wǎng)站如, Koders(http://www.koders.com/,圖3)和Google CodeSearch(http://www.google.com/codesearch,圖4).

            圖3●檢索源代碼網(wǎng)站的Koders

             

            圖4●檢索源代碼網(wǎng)站的Google CodeSearch

             在檢索源代碼的時(shí)候, 必須要注意以下的幾點(diǎn).

            OS 略

            語(yǔ)言 略

            許可證 略

             

            關(guān)鍵代碼的檢索方法

             軟件的源代碼, 大體都有預(yù)想以上的規(guī)模. 超過(guò)600萬(wàn)行的Linux是一個(gè)非常極端的例子, 但是, Ruby那樣并不是很龐大的軟件也超過(guò)了10萬(wàn)行. 想這樣龐大的規(guī)模, 閱讀所有的代碼是一件不現(xiàn)實(shí)的事情. 閱讀源代碼的時(shí)候, 找到掩藏這必要信息的關(guān)鍵場(chǎng)所是非常重要的.

             在讀解源代碼的時(shí)候, 首先要理解程序的全體框架是非常有必要的. 程序的所有代碼沒(méi)有必要閱讀, 但是, 為了找到自己想要查找的信息在被安放在什么地方, 制作出程序全體的結(jié)構(gòu)圖就可以讓閱讀變得非常方便的.

             因此,最有用的是源代碼的文件名。大體的軟件的源代碼都被分成很多的文件.在各個(gè)文件被應(yīng)該命名成跟程序機(jī)能相關(guān)聯(lián)的名字. 例如, 想要讀取內(nèi)存管理的源代碼的時(shí)候, “就可以懷疑memory.c和gc.c這樣的文件”就是我們要找的.

             檢索源代碼的工具也是必不可少的. 這些工具被總結(jié)在表2里.

            表2●源代碼檢索必備的工具一覽

             那么讓我們找實(shí)際的代碼試一試閱讀它吧.

             

            Code.Reading的實(shí)際演練
            1
            pom程序

             2年前,在生產(chǎn)我的小兒子的時(shí)候, 清晨4點(diǎn)就要帶著妻子去醫(yī)院而出了門,正好看見(jiàn)空中美麗的照耀大地的滿月. 有那么一說(shuō),孩子的分娩與月亮的圓缺有關(guān)系. UNIX中有pomphase of the moon這樣一個(gè)C語(yǔ)言的程序, 用來(lái)表示月亮的圓缺月齡.

             根據(jù)列表1可以看出來(lái)是滿月 我共有4個(gè)孩子, 其他的三個(gè)中一個(gè)幾乎是新月(5%), 一個(gè)幾乎是滿月(98%), 另一個(gè)是介于半月和滿月之間(62%). 4人里有3人是滿月活新月,所以這是非常高的幾率哦. 然而, UNIXpom不能計(jì)算1970年以前的月齡因此,我妻子的月齡也就不能計(jì)算.

            % pom 04102804

            Thu 2004 Oct 28 04:00:00 (JST): The Moon was Full

            列表1●表示月齡的軟件pom的執(zhí)行結(jié)果

             在這里讀它的源代碼吧. 首先, 從找它的源代碼開(kāi)始. 我們?cè)囍褂?/span>GoogleCodeSearch5訪問(wèn)網(wǎng)站http://www.google.com/codesearch后輸入查找關(guān)鍵字,phase of the moon pom”這樣的詞就行. 檢索的結(jié)果有好幾個(gè)候補(bǔ). 找了幾個(gè)后我想我找到了pom.c的文件.

             pom.c是一個(gè)有286行的小程序文件頭是表示許可證和被包含的頭文件的地方,暫且略過(guò). 要了解全體的動(dòng)作則必須先從main( )函數(shù)開(kāi)始看列表2)。

            列表 2●pom.cmain函數(shù)
            [點(diǎn)擊圖像放大]

             上面能夠看到代碼的大部分內(nèi)容英語(yǔ)的時(shí)制滿月/新月等, 也就明白了正在使用的東西包括, 月齡的計(jì)算使用通過(guò)potm( )函數(shù)來(lái)進(jìn)行的.  叫做days的浮點(diǎn)數(shù)被傳遞到potm( )函數(shù)中. Days是從基準(zhǔn)點(diǎn)19891231開(kāi)始的一個(gè)日數(shù).

             在計(jì)算days的那行代碼列表2(1)調(diào)整了UNIX的時(shí)刻197011日開(kāi)始的描述和被potm( )處理的時(shí)刻. 在這里出現(xiàn)的常量86400等于24小時(shí)×60×60也就是1整天的描述. 暫且把potm( )的處理邏輯作為黑盒(black box)先擱置在一邊.

             我們關(guān)心的是”為什么1970年以前的不能計(jì)算呢”pom程序里一處理1970年以前的日期的話, 會(huì)出現(xiàn) 列表3那樣的錯(cuò)誤消息. 一檢索這個(gè)消息字符串我們會(huì)找到在列表4中表示的代碼.

            pom: specified date is outside allowed range

            列表3●1970年以前的日期傳遞到pom中會(huì)打印出來(lái)的錯(cuò)誤消息

             

            if ((tval = mktime(lt)) == -1)

             errx(1, "specified date is outside allowed range");

            列表4●包含列表3中錯(cuò)誤消息的代碼

             似乎是因?yàn)?/span>C的庫(kù)函數(shù)mktime( )不能處理1970年以前的時(shí)間的這個(gè)理由pom才不能計(jì)算的. 如果是1970年以后的時(shí)間,在基準(zhǔn)點(diǎn)以前的月齡也能計(jì)算, 那就說(shuō)明potm( )的算法里好像沒(méi)有對(duì)1970年的限制.

            6●Ruby版本的pom200410284時(shí)的月齡的表示結(jié)果

             總而言之,如果不使用mktime()就能計(jì)算days的話那當(dāng)然好了. 但在C中不使用mktime()來(lái)計(jì)算時(shí)間好像很困難. 于是, 試著使用Ruby來(lái)實(shí)現(xiàn)吧RubyDateTime類對(duì)于日期的計(jì)算是非常拿手的. 1970年的限制沒(méi)有了,反而公元前數(shù)千年到公元數(shù)萬(wàn)年的日期都能輕而易舉的計(jì)算出來(lái).

             列表5是把pom.c的代碼翻譯成Ruby代碼的結(jié)果potm( )函數(shù)的算法是原封不動(dòng)的轉(zhuǎn)換成了Ruby代碼. main( )中的代碼的邏輯在前面已經(jīng)表示過(guò)了所以這里全部都省略掉了,該程序也能用百分比的形式來(lái)表示月齡6)。

            # Copyright (c) 1989, # Copyright (c) 1989, 1993

            # The Regents of the University of California.

            # All rights reserved.

             

            require 'date'

             

            EPOCH_MINUS_1970=(20 * 365 + 5 - 1)

             # 20 years, 5 leaps, back 1 day to Jan 0

             

            EPSILONg=279.403303 # solar ecliptic long at EPOCH

            RHOg=282.768422 # solar ecliptic long of perigee at EPOCH

            ECCEN=0.016713 # solar orbit eccentricity

            LZERO=318.351648 # lunar mean long at EPOCH

            Pzero=36.340410 # lunar mean long of perigee at EPOCH

            Nzero=318.510107 # lunar mean long of node at EPOCH

             

            include Math

             

            def potm(days)

             n = 360 * days / 365.242191

             n = adj360(n)

             msol = n + EPSILONg - RHOg

             msol = adj360(msol)

             ec = 360 / PI * ECCEN * sin(dtor(msol))

             lambdasol = n + ec + EPSILONg

             lambdasol = adj360(lambdasol)

             l = 13.1763966 * days + LZERO

             l = adj360(l);

             mm = l - (0.1114041 * days) - Pzero

             mm = adj360(mm);

             nm = Nzero - (0.0529539 * days)

             nm = adj360(nm);

             ev = 1.2739 * sin(dtor(2*(l - lambdasol) - mm))

             ac = 0.1858 * sin(dtor(msol))

             a3 = 0.37 * sin(dtor(msol))

             mmprime = mm + ev - ac - a3

             ec = 6.2886 * sin(dtor(mmprime))

             a4 = 0.214 * sin(dtor(2 * mmprime))

             lprime = l + ev + ec - ac + a4

             v = 0.6583 * sin(dtor(2 * (lprime - lambdasol)))

             ldprime = lprime + v

             d = ldprime - lambdasol

             return(50.0 * (1 - cos(dtor(d))))

            end

             

            def dtor(deg)

             deg * Math::PI / 180

            end

             

            def adj360(deg)

             loop do

              if (deg < 0)

               deg += 360;

              elsif (deg > 360)

               deg -= 360;

              else

               return deg

              end

             end

            end

             

            tmpt = ARGV[0] ? DateTime.parse(ARGV[0]) : DateTime.now

            days = tmpt - DateTime.parse("1989-12-31T00:00Z")

            printf "%d%% full\n", (potm(days.to_f) + 0.5).to_i

            列表5●pom程序的Ruby版代碼

             用它來(lái)計(jì)算的話,我家的男性們結(jié)果是60%的滿月, 而女性們結(jié)果幾乎都是新月和滿月.  雖然就憑我們家里的這么點(diǎn)兒例子也不能說(shuō)明什么或得出什么結(jié)論…

             另外,列表5中的程序和原始的pom程序一樣按照BSD協(xié)議許可來(lái)公開(kāi).

             

            Code.Reading的實(shí)際例子
            2
            閱讀語(yǔ)言的UTF-8處理

             在看看別的例子吧pom例子中的代碼規(guī)模實(shí)在是太小了, 所以這次咱們?cè)囈辉囋诖笠?guī)模的代碼中來(lái)查找目標(biāo)代碼.

             Unicode字符串的編碼方式之一就有UTF-8格式. 很少有人知道, 實(shí)際上UTF-8并沒(méi)有限定在Unicode之內(nèi). 把任意的31位的整數(shù)數(shù)列符號(hào)化成可變長(zhǎng)的字節(jié)序列6 . 7表示的是它的比特位.模式.

            7●UTF-8比特位.模式
            [點(diǎn)擊這里放大圖像]

             那么,我們考慮實(shí)現(xiàn)一個(gè)把1個(gè)字符從整數(shù)轉(zhuǎn)換成字節(jié)序列,或者從字節(jié)序列轉(zhuǎn)換成整數(shù)的函數(shù)按照7的比特位.模式,拼了老命好像也能實(shí)現(xiàn)這個(gè)功能, 但是為了方便期間, 還是參考一下前人寫過(guò)的代碼吧.

             作為參考, 只要是實(shí)現(xiàn)了處理UTF-8的字符串這個(gè)功能, 不管這個(gè)程序用什么語(yǔ)言來(lái)編制都沒(méi)有關(guān)系.從各方面來(lái)考慮,在本文中將對(duì)腳本語(yǔ)言的代碼進(jìn)行說(shuō)明. 因此,我們?cè)谶@里準(zhǔn)備了Perl,Python,Ruby的源代碼.

             因?yàn)橄胍檎?/span>UTF-8關(guān)聯(lián)的機(jī)能, 暫且從使用grep命令來(lái)檢索源代碼開(kāi)始. 首先是看Perl的源代碼, UTF-8中含有在C語(yǔ)言標(biāo)識(shí)符不能識(shí)別的橫線, 所以忽略掉它用utf8作為關(guān)鍵字來(lái)進(jìn)行檢索. 使用命令行 grep -i utf8 *.c”來(lái)檢索的話, utf8.c文件里找到了uvchr_to_utf8_flags( )utf8n_to_uvchr( )這兩個(gè)函數(shù). 但是, 一看這個(gè)文件的源代碼的話, 因?yàn)椴涣私?/span>Perl的內(nèi)部結(jié)構(gòu)它的源代碼非常難讀列表6)。Python中調(diào)查了也是同樣, 在文件Object/unicodeobject.c中有PyUnicode_EncodeUTF8( )PyUnicode_DecodeUTF8( )這兩個(gè)函數(shù). 雖然不講它的代碼,但是也有必要了解Python的內(nèi)部結(jié)構(gòu)的相關(guān)知識(shí).

            UV

            Perl_utf8n_to_uvchr(pTHX_ U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)

            {

             UV uv = Perl_utf8n_to_uvuni(aTHX_ s, curlen, retlen, flags);

             return UNI_TO_NATIVE(uv);

            }

            列表6●Perlutf8n_to_uvchr( )函數(shù)的源代碼片段

             在最后讓我們看看Ruby的代碼, 比較好的是在文件pack.c里的函數(shù)uv_to_utf8( )utf8_to_uv( )不依賴于Ruby的內(nèi)部結(jié)構(gòu), 可以簡(jiǎn)單的留用下來(lái)作為我們的參考列表77

            列表7●Ruby里的uv_to_utf8( )utf8_to_uv( )函數(shù)的源代碼片段

             一讀這里的實(shí)際代碼,就能發(fā)現(xiàn)UTF-8的定義了雖然這樣, utf8_to_uv函數(shù)中輸入的字節(jié)序列很有可能不正確, 所以對(duì)于不正確的輸入要進(jìn)行嚴(yán)格的檢查 特別是在utf8_to_uv函數(shù)的末尾追加了對(duì)”冗余的UTF-8序列”的處理是很重要的. 濫用冗余的UTF-8序列的話,那就會(huì)有含有危險(xiǎn)字符會(huì)被黑客鉆空子的危險(xiǎn). 可以說(shuō)只能通過(guò)閱讀實(shí)際的代碼才能得到這些知識(shí).

             在這個(gè)函數(shù)中使用了Ruby的內(nèi)部錯(cuò)誤報(bào)告函數(shù)rb_raise( )如果想延用上面的代碼的話, 則需要把rb_raise( )函數(shù)換成其他的錯(cuò)誤報(bào)告函數(shù).

             Code.Reading, 程序員進(jìn)行學(xué)習(xí), 修煉, 代碼Review, 軟件維護(hù), 調(diào)試等等, 在編程的所有領(lǐng)域都要掌握的基本工作方式這次是因?yàn)槠邢?/span>, 在這里只能介紹Code.Reading的最有價(jià)值的部分了. 有機(jī)會(huì)的話, Code.Reading和調(diào)試這部分我也想再詳盡的講一講. 那這樣的話,看看Code Reading的書籍, 再考慮考慮自己的代碼閱讀能力, 好嗎.

             就到這里,下次再見(jiàn)

             [2007/06/29]

            我的個(gè)人簡(jiǎn)歷第一頁(yè) 我的個(gè)人簡(jiǎn)歷第二頁(yè)
            亚洲人成无码网站久久99热国产| av午夜福利一片免费看久久| 欧美日韩精品久久久免费观看| 国产ww久久久久久久久久| 精品久久久无码21p发布| 久久国产色av免费看| 午夜视频久久久久一区| 久久夜色精品国产亚洲| 波多野结衣中文字幕久久| 久久丫精品国产亚洲av| 热re99久久6国产精品免费| 国产成人无码精品久久久性色| 色婷婷综合久久久久中文| 奇米影视7777久久精品人人爽| 久久精品国产免费观看三人同眠| 亚洲精品无码专区久久久| 18岁日韩内射颜射午夜久久成人| 久久无码人妻一区二区三区午夜| 国内精品久久久久影院一蜜桃| .精品久久久麻豆国产精品| 久久美女人爽女人爽| 91麻豆精品国产91久久久久久| 看全色黄大色大片免费久久久| 久久精品国产清自在天天线| 精品久久久无码21p发布| 狠狠88综合久久久久综合网 | 久久久久九九精品影院| 久久久久亚洲AV成人网| 亚洲精品美女久久久久99小说| 久久精品黄AA片一区二区三区| 久久国产高清字幕中文| 国产精品免费久久| 亚洲人成电影网站久久| 国产精品久久久久久久久| 91精品国产91久久久久久| 亚洲精品久久久www| 99久久成人18免费网站| 中文字幕精品久久久久人妻| 久久婷婷五月综合97色一本一本| 久久人妻少妇嫩草AV蜜桃| 麻豆亚洲AV永久无码精品久久|