首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Vczh Library++ 3.0:以 ManagedX 實作 mscorlib.dll 核心類別

     編輯:關於C語言

背景動機

Vczh Library++ 3.0 的託管語言 ManagedX 設計為編譯至原生語言 NativeX(C++ 模板實現),因此必須提供最小版 mscorlib.dll,包含 String、陣列、委派/函式型別等無法由 ManagedX 自身實作的核心類別。

工程流程

  1. 數個 .mx (ManagedX) 檔案編譯為單一 .nx (NativeX) 檔案。
  2. 該生成檔與手寫的 NativeX 檔案一同編譯為組件。
  3. 類似 C# → C → 組件的兩階段編譯模型。

妥協與限制(首版)

  • 陣列維度上限 10(指 a[,,,,,,,,,] 多維陣列,非交錯陣列)。
  • 函式型別參數數量上限 10。
  • 原因:NativeX = C++ 模板,需預先具現化所有型別組合,無法執行期動態產生。

Fpmacro:型別產生器

為避免手寫 10 組近似類別,開發專用巨集語言 Fpmacro:

  • 語法經優化,無 C 巨集陷阱,具備函式式特性(lambda、高階函式)。
  • 每個函式回傳字串,參數可為陣列、字串、函式。
  • 用於大量產生重複模式程式碼(如多維陣列類別)。

Fpmacro 產生 10 維陣列類別範例(節錄)

$$define $DIMENTION_FIELD_NAME($element) dimSize$element
$$define $DIMENTION_PARAMETER_NAME($element) _$element
$$define $DIMENTION_FIELD($element) $$begin
    private int $DIMENTION_FIELD_NAME($element);
$$end

$$define $ARRAY_IMPLEMENTATION($elements) $$begin
    generic<inout T>
    public sealed class Array$elements : Array {
        public constructor($loopsep($elements,0,$DIMENTION_PARAMETER_DEFINITION,$(,)), Array<T> src=null, bool copy=true) {
            $loop($elements,0,$DIMENTION_FIELD_SETTER)
            Initialize(this.Length, src, copy);
        }
        $loop($elements,0,$DIMENTION_FIELD)
        public override int GetDimCount() { return $elements; }
        public override int GetDimSize(int dim) {
            switch(dim) {
                $loop($elements,0,$DIMENTION_SIZE_CASE)
                default: throw new ArgumentOutOfRangeException("dim");
            }
        }
        public override int Length {
            get { return $loopsep($elements,0,$DIMENTION_FIELD_NAME,$(*)); }
        }
        // ... GetStartIndexFromIndices, GetStartIndex 等
    }
$$end

$loop(10, 1, $ARRAY_IMPLEMENTATION) // 產生 Array1 ~ Array10

關鍵巨集功能

巨集用途
$loop(n, start, macro)迴圈展開,對 start..start+n-1 依次套用巨集
$loopsep(..., separator)迴圈展開並以分隔符連接(如參數列表用逗號)
$sub(a,b)整數減法(巨集展開期計算)
$$define ... $$begin ... $$end定義多行巨集模板

外部函式

部分核心操作(如字串比較)無法在 ManagedX 純邏輯實現,標記為 external,由手寫 NativeX(C++ 模板)提供實作,編譯時連結。

啟示

語言自宿主的核心挑戰:核心類別必須先存在才能編譯編譯器。解法為「最小核心用目標語言手寫 → 其餘用自身語言實作 → 兩階段編譯」。Fpmacro 展示元程式設計在大量樣板程式碼產生上的威力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved