• <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
            JIT
            使用JIT技術(shù)的腳本引擎
            【源碼下載】JIT腳本引擎:CMinus 0.1版開放下載      摘要: 說明:CMinus是一個讀入修改過語法的C源程序,然后編譯成x86指令集寫入內(nèi)存,最后用__stdcall調(diào)用約定跟C++互相交流的腳本引擎。
            目標(biāo):CMinus的定位是中間語言,用于將其他語言編譯到CMinus上,享受本地指令帶來的好處。
            進度:完成所有功能,但是由于指令集生成的算法不好,打算修改。
            下載:【內(nèi)詳】。  閱讀全文
            posted @ 2009-05-22 00:32 陳梓瀚(vczh) 閱讀(9924) | 評論 (24)  編輯
            JIT腳本引擎:CMinus編譯冒泡排序程序      摘要: 雖然CMinus到中間指令的代碼是精心控制的,但是中間指令到x86的代碼卻是很隨意寫出來的。現(xiàn)在看來用窺孔優(yōu)化只是一種治標(biāo)不治本的方法。打算在CMinus整個都完成了之后,將中間指令到x86的代碼生成那部分重寫,使用一種廣為人知的寄存器分配算法來做。下面是冒泡排序的程序:  閱讀全文
            posted @ 2009-05-19 16:51 陳梓瀚(vczh) 閱讀(2978) | 評論 (3)  編輯
            JIT腳本引擎:第一個CMinus程序運行成功      摘要: 目前其實只能編譯單目運算符和return語句,主要是為了看看整個大框架有沒有錯誤。如果沒有發(fā)現(xiàn)錯誤的話,其他種類的表達式和語句的代碼生成很容易加上去。下面是一個CMinus程序的例子和編譯結(jié)果(匯編):  閱讀全文
            posted @ 2009-05-17 23:00 陳梓瀚(vczh) 閱讀(2596) | 評論 (1)  編輯
            JIT腳本引擎:基本完成CMinus的語義分析      摘要: 整整寫了一天,終于基本寫完了CMinus的語義分析的代碼,只剩下一個檢查struct是否可以計算出長度的問題(環(huán)引用造成的)。下面貼出語義分析的結(jié)果,從結(jié)果中可以看出符號表的結(jié)構(gòu)以及構(gòu)造方法:  閱讀全文
            posted @ 2009-05-06 08:13 陳梓瀚(vczh) 閱讀(3031) | 評論 (4)  編輯
            JIT腳本引擎:CMinus大部分語法測試通過      摘要: 今天寫了一些CMinus程序供語法分析器分析,然后程序從語法樹重新生成格式化后的代碼,兩邊比較檢查優(yōu)先級什么的是否正確處理。下面是CMinus寫的冒泡排序、菲薄納氣數(shù)列、鏈表操作函數(shù)以及其他程序:  閱讀全文
            posted @ 2009-05-04 19:44 陳梓瀚(vczh) 閱讀(1980) | 評論 (1)  編輯
            JIT腳本引擎:實現(xiàn)CMinus語法分析器      摘要: 這一次的語法分析器,我使用Vczh Combinator Parser,按照文法的定義,將字符串轉(zhuǎn)換成了語法樹。Vczh Combinator Parser構(gòu)造較大規(guī)模的編譯器的時候還是較為吃力,主要原因出在Visual C++竟然限制一個類型全名不能超過某個長度T_T……下面是代碼:  閱讀全文
            posted @ 2009-05-03 19:25 陳梓瀚(vczh) 閱讀(2850) | 評論 (11)  編輯
            JIT腳本引擎:C Minus語言語法樹定型      摘要: 今天照著C Minus的語法(略有修改)設(shè)計出了C Minus的語法樹。語法樹的設(shè)計盡量讓生成語法樹的代碼易于編寫。每一個結(jié)構(gòu)的意義十分明確,而且結(jié)構(gòu)與結(jié)構(gòu)之間不需要有相互聯(lián)系。下面是語法樹的代碼:  閱讀全文
            posted @ 2009-04-24 00:58 陳梓瀚(vczh) 閱讀(3071) | 評論 (5)  編輯
            JIT腳本引擎:開始做第一門編譯成機器碼的腳本引擎      摘要: 把中間指令都搞定了之后,得開始做一門JIT的腳本引擎了。但是這門腳本引擎不是用來寫的,而是用來給更高級的語言編譯的。這是什么意思呢?雖然我現(xiàn)在寫了個語法分析器,提供了語法樹,但是我的目的是讓我以后設(shè)計的更高級的語言可以編譯成這門相對底層的語言,而不是直接編譯成中間指令。這樣很多事情都會好做很多。

            這一門語言主要模仿C,提供指針、結(jié)構(gòu)、數(shù)組、基本類型和函數(shù)指針。還有extern函數(shù)做外部鏈接用。因為編譯成機器碼,所以可以直接把一個函數(shù)指針丟進我的腳本引擎,就可以這么用了。而且我的腳本里面的函數(shù)也可以直接作為一個函數(shù)指針提供出來。復(fù)合類型組要勇于跟C++交互。在C++與腳本里面聲明同樣的struct,不需要做額外工作,就可以互相使用了。
              閱讀全文
            posted @ 2009-04-18 00:17 陳梓瀚(vczh) 閱讀(3168) | 評論 (7)  編輯
            JIT腳本引擎:完成20個浮點函數(shù)      摘要:
            FPU寫起來還真是囧啊,下面20個函數(shù)實現(xiàn)到想死……
            Sin,Cos,Tan,Cot,Sec,Csc,ASin,ACos,ATan,ACot,ASec,ACsc,Sqrt,Exp,Ln,Abs,Round,Trunc,Ceil,Floor
            下面是這20個函數(shù)的匯編代碼,其中Exp更是登峰造極……  閱讀全文
            posted @ 2009-04-16 05:39 陳梓瀚(vczh) 閱讀(4915) | 評論 (3)  編輯
            JIT腳本引擎:測試除特殊浮點函數(shù)外的所有指令通過      摘要: 昨天為機器碼編譯程序?qū)懥藗€專用的unit test框架,今天用中間語言在這個框架上寫了個程序。程序?qū)?2個字符串連接起來,然后跟另外一個字符串進行比較,如果相等返回true。當(dāng)然程序如果返回false了,要么就是程序有問題,要么就是編譯器有問題。當(dāng)然現(xiàn)在是測試通過了。程序如下:  閱讀全文
            posted @ 2009-04-15 21:15 陳梓瀚(vczh) 閱讀(2130) | 評論 (1)  編輯
            JIT腳本引擎:成功將第一個腳本編譯成機器碼      摘要: 這次工作將一個中間語言的程序翻譯成了匯編,然后再翻譯成機器碼。這一次產(chǎn)生的匯編比較爛,到時候做個窺孔優(yōu)化稍微處理一下就好了。等上層的設(shè)施搞定之后再將這個中間語言到匯編的程序重寫。下面是一個菲薄納氣數(shù)列的例子。  閱讀全文
            posted @ 2009-04-14 00:11 陳梓瀚(vczh) 閱讀(2726) | 評論 (9)  編輯
            JIT腳本引擎:繼續(xù)工作      摘要: 大約兩個多星期沒做JIT了,經(jīng)過之前些其他代碼消遣,現(xiàn)在還是繼續(xù)做下去的好。目前的成果是完成了匯編數(shù)據(jù)結(jié)構(gòu)、完成了匯編到機器碼的轉(zhuǎn)換器、知道了成員對齊、調(diào)用轉(zhuǎn)換的約定、知道如何實現(xiàn)異常處理以及完成了中間指令的數(shù)據(jù)結(jié)構(gòu)和檢查。現(xiàn)在需要做的事中間指令到匯編的轉(zhuǎn)換程序。  閱讀全文
            posted @ 2009-04-10 23:30 陳梓瀚(vczh) 閱讀(1920) | 評論 (1)  編輯
            JIT腳本引擎:中間語言定稿并完成驗證工作      摘要: 經(jīng)過一個多星期的推敲,終于將中間語言定稿。為了屏蔽寄存器、堆棧、數(shù)值比較邏輯、跳轉(zhuǎn)、變量參數(shù)存放位置等,設(shè)計了以下中間語言。  閱讀全文
            posted @ 2009-03-19 20:49 陳梓瀚(vczh) 閱讀(2201) | 評論 (1)  編輯
            JIT腳本引擎:中間指令草稿      摘要: 中間指令主要用于解決以下問題:
            1、不同大小的整數(shù)、浮點、指針的互相轉(zhuǎn)換和計算
            2、寄存器分配
            3、跳轉(zhuǎn)
            4、調(diào)用轉(zhuǎn)換(stdcall、cdecl、fastcall)
            5、臨時存儲單位(變量等)

            因此指令在設(shè)計的時候需要
            1、不讓用戶知道東西是放在哪里的(沒有堆棧給你push和pop,而且變量在物理上不一定存在,譬如說可能在寄存器里面,或者直接優(yōu)化沒了等等)
            2、不讓用戶接觸到各種標(biāo)志位(譬如說那個惡心的浮點比較)
            3、不讓用戶接觸到stdcall、cdecl和fastcall的區(qū)別(因此call指令需要將所有參數(shù)一起寫入,而不是在之前push)
            4、不讓用戶接觸不同類型數(shù)據(jù)的轉(zhuǎn)換過程(全自動處理,就算你int32=fp32+int16,也是一條指令。)
            5、為了保持靈活性,聲明變量的時候只指出其大小,在使用變量的每一處地方標(biāo)記類型(因此可以在不同的地方標(biāo)記為不同的,可以救急)
              閱讀全文
            posted @ 2009-03-10 21:05 陳梓瀚(vczh) 閱讀(1815) | 評論 (0)  編輯
            JIT腳本引擎:成員對齊詳解      摘要: 為了讓編譯成x86后的代碼可以轉(zhuǎn)換成C++的函數(shù)指針,我們也必須處理成員對齊的事情。如果腳本里的結(jié)構(gòu)成員對齊跟C++不一致的話,會造成很多麻煩。下面是成員對齊的計算方法:  閱讀全文
            posted @ 2009-03-09 20:46 陳梓瀚(vczh) 閱讀(3746) | 評論 (2)  編輯
            JIT腳本引擎:浮點運算      摘要: x87的FPU支持很多種浮點運算,其中浮點運算的比較結(jié)果不放在EFLAGS里,我們需要人手取出。在比較a和b的時候,C2=0,C3=(a==b),C0=(a<b)。我們可以將FNSTSW AX指令將浮點標(biāo)志位復(fù)制到AX,然后通過讀取C3、C2和C0(分別位于第14、10、8位)來判斷結(jié)果。下面是一個求浮點數(shù)組最大值的匯編函數(shù):  閱讀全文
            posted @ 2009-03-06 04:56 陳梓瀚(vczh) 閱讀(1494) | 評論 (0)  編輯
            JIT腳本引擎:關(guān)于自己的異常處理函數(shù)在Release下失效的解決辦法      摘要: 本來昨天搞定了異常處理之后決定狂喜一天,誰知道今天用release編譯了一下之后竟然掛了!資料找了半天發(fā)現(xiàn)是Windows XP之后提供的一項保護SAFESEH搞的鬼。于是需要將自己的異常處理函數(shù)添加進PE頭的SAFESEH列表中。方法如下:  閱讀全文
            posted @ 2009-03-04 08:40 陳梓瀚(vczh) 閱讀(1896) | 評論 (2)  編輯
            JIT腳本引擎:使用匯編實現(xiàn)__try和__catch      摘要: 使用上一篇文章的資料,就可以使用匯編實現(xiàn)異常處理了。下面來看一個例子。  閱讀全文
            posted @ 2009-03-03 00:20 陳梓瀚(vczh) 閱讀(2275) | 評論 (1)  編輯
            JIT腳本引擎:stdcall、cdecl和fastcall      摘要: stdcall、cdecl和fastcall的參數(shù)都是從右到左入棧,并且返回值遵循以下規(guī)律:
            小于等于4字節(jié)結(jié)構(gòu)用EAX
            小于等于8字節(jié)結(jié)構(gòu)用EDX:EAX
            浮點數(shù)用ST(0)
            其他則在EAX放置一個指針,供返回值使用

            stdcall被調(diào)用者清棧,cdecl調(diào)用者清棧,fastcall被調(diào)用者清棧并且前兩個小于等于4字節(jié)的參數(shù)放入ECX和EDX。返回值和參數(shù)如果一方有構(gòu)造函數(shù)或析構(gòu)函數(shù)則不使用寄存器。
            于是今天用字符串形式的匯編寫了三種調(diào)用方法的求和函數(shù):  閱讀全文
            posted @ 2009-03-01 05:27 陳梓瀚(vczh) 閱讀(1801) | 評論 (9)  編輯
            JIT腳本引擎:用匯編寫了一個四則運算字符串分析程序      摘要: 這個匯編程序讀入一個字符串,并計算結(jié)果。支持加減乘除括號,不支持浮點數(shù),不支持查錯。以下是匯編以及注釋。匯編程序使用這篇文章的程序編譯并執(zhí)行。  閱讀全文
            posted @ 2009-02-26 09:05 陳梓瀚(vczh) 閱讀(2213) | 評論 (0)  編輯
            JIT腳本引擎:動態(tài)運行文本格式的匯編代碼      摘要: 今天完成了文本格式匯編代碼的編譯工作。這主要是為了調(diào)試,因為編譯器不可能產(chǎn)生文本格式的匯編代碼,這樣會很浪費資源。翻譯過程如下:  閱讀全文
            posted @ 2009-02-26 01:27 陳梓瀚(vczh) 閱讀(3373) | 評論 (2)  編輯
            JIT腳本引擎:完成鏈接器的核心功能      摘要: 光能編譯匯編還是不行的,因為很多東西在編譯的時候不知道,典型的比如放常量那部分的指針等等。主要原因還是因為x87(指FPU部分)沒有指令包含浮點立即數(shù),所有裝載浮點常數(shù)的指令都要求提供指針。所以諸如double a=1.2;之類的代碼,需要將1.2預(yù)先放置在一個地方然后確定指針的位置。

            于是就遇到了一個問題,如何將編譯后才知道的指針地址寫進去呢?  閱讀全文
            posted @ 2009-02-22 22:41 陳梓瀚(vczh) 閱讀(1930) | 評論 (1)  編輯
            JIT腳本引擎:將匯編語言編譯成機器碼寫進內(nèi)存并在C++中調(diào)用      摘要: 在完成了這里和這里的工作之后,就可以寫程序生成機器碼了。在生成機器碼的時候有如下注意事項:

            1:可執(zhí)行代碼所在的空間必須使用VirtualAlloc與PAGE_EXECUTE_READWRITE標(biāo)記分配。
            2:程序需要的常量空間、全局變量空間和指令空間需要分開在三個不同的地方。

            下面的例子使用一個struct保存指令的每一個部分,并且結(jié)合之前產(chǎn)生的指令譯碼表生成二進制碼。  閱讀全文
            posted @ 2009-02-22 07:08 陳梓瀚(vczh) 閱讀(4949) | 評論 (11)  編輯
            JIT腳本引擎:識別需要使用66H前綴區(qū)分的相同opcode指令的16位版本和32位版本      摘要: 關(guān)于這個問題實在沒有一個特別好的方法,基本方法還是來源于對intel手冊的觀察。因為指令表是從手冊上面復(fù)制出來的,但是上面又沒有標(biāo)明66H前綴,怎么辦呢?人肉找規(guī)律。這里貼出了區(qū)分的代碼(進對于之前挑選出來的絕大多數(shù)x86與x87指令)以及生成后的一個很有規(guī)則的文件以供參考。  閱讀全文
            posted @ 2009-02-16 21:53 陳梓瀚(vczh) 閱讀(2367) | 評論 (1)  編輯
            JIT腳本引擎:將匯編指令轉(zhuǎn)換為機器碼      摘要: 完整的轉(zhuǎn)換方法需要intel提供免費翻印下載的那本手冊。手冊過于精簡,因此這里給出的例子用于輔助對手冊進行理解。假設(shè)讀者閱讀過intel提供的手冊,或其他相關(guān)資料。  閱讀全文
            posted @ 2009-02-15 23:45 陳梓瀚(vczh) 閱讀(3666) | 評論 (5)  編輯
            JIT腳本引擎:x86子集匯編二進制碼表整理完成      摘要: 為了節(jié)省工作量,我打開intel的手冊,然后將那些框框里面的字符串復(fù)制到一個文本文件里面,最后寫一個C++程序用正則表達式處理。流程如下(含代碼和文件):  閱讀全文
            posted @ 2009-02-14 20:21 陳梓瀚(vczh) 閱讀(3135) | 評論 (2)  編輯

            中文字幕亚洲综合久久2| 无码国内精品久久人妻麻豆按摩| 国产一区二区久久久| 亚洲综合久久夜AV | 久久这里只有精品18| 久久这里只有精品久久| 国产香蕉久久精品综合网| 久久99国产精品二区不卡| 日本欧美国产精品第一页久久| 久久久久久久久久久久中文字幕| 亚洲国产精品热久久| 人妻精品久久久久中文字幕一冢本| 久久国产乱子伦精品免费强| 色播久久人人爽人人爽人人片AV| 久久99热狠狠色精品一区| 亚洲精品视频久久久| 四虎国产永久免费久久| 久久夜色精品国产亚洲| 国产精品成人精品久久久| 国产精品女同久久久久电影院| 欧美成a人片免费看久久| 国产激情久久久久影院小草 | 亚洲精品tv久久久久| 狠狠色婷婷综合天天久久丁香 | 韩国无遮挡三级久久| 久久夜色精品国产亚洲| 午夜精品久久久久9999高清| 99久久国产亚洲高清观看2024| 国产精品美女久久久久| 久久精品国产99久久久古代| 久久久这里有精品| 一本大道久久香蕉成人网| 欧美成a人片免费看久久| 久久精品成人免费观看97| 久久99精品久久久久久水蜜桃 | 9久久9久久精品| 狠狠色丁香久久婷婷综合五月 | 2021最新久久久视精品爱 | 91麻豆国产精品91久久久| 伊色综合久久之综合久久| 日韩欧美亚洲综合久久影院Ds |