• <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>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                因為在開發CMinus的過程中為了異常處理(最終沒有實現進CMinus),曾經學習了一下怎么用匯編語言寫try-catch,因此這個CPU相關的處理方法就被我偷了哈,實現在了NativeX的虛擬機里。

                在NativeX里面,try-catch和throw非常簡單。throw你可以加一個值當異常數據,也可以不加(不會修改上次的異常數據,可以當rethrow用)。catch的話沒辦法跟C++一樣根據類型來判斷,因此我會給你一個異常數據的指針,你自己看著辦哈,因為NativeX跟C一樣沒有RTTI。因此throw就很簡單了,就是恢復棧頂和棧底指針之后跳轉到最近的異常處理程序里面去。try和catch就是用來創建和銷毀異常處理程序的。所有的異常處理程序構成了一個鏈表,這個鏈表被我記在了堆棧里面,而最近的異常處理節點的指針則被我放在了整個堆??丶淖铐敳浚釉诤竺娴氖钱惓ο蟮臄祿D忝看蝨hrow的東西的尺寸可以不同,因此占用的“堆棧最頂部空間”也不同。當然如果你函數遞歸太深而導致棧頂覆蓋了異常對象的數據區域時,就會觸發“堆棧溢出”事件。在NativeX里面堆棧溢出代表你這程序已經廢了,因此這個是不能catch的,虛擬機返回給宿主程序一個信號然后就停止執行了。

                我們來看一個簡單的例子,如何throw之后把異常對象的返回給函數,首先是代碼:
             1 /*NativeX Code*/
             2 unit nativex_program_generated;
             3 function int32 main()
             4 {
             5     (result = 10s32);
             6     try
             7         Throw();
             8     catch
             9         (result = ( * cast<int32*>(exception)));
            10 }
            11 
            12 function void Throw()
            13     throw 20s32;

                main函數首先將函數返回值設置成10,然后調用throw函數。throw函數會把20給throw出來,然后main函數catch了,把結果返回。NativeX使用了關鍵字exception來表達異常對象的地址。當然你如果要throw各種不同的東西的話,你得自己做標記(親自實現RTTI)了。好了,我們看看產生的指令:
             1 // unit nativex_program_generated;
             2      0: stack_reserve 0
             3      1: stack_reserve 0
             4      2: ret 0
             5 // function int32 main()
             6      3: stack_reserve 0
             7 // (result = 10s32);
             8      4: push s32 10
             9      5: resptr
            10      6: write s32
            11 // try
            12      7: exception_handler_push 14
            13 // Throw();
            14      8: stack_reserve 1
            15      9: stack_top 0
            16     10: call 20 1
            17     11: stack_reserve -1
            18 // try
            19     12: exception_handler_pop
            20     13: jump 18 1
            21     14: exception_handler_pop
            22 // (result = ( * cast<int32*>(exception)));
            23     15: exception_object_address
            24     16: resptr
            25     17: copymem 4
            26 // function int32 main()
            27     18: stack_reserve 0
            28     19: ret 0
            29 // function void Throw()
            30     20: stack_reserve 0
            31 // throw 20s32;
            32     21: exception_object_reserve 4
            33     22: push s32 20
            34     23: exception_object_address
            35     24: write s32
            36     25: exception_raise
            37 // function void Throw()
            38     26: stack_reserve 0
            39     27: ret 0

                try首先會將catch之后的第一個指令給exception_handler_push了,在try的結尾當然要取消掉這個異常處理函數了,因此pop一下,然后jump到catch后面。當然catch的第一件事也是exception_handler_pop。exception_object_reserve在棧頂預留指定的空間來存放異常對象,exception_object_address則是獲得異常對象的地址,exception_raise就是跳轉到最近的異常處理函數了。raise不會把異常處理函數的記錄給pop掉,所以要靠catch自己去pop。

                NativeX已經完成了,接下來就可以開始打造周邊工具了哇哈哈。將來的目標是將類似C#和Javascript的語言都編譯到NativeX上,然后為這三類語言寫很多語法分析器,然后他們就變成很多語言了。當然這些語言只是demo。Vczh Library++的目的是提供實現編譯器的中間每一層的類庫,因此想干嘛就可以干嘛了哈。
            posted on 2010-08-28 01:14 陳梓瀚(vczh) 閱讀(3492) 評論(9)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

            評論:
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-08-29 01:50 | Tanky Woo
            朋友你好:
            C/C++和算法論壇:C++奮斗樂園
            歡迎你加入。
            里面有C/C++交流,求助,源碼,
            算法學習,求助,
            ACM刷題
            等各種板塊,
            相信大家在一起能學習快樂。

            論壇地址:
            [url=http://www.cppleyuan.com/index.php]http://www.cppleyuan.com/index.php[/url]

            另外,論壇現在招收版主,有意愿的朋友可以看看:
            [url=http://www.cppleyuan.com/forumdisplay.php?fid=44]http://www.cppleyuan.com/forumdisplay.php?fid=44[/url]

            注:此留言絕不是廣告,只是看見博主也是C/C++和算法的愛好者,我們想邀請博主一起加入我們的論壇。

            我也是一名C/C++和ACM愛好者,大家可以去我博客看看就知道了:
            [url=http://www.wutianqi.com/]http://www.wutianqi.com/[/url]

            打擾之處請見諒。
              回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-08-30 04:36 | mm
            哇,bb好厲害!  回復  更多評論
              
            # 能不能出個NativeX語言的使用說明或實例啊 2010-08-31 02:35 | luoxiangbi
            一定支持,非常感謝,當然還得強烈要求。。。。什么時候能出一個使用NativeX語言的教程或者實例啊,東西是個好東西,也不能就你自己獨自享用啊,得想辦法讓大家用起來,呵呵,代碼注釋本來就少,文檔又不多,對于非科班出身的業余程序員,哎,慚愧,我都算不上業余程序員,就是自己瞎搗鼓,這個真的是有困難,呵呵。
              回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-09-01 06:42 | 陳梓瀚(vczh)
            @luoxiangbi
            我會的,等到NativeX完成之后,現在還有可能發生變動,還不能寫教程  回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-09-14 01:31 | yted
            冒昧留言,只是因為剛剛在網上看了一篇文章,想知道您對文章里面的觀點(見文章第二段)有什么看法:

            A Better Programming Language
            http://mdmstudios.wordpress.com/2010/08/31/a-better-programming-language/  回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-09-15 07:45 | 陳梓瀚(vczh)
            @yted
            所以我也只看了第二段不知道會不會斷章取義……我的看法是這樣的
            1:對于自己的學習來說,最好是低級語言高級語言一起來,做幾個困難的什么,當然可以學到很多東西,
            2:對于公司來說,我相信軟件慢一點點其實是無所謂的,能在短時間內開發出高質量的軟件,才有可能應對社會的需求變更哈,所以其實是有好處的。舉個例子,就如同C#和C++,我相信雖然C#并沒有比C++多出什么,但至少節省了你思考那里應該delete的時間,你可以去寫更多的東西……  回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-09-15 07:46 | 陳梓瀚(vczh)
            @yted
            還有,根據實踐,OOP其實作用沒有我們想象中大。所以如果一門語言只讓你可以OOP而不能【方便】使用其他【范式】,是會讓歷史的車輪倒退的。  回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-09-17 00:34 | yted
            @陳梓翰

            同意第一第二點,軟件工程和編程語言的發展一直都在降低復雜度這個點上做文章,包括內存管理機制,范式,閉包,異常,等等等等,等等等等.

            對于 OOP, 其實它只是一種思考的方式, 但作用似乎不僅想象中的小, 因為很多技巧都是基于 OOP 之上的, 當然我們也不妨說其實很多技巧的作用沒有想象中大...

            而范式的使用, 感覺某些語言不僅讓我們方便地使用, 還讓我們方便地【犯錯】, 記得 Linus 對 C++ 的評價嗎 :)   回復  更多評論
              
            # re: Vczh Library++的NativeX語言最后一個特性完成——異常處理 2010-09-17 07:16 | 陳梓瀚(vczh)
            @yted
            程序員有義務通過學習而減少犯錯,Linus只是招不到合適的人而發囧而已,竟然被眾人捧為圣經,此乃奇恥大辱也。  回復  更多評論
              
            久久久久亚洲AV成人片| 久久笫一福利免费导航 | 久久精品国产亚洲av麻豆小说 | 婷婷久久香蕉五月综合加勒比| 久久精品国产久精国产果冻传媒| 久久丫精品国产亚洲av| 国产精品热久久毛片| 免费精品久久天干天干| 久久精品一区二区| 久久亚洲精品无码VA大香大香| 精品久久久久久成人AV| 国产精品亚洲综合久久| 四虎国产永久免费久久| 久久人人爽人人爽人人av东京热| 9久久9久久精品| 99久久国产宗和精品1上映| 国产精品成人99久久久久| 区久久AAA片69亚洲| 99久久精品免费观看国产| 久久综合给久久狠狠97色| 色综合久久夜色精品国产| 国产精品无码久久久久| 久久91精品国产91久久小草| 久久婷婷国产剧情内射白浆| 久久露脸国产精品| 久久精品国内一区二区三区| 无码精品久久久天天影视| 久久人人爽人人爽人人片AV麻烦| 久久夜色撩人精品国产小说| 精品久久久久久无码人妻热| 久久久精品一区二区三区| 国产精品久久久久AV福利动漫| 色综合久久中文字幕无码| 一本色道久久88精品综合| 国产精品久久久久a影院| 亚洲国产精品狼友中文久久久| 国内精品久久久久久久亚洲| 精品久久人人做人人爽综合| 中文字幕亚洲综合久久| 国产精品九九久久精品女同亚洲欧美日韩综合区 | yy6080久久|