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

腳本語言中以 Table 實現物件導向的輕量級設計

     編輯:關於C語言

完成自製腳本編譯器與虛擬機後,針對腳本層面的 OO 支援,我設計了一套以 table 為核心的輕量級機制,靈感源自 Lua 但做了關鍵改進,讓成員存取與方法呼叫更直觀。

核心設計

  • 唯一複雜資料型別:table,同時作陣列與雜湊表使用。
  • 類別即一個 table,裡面存放方法函數。
  • 實例建立時,第一個元素(a[0])指向類別表(虛函數表 vtbl)。
  • -> 呼叫語法糖:a->sum() 編譯期轉為 a[0]->sum(a),自動傳入 self。
  • 成員變數以 . 開頭:.a 在方法內自動展開為 _self.a。
  • 方法第一參數必須以 _ 開頭(如 _self),編譯器以此識別 self 參數。
  • _ 開頭變數強制為區域變數,其餘為全域,簡化編譯並防筆誤。

範例程式碼

A = {};
function A.sum(_self) {
    return .a + .b;        // 自動展開 _self.a + _self.b
}

function A.print(_self) {
    print(->sum());        // 展開 _self->sum()
    return _self;
}

a = {A, .a=100, .b=200};   // a[0]=A (vtbl), .a/.b 為實例成員
a->print();                // 呼鏈:a->print() → A.print(a) → print(A.sum(a)) → 300

關鍵優勢

  1. 無需手寫 self:./-> 前綴隱式綁定,比 Lua 的 function t:f() 更徹底。
  2. 虛函數語意:所有方法均為虛函數,支援多型覆寫。
  3. 靜態方法支援:A.static_func() 直接呼叫,不傳 self。
  4. 編譯期單次掃描:語法糖在編譯階段展開,執行期零開銷。

實作細節

  • 虛擬機指令集新增 GET_MEMBER/CALL_METHOD 對應 ./->。
  • 編譯器符號表記錄 _ 變數屬性,語義分析階段驗證 self 參數命名規範。
  • 多返回值設計(參考 Lua tail call)提升效率,避免臨時 table 分配觸發 GC。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved