• <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,譬如說數(shù)組,譬如說函數(shù)類型等等這些本不能用托管語言自己來實現(xiàn)的類(C++是唯一的一個所有東西都可以用類庫來彌補的語言)。因此花費了數(shù)日,用ManagedX實現(xiàn)了它的聲明和一些代碼,然后external一些函數(shù)。最終,ManagedX寫的mscorlib會被編譯成NativeX,而external的幾個函數(shù)自然會用NativeX自己來寫。譬如說如何比較兩個string的大小,這個托管語言自己顯然是搞不定的。

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

                第一個版本的ManagedX還需要做出一點折衷,譬如說數(shù)組的維度不能超過10。這里的維度指的是a[,,,,,,,,,],而不是a[][][][][][][][][][]。譬如說函數(shù)類型的參數(shù)數(shù)量不能超過10(但是函數(shù)的參數(shù)數(shù)量卻可以,這里只針對函數(shù)類型)。主要是因為,為了讓ManagedX可以被編譯成NativeX,那么勢必不可能運行的時候才動態(tài)生成某個類(模板除外,因為我的NativeX==C+template)。因此一維、二維乃至十維的數(shù)組當然是10個不同的類(你可以使用一個二維的十維數(shù)組的數(shù)組去模擬一個十二維的數(shù)組,這毫無問題)。不過為了避免我真的將一批相似的類重復寫10次,我使用了一年多前開發(fā)的Fpmacro來做。Fpmacro是一個語法不同的類似C語言宏的擴展,但是沒有C語言的宏的所有陷阱,而且其實是一門函數(shù)是語言,帶有類似lambda表達式的東西,每一個函數(shù)都被設計成一個返回字符串的函數(shù),參數(shù)可以是數(shù)組、字符串或者另一個函數(shù)。而且語法經(jīng)過了優(yōu)化,完全沒有多余的東西。這里給一個例子,譬如說聲明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部分基本完成,剩下的十幾個函數(shù)寫的NativeX則等到編譯成NativeX的部分完成之后再寫。到了這里,一共實現(xiàn)了:
                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(譬如沒有l(wèi)ambda expression,因為被重寫成了一個內(nèi)部類),最后編譯成NativeX。
            posted on 2011-06-26 09:15 陳梓瀚(vczh) 閱讀(4003) 評論(17)  編輯 收藏 引用 所屬分類: VL++3.0開發(fā)紀事

            評論:
            # 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 | 戰(zhàn)魂小筑
            為啥不用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
            完全不是一個性質(zhì)的玩意兒。
            它的那個東西更像是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,是一門動態(tài)語言,你可以試試。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 18:33 | Error
            雖然現(xiàn)在還不知道樓主在說什么,但是依然覺得樓主V6、樓主牛鞭,,,  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:36 | clayui
            @陳梓瀚(vczh)
            試試freescript,這是一個現(xiàn)實的問題,而現(xiàn)實是比較殘酷的,那么freescript與V8相比有什么優(yōu)點?我的意思是如果別人用V8,而我用freescript,那么我是否比別人更有優(yōu)勢?  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:38 | clayui
            @空明流轉
            我的確不是很懂這個,所以可能會說出讓你笑掉大牙的話,呵呵,那么,我看介紹說的是“通用多語言腳本平臺”,AVM2是一個腳本引擎,這2者究竟有何區(qū)別呢?望賜教。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:47 | 陳梓瀚(vczh)
            @clayui
            這世界上任何一門動態(tài)語言都不會比其他動態(tài)語言更有優(yōu)勢——如果你拿他當腳本用的話。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 19:51 | 陳梓瀚(vczh)
            @clayui
            這個嘛,我的初始目的是想做一個公共的后端,讓以后拿新的語法做實驗會變得非常容易,并且把結構拆散有利于別人學習編譯原理,最后順便實現(xiàn)把動態(tài)語言編譯成本低代碼的夢想。想要做到最后一步根據(jù)現(xiàn)在的速度,估計還得有幾年的時間。

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

            這里的區(qū)別就是,倘若我在后面那幾年把我想做的優(yōu)化都做完的話,那以后想支持什么新語言(眾口難調(diào)啊),都做到這個后端上去,那就變成一個parser的工作,而不是一個腳本引擎整個的工作了。譬如說javascript,譬如說python,譬如說ruby,雖然語法看上去差很遠,但其實都沒什么區(qū)別,不需要每一門都單獨重做一次  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 20:14 | clayui
            @陳梓瀚(vczh)
            基本上明白了,呵呵,謝謝,我想我要的應該就是你優(yōu)化后的東西吧,希望幾年后我還能用上你的腳本語言。根據(jù)我的理解,你應該是想要實現(xiàn)一個統(tǒng)一的parser引擎?如果這個能做好,說不定可以成為所有腳本語言進行parser的一個工業(yè)標準?恩,假如是這樣,那么,真的很有意思,呵呵。  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-06-26 21:36 | 陳梓瀚(vczh)
            @clayui
            不是統(tǒng)一的parser,parser沒什么好統(tǒng)一的,只是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等等這些工具的話,估計我們公司的編譯器開發(fā)完成要猴年馬月了。即時這樣天天小問題還不斷,目前在做怎么支持直接到android平臺運行,android這個平臺還真是復雜,關sdk工具命令就N多。樓主加油!  回復  更多評論
              
            # re: Vczh Library++3.0之山寨mscorlib.dll 2011-07-08 08:04 | 陳梓瀚(vczh)
            @蔣楓亦
            嗯,我在嘗試山寨一個后端,ANTLR那樣子的前端我已經(jīng)搞定了。  回復  更多評論
              
            久久精品国产清自在天天线| 久久夜色精品国产噜噜麻豆| 精品国产青草久久久久福利| 岛国搬运www久久| 久久久久国产亚洲AV麻豆| 亚洲欧美另类日本久久国产真实乱对白 | 国产成人久久777777| 久久久久久噜噜精品免费直播| 国产成人久久精品一区二区三区| 精品久久人妻av中文字幕| 久久综合九色综合久99| 人妻精品久久久久中文字幕69| 久久天天躁狠狠躁夜夜不卡 | 亚洲欧美一级久久精品| 久久er99热精品一区二区| 午夜精品久久久久久影视777| 97久久久久人妻精品专区| 综合久久一区二区三区 | 国产精品免费福利久久| 亚洲国产成人精品女人久久久 | 色综合久久综精品| 无码AV中文字幕久久专区| 久久一区二区免费播放| 久久综合欧美成人| 国产Av激情久久无码天堂| 亚洲国产欧洲综合997久久| 香蕉99久久国产综合精品宅男自 | 久久精品无码一区二区日韩AV| 日本欧美久久久久免费播放网| 伊人久久无码精品中文字幕| 欧美麻豆久久久久久中文| 精品久久久无码中文字幕天天| 久久精品人人做人人爽电影| 精品少妇人妻av无码久久| 久久精品无码一区二区无码| 色欲av伊人久久大香线蕉影院 | 久久综合亚洲鲁鲁五月天| 性做久久久久久久久老女人| 青青热久久国产久精品| 久久亚洲精品国产亚洲老地址| 欧美亚洲日本久久精品|