• <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
                由于Vczh Library++3.0的托管語言ManagedX被設計成編譯到本地語言NativeX,因此山寨一個mscorlib.dll是必不可少的。不過我的mscorlib.dll只包含最低限度的代碼。譬如說string,譬如說數組,譬如說函數類型等等這些本不能用托管語言自己來實現的類(C++是唯一的一個所有東西都可以用類庫來彌補的語言)。因此花費了數日,用ManagedX實現了它的聲明和一些代碼,然后external一些函數。最終,ManagedX寫的mscorlib會被編譯成NativeX,而external的幾個函數自然會用NativeX自己來寫。譬如說如何比較兩個string的大小,這個托管語言自己顯然是搞不定的。

                因此這里就比較麻煩了,需要做一些工程上的麻煩事情。首先,若干個ManagedX文件被編譯成一個單獨的NativeX文件,然后這個生成的NativeX文件跟另一個手寫的NativeX文件再一起被編譯成一個assembly。這就跟把C#編譯成C差不多。

                第一個版本的ManagedX還需要做出一點折衷,譬如說數組的維度不能超過10。這里的維度指的是a[,,,,,,,,,],而不是a[][][][][][][][][][]。譬如說函數類型的參數數量不能超過10(但是函數的參數數量卻可以,這里只針對函數類型)。主要是因為,為了讓ManagedX可以被編譯成NativeX,那么勢必不可能運行的時候才動態生成某個類(模板除外,因為我的NativeX==C+template)。因此一維、二維乃至十維的數組當然是10個不同的類(你可以使用一個二維的十維數組的數組去模擬一個十二維的數組,這毫無問題)。不過為了避免我真的將一批相似的類重復寫10次,我使用了一年多前開發的Fpmacro來做。Fpmacro是一個語法不同的類似C語言宏的擴展,但是沒有C語言的宏的所有陷阱,而且其實是一門函數是語言,帶有類似lambda表達式的東西,每一個函數都被設計成一個返回字符串的函數,參數可以是數組、字符串或者另一個函數。而且語法經過了優化,完全沒有多余的東西。這里給一個例子,譬如說聲明10個Array的Fpmacro代碼:
              1 $$include:Common.fpm
              2 
              3 $$define $DIMENTION_FIELD_NAME($element) dimSize$element
              4 $$define $DIMENTION_PARAMETER_NAME($element) _$element
              5 $$define $DIMENTION_PARAMETER_DEFINITION($element) int $DIMENTION_PARAMETER_NAME($element)
              6 $$define $DIMENTION_PARAMETER_NAME_IN_ARRAY($element) indices[$element]
              7 
              8 $$define $DIMENTION_FIELD($element) $$begin
              9         private int $DIMENTION_FIELD_NAME($element);
             10 $( )
             11 $$end
             12 
             13 $$define $DIMENTION_FIELD_SETTER($element) $$begin
             14             $DIMENTION_FIELD_NAME($element) = $DIMENTION_PARAMETER_NAME($element);
             15 $( )
             16 $$end
             17 
             18 $$define $DIMENTION_SIZE_CASE($element) $$begin
             19                 case $element:
             20                     return $DIMENTION_FIELD_NAME($element);
             21 $( )
             22 $$end
             23 
             24 $$define $DIMENTION_CHECK($element) $$begin
             25             if($DIMENTION_PARAMETER_NAME($element)<0 || $DIMENTION_PARAMETER_NAME($element)>=$DIMENTION_FIELD_NAME($element))
             26                 throw new ArgumentOutOfRangeException($(")$DIMENTION_PARAMETER_NAME($element)$("));
             27 $( )
             28 $$end
             29 
             30 $$define $DIMENTION_SUMMERS($elements) $$begin
             31   $$define $DIMENTION_SUMMER($index) $$begin
             32             sum*=$DIMENTION_FIELD_NAME($sub($sub($elements,1),$index));
             33             index+=sum*$DIMENTION_PARAMETER_NAME($sub($sub($elements,2),$index));
             34 $( )
             35   $$end
             36 $loop($sub($elements,1),0,$DIMENTION_SUMMER)
             37 $$end
             38 
             39 $$define $ARRAY_IMPLEMENTATION($elements) $$begin
             40 $( )
             41     generic<inout T>
             42     public sealed class Array$elements : Array
             43     {
             44 $( )
             45         public constructor($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ), Array<T> src=nullbool copy=true)
             46         {
             47 $loop($elements,0,$DIMENTION_FIELD_SETTER)
             48             Initialize(this.Length, src, copy);
             49         }
             50 $( )
             51 $loop($elements,0,$DIMENTION_FIELD)
             52         public override int GetDimCount()
             53         {
             54             return $elements;
             55         }
             56 $( )
             57         public override int GetDimSize(int dim)
             58         {
             59             switch(dim)
             60             {
             61 $loop($elements,0,$DIMENTION_SIZE_CASE)
             62                 default:
             63                     throw new ArgumentOutOfRangeException("dim");
             64             }
             65         }
             66 $( )
             67         public override int Length
             68         {
             69             get
             70             {
             71                 return $loopsep($elements,0,$DIMENTION_FIELD_NAME,$(*));
             72             }
             73         }
             74 $( )
             75         public override int GetStartIndexFromIndices(params int[] indices)
             76         {
             77             if(indices.Length!=$elements)
             78             {
             79                 throw new ArgumentOutOfRangeException("indices");
             80             }
             81             return GetStartIndex[$loopsep($elements,0,$DIMENTION_PARAMETER_NAME_IN_ARRAY,$(,))];
             82         }
             83 $( )
             84         public int GetStartIndex($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ))
             85         {
             86 $loop($elements,0,$DIMENTION_CHECK)
             87             int index=$DIMENTION_PARAMETER_NAME($sub($elements,1));
             88             int sum=1;
             89             $DIMENTION_SUMMERS($elements)
             90             return index;
             91         }
             92 $( )
             93         public override T GetElement(params int[] indices)
             94         {
             95             return Get(GetStartIndexFromIndices(indices));
             96         }
             97 $( )
             98         public override void SetElement(T value, params int[] indices)
             99         {
            100             Set(value, GetStartIndexFromIndices(indices));
            101         }
            102 $( )
            103         public T operator get[]($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ))
            104         {
            105             return Get($loopsep($elements,0,$DIMENTION_PARAMETER_NAME,$(,) ));
            106         }
            107 $( )
            108         public T operator set[](T value, $loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,) ))
            109         {
            110             return Set(value, $loopsep($elements,0,$DIMENTION_PARAMETER_NAME,$(,) ));
            111         }
            112 $( )
            113     }
            114 $$end
            115 
            116 namespace System
            117 {
            118     generic<inout T>
            119     public abstract class Array : IEnumerable<T>
            120     {
            121         protected intptr gchandle=0;
            122         protected external void Initialize(int size, Array<T> src, bool copy);
            123         public external T Get(int position);
            124         public external void Set(T value, int position);
            125 $( )
            126         public external void CopyTo(intptr pointer, int fromStart, int length);
            127         public external void CopyTo(Array<T> array, int fromStart, int length, int toStart);
            128 $( )
            129         public abstract int GetDimCount();
            130         public abstract int GetDimSize(int dim);
            131         public abstract int Length{get;}
            132         public abstract int GetStartIndexFromIndices(params int[] indices);
            133         public abstract T GetElement(params int[] indices);
            134         public abstract void SetElement(T value, params int[] indices);
            135 $( )
            136         private class Enumerator : IEnumerator
            137         {
            138             private Array<T> array;
            139             private int index;
            140 $( )
            141             public constructor(Array<T> array)
            142             {
            143                 this.array=array;
            144                 this.index=-1;
            145             }
            146 $( )
            147             public bool MoveNext()
            148             {
            149                 if(index==array.Length-1)
            150                 {
            151                     return false;
            152                 }
            153                 else
            154                 {
            155                     index++;
            156                     return true;
            157                 }
            158             }
            159 $( )
            160             public T Current
            161             {
            162                 get
            163                 {
            164                     return array.Get(index);
            165                 }
            166             }
            167 $( )
            168             object IEnumerator::Current
            169             {
            170                 get
            171                 {
            172                     return array.Get(index);
            173                 }
            174             }
            175         }
            176 $( )
            177         IEnumerator<T> IEnumerable<T>::GetEnumerator()
            178         {
            179             return new Enumerator(this);
            180         }
            181 $( )
            182         IEnumerator IEnumerable::GetEnumerator()
            183         {
            184             return new Enumerator(this);
            185         }
            186 $( )
            187     }
            188 $( )
            189     generic<inout T>
            190     public class ReadonlyArray
            191     {
            192         private T[] items;
            193 $( )
            194         public constructor(T[] items)
            195         {
            196             this.items=items;
            197         }
            198 $( )
            199         public int Length
            200         {
            201             get
            202             {
            203                 return this.items.Length;
            204             }
            205         }
            206 $( )
            207         public T operator get[](int index)
            208         {
            209             return this.items[index];
            210         }
            211     }
            212 $loop($MAX_ELEMENT_COUNT(),1,$ARRAY_IMPLEMENTATION)
            213 }

                會被擴展成(太長cppblog編輯器性能太爛導致響應速度無法忍受,下載代碼并打開UnitTest\Binary\ScriptCoreLibrary\System.CoreManaged\Array.txt自行閱讀)

                山寨mscorlib.dll的ManagedX部分基本完成,剩下的十幾個函數寫的NativeX則等到編譯成NativeX的部分完成之后再寫。到了這里,一共實現了:
                Array<T>
                Array1<T> .. Array10<T>
                Attribute
                AttributeUsageAttribute
                AutoGeneratedAttribute
                NotInstantiableAttribute
                StructBaseAttribute
                DefaultValueAttribute
                VariadicParameterAttribute
                EnumItemBase
                EnumItemManager
                Exception
                IndexOutOfRangeException
                ArgumentOutOfRangeException
                WrongFormatException
                TypeConversionException
                NotImplementedException
                Delegate
                DelegateTarget
                MethodDelegate
                BroadcastDelegate
                Function<R> .. Function<R, T0 .. T9>
                Procedure, Procedure<T0> .. Procedure<T0 .. T9>
                Event, Event<T0> .. Event<T0 .. T9>
                IEnumerator
                IEnumerable
                IEnumerator<T>
                IEnumerable<T>
                SInt8 .. SInt64
                UInt8 .. UInt64
                Single, Double, Char, Bool, Void
                Object
                String
                Type

                從明天開始就要做ManagedX的語義分析器了。接下來的路還很長。語義分析結束之后,要把ManagedX展開變成一份更長但是包含的東西更少的ManagedX(譬如沒有lambda expression,因為被重寫成了一個內部類),最后編譯成NativeX。
            posted on 2011-06-26 09:15 陳梓瀚(vczh) 閱讀(4002) 評論(17)  編輯 收藏 引用 所屬分類: VL++3.0開發紀事

            評論:
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 16:47 | 空明流轉
            樓主威武!(別刪我留言。。。)  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 17:42 | clayui
            才知道樓主是這么一個牛人,也非常感謝樓主能去clayui踢館,所以,我今天,不是來踢館的:)我只有1個問題,我想用樓主的東西,不知道效率如何,跟adobe的AVM2比起來怎么樣?  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:04 | 戰魂小筑
            為啥不用Live Writer呢,編輯起來多方便  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:18 | lwch
            完全看不懂這是神馬玩意...  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:24 | 空明流轉
            @clayui
            完全不是一個性質的玩意兒。
            它的那個東西更像是C#。一門Pure JIT的語言。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:27 | 陳梓瀚(vczh)
            @lwch
            你只要想象一下string是如何寫出來的,就知道了……為什么M¥要提供C++/CLI,基本上就是為了這個。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:29 | 陳梓瀚(vczh)
            @clayui
            嗯,我還是在山寨C#。不過距離能用還很遠……倒是再主頁上置頂了一個freescript,是一門動態語言,你可以試試。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:33 | Error
            雖然現在還不知道樓主在說什么,但是依然覺得樓主V6、樓主牛鞭,,,  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:36 | clayui
            @陳梓瀚(vczh)
            試試freescript,這是一個現實的問題,而現實是比較殘酷的,那么freescript與V8相比有什么優點?我的意思是如果別人用V8,而我用freescript,那么我是否比別人更有優勢?  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:38 | clayui
            @空明流轉
            我的確不是很懂這個,所以可能會說出讓你笑掉大牙的話,呵呵,那么,我看介紹說的是“通用多語言腳本平臺”,AVM2是一個腳本引擎,這2者究竟有何區別呢?望賜教。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:47 | 陳梓瀚(vczh)
            @clayui
            這世界上任何一門動態語言都不會比其他動態語言更有優勢——如果你拿他當腳本用的話。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:51 | 陳梓瀚(vczh)
            @clayui
            這個嘛,我的初始目的是想做一個公共的后端,讓以后拿新的語法做實驗會變得非常容易,并且把結構拆散有利于別人學習編譯原理,最后順便實現把動態語言編譯成本低代碼的夢想。想要做到最后一步根據現在的速度,估計還得有幾年的時間。

            而一個腳本引擎,就是做來給你用的,目的很單純。

            這里的區別就是,倘若我在后面那幾年把我想做的優化都做完的話,那以后想支持什么新語言(眾口難調?。甲龅竭@個后端上去,那就變成一個parser的工作,而不是一個腳本引擎整個的工作了。譬如說javascript,譬如說python,譬如說ruby,雖然語法看上去差很遠,但其實都沒什么區別,不需要每一門都單獨重做一次  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 20:14 | clayui
            @陳梓瀚(vczh)
            基本上明白了,呵呵,謝謝,我想我要的應該就是你優化后的東西吧,希望幾年后我還能用上你的腳本語言。根據我的理解,你應該是想要實現一個統一的parser引擎?如果這個能做好,說不定可以成為所有腳本語言進行parser的一個工業標準?恩,假如是這樣,那么,真的很有意思,呵呵。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 21:36 | 陳梓瀚(vczh)
            @clayui
            不是統一的parser,parser沒什么好統一的,只是another CLR/llvm/其他什么的罷了……  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-27 06:15 | 千暮(zblc)
            - -bnr 兩個美元符號真惡心  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-07-06 01:11 | 蔣楓亦
            寫編譯器的工作量實在很大,各種考慮,這還是在用了工具的情況下,要是沒有ANTLR ,LLVM等等這些工具的話,估計我們公司的編譯器開發完成要猴年馬月了。即時這樣天天小問題還不斷,目前在做怎么支持直接到android平臺運行,android這個平臺還真是復雜,關sdk工具命令就N多。樓主加油!  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-07-08 08:04 | 陳梓瀚(vczh)
            @蔣楓亦
            嗯,我在嘗試山寨一個后端,ANTLR那樣子的前端我已經搞定了。  回復  更多評論
              
            亚洲国产日韩综合久久精品| 久久久无码精品亚洲日韩京东传媒| 久久综合噜噜激激的五月天| 国内精品久久九九国产精品| 国产aⅴ激情无码久久| 国产精品午夜久久| 亚洲国产天堂久久综合网站| 久久久这里有精品| 精品久久久久久综合日本| 国产精品美女久久久网AV| 久久久www免费人成精品| 亚洲综合久久综合激情久久| yy6080久久| 99久久香蕉国产线看观香| 久久99精品久久久久久久不卡| 日日躁夜夜躁狠狠久久AV| 久久久久噜噜噜亚洲熟女综合| 久久精品国产亚洲av瑜伽| 国产精品女同久久久久电影院| 欧洲国产伦久久久久久久| 亚洲人成无码网站久久99热国产| 久久久久无码国产精品不卡| 久久超碰97人人做人人爱| 久久国产精品99精品国产| 久久亚洲sm情趣捆绑调教 | 亚洲а∨天堂久久精品9966| 精品一区二区久久| 久久99国产亚洲高清观看首页| 亚洲伊人久久大香线蕉综合图片| 四虎久久影院| 无夜精品久久久久久| 久久一区二区免费播放| 亚洲综合伊人久久综合| 免费精品久久天干天干| 精品久久久久久无码不卡| 亚洲国产成人久久综合一区77| 欧美伊人久久大香线蕉综合69| 午夜精品久久久内射近拍高清 | 久久综合久久美利坚合众国| 亚洲精品无码久久久| 久久无码AV一区二区三区|