青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-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) 閱讀(4025) 評論(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那樣子的前端我已經搞定了。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久**毛片大全| 久久成人精品电影| 欧美激情精品久久久| 亚洲精品视频一区二区三区| 亚洲精品日日夜夜| 欧美天堂在线观看| 久久狠狠婷婷| 久久中文字幕一区二区三区| 亚洲伦理中文字幕| 亚洲私人影院| 激情综合色综合久久| 亚洲激情偷拍| 国产精品国产自产拍高清av| 欧美主播一区二区三区美女 久久精品人| 亚洲中无吗在线| 1024国产精品| 一区二区三区久久久| 国产亚洲高清视频| 亚洲国产欧美精品| 国产精品嫩草影院av蜜臀| 久久久久久亚洲综合影院红桃| 久久网站热最新地址| 在线综合亚洲| 久久精品国产成人| 宅男在线国产精品| 久久久久久9| 亚洲综合色网站| 久久久综合视频| 亚洲一区二区成人| 久久综合五月| 性xx色xx综合久久久xx| 免费成人美女女| 欧美区日韩区| 久久免费国产精品1| 欧美日韩在线三区| 欧美不卡视频一区发布| 国产免费亚洲高清| 亚洲精品免费网站| 亚洲电影免费在线| 最新国产拍偷乱拍精品| 先锋影音国产一区| 欧美国产日韩一区二区| 久久天堂av综合合色| 欧美四级在线观看| 亚洲片国产一区一级在线观看| 国产免费观看久久黄| 夜夜爽www精品| 亚洲日本aⅴ片在线观看香蕉| 欧美一区国产一区| 亚洲资源在线观看| 欧美日韩成人在线| 亚洲国产一区二区三区青草影视| 国产综合视频| 欧美一区二区三区免费观看视频 | 中文国产成人精品久久一| 亚洲国产高清高潮精品美女| 性一交一乱一区二区洋洋av| 午夜精品久久久久久久蜜桃app| 欧美精品免费视频| 91久久久在线| 一本色道久久88综合亚洲精品ⅰ| 噜噜噜91成人网| 欧美激情1区| 91久久精品国产91性色tv| 久久综合网hezyo| 亚洲第一网站| 亚洲精品综合精品自拍| 欧美精品在线一区二区| 日韩视频精品在线观看| 亚洲私拍自拍| 国产精品揄拍一区二区| 午夜一区在线| 久久综合导航| 亚洲三级观看| 欧美日韩一区不卡| 亚洲一区二区黄| 久久激情综合网| 永久免费精品影视网站| 久热精品视频在线观看一区| 亚洲高清成人| 亚洲深夜激情| 国产欧美精品久久| 久久精品国产免费观看| 欧美大片18| 正在播放亚洲| 国产视频欧美视频| 免费不卡在线观看| 一卡二卡3卡四卡高清精品视频| 亚洲女人天堂av| 国产一二三精品| 免费看亚洲片| 亚洲午夜极品| 欧美成人一区二区三区| 久久亚洲私人国产精品va媚药| 欧美国产日韩在线| 亚洲一区二区三区在线观看视频 | 欧美国产91| 亚洲一二三四久久| 欧美电影免费观看| 亚洲一区综合| 亚洲国产成人tv| 欧美三区美女| 久久在线免费观看| 中文久久精品| 亚洲福利视频三区| 久久精品成人| 亚洲精品美女在线观看播放| 欧美久久久久久久久久| 午夜视频久久久| 亚洲全黄一级网站| 亚洲国产成人在线视频| 一本一本久久a久久精品综合妖精| 亚洲欧美一区二区激情| 亚洲承认在线| 国产精品久久久久久超碰| 美女国产一区| 久久av在线看| 一区二区三区四区蜜桃| 欧美成人国产一区二区| 欧美在线www| 亚洲香蕉视频| 99综合在线| 一本大道久久a久久精品综合| 免费毛片一区二区三区久久久| 亚洲综合激情| 亚洲午夜黄色| 99亚洲一区二区| 亚洲区国产区| 亚洲高清视频的网址| 韩国v欧美v日本v亚洲v| 国产精品亚洲不卡a| 欧美三级电影大全| 欧美日本免费| 欧美刺激性大交免费视频 | 中文一区字幕| 99国产欧美久久久精品| 亚洲激情女人| 亚洲国产视频a| 在线成人h网| 伊大人香蕉综合8在线视| 国产婷婷色一区二区三区在线 | 久久精品色图| 久久精品导航| 久久嫩草精品久久久精品一| 亚洲永久免费av| 亚洲欧美另类在线| 先锋影音久久| 久久成人18免费观看| 欧美亚洲免费电影| 欧美日韩精品免费观看| 欧美激情亚洲自拍| 久久久久久久综合| 欧美在线播放高清精品| 久久久久久久久久看片| 欧美一区二区视频观看视频| 久久国产精品一区二区| 久色成人在线| 欧美福利电影网| 国产精品电影在线观看| 国产伦精品一区二区三区在线观看| 国产精品美女午夜av| 国产亚洲精品资源在线26u| 极品中文字幕一区| 亚洲激情视频网站| 国产精品99久久久久久www| 欧美一区二区观看视频| 麻豆精品传媒视频| 亚洲精品色图| 亚洲淫片在线视频| 久久精品一区二区三区不卡牛牛| 麻豆久久婷婷| 国产精品成人观看视频免费| 国产精品永久| 亚洲精品在线观看免费| 午夜精彩国产免费不卡不顿大片| 久久躁日日躁aaaaxxxx| 91久久精品国产91性色| 亚洲欧美日韩精品| 欧美va亚洲va日韩∨a综合色| 欧美色欧美亚洲另类七区| 老司机久久99久久精品播放免费| 亚洲美女区一区| 欧美中文在线观看| 亚洲国产中文字幕在线观看| 亚洲一区二区三区视频| 狼人天天伊人久久| 欧美三级不卡| 亚洲日本va午夜在线影院| 欧美中文日韩| 在线视频精品一| 欧美成人午夜影院| 国内自拍视频一区二区三区 | 国产精品主播| 一区二区国产精品| 欧美成人精品高清在线播放| 亚洲午夜一区二区三区| 欧美va天堂| 亚洲福利一区| 久久久久在线| 亚洲资源av|