Lua 디자인 과 구현 (2) - Lua 의 데이터 형식

3739 단어 Lua
Lua 디자인 과 구현
QQ: 1841545843 메 일 박스:[email protected]
  • Lua 에서 우 리 는 통용 되 는 데이터 구 조 를 사용 합 니 다 luaTvalue 는 Lua 가상 컴퓨터 에 저장 해 야 할 모든 데이터 형식 을 통일 적 으로 표시 합 니 다.
  • 먼저 C 언어 에서 통용 데이터 구 조 를 실현 하 는 일반적인 방법 은 두 가지 가 있다.
  • 데 이 터 를 저장 할 필드 가 필요 합 니 다
  • 서로 다른 유형의 데 이 터 를 저장 해 야 한다
  • 두 가지 방법 으로 표시 할 수 있다.
  • 하나의 공공 데이터 구 조 를 기본 유형 으로 정의 하고 다른 기본 유형 은 이 구체 적 인 유형 에서 파생 된 것
    struct base{
        int type;       //          
        
    };
    
    struct string {
        struct base info;
        int len;
        cahr* data[0];
        
    };
    
    struct number {
        struct base info;
        double num;
        
    };
    
  • 이다.
  • 연합 을 사용 하여 모든 데 이 터 를 패키지
    struct string{
     int len;
     char * data[0];
        
    };
    
    struct number {
        double num;
        
    };
    
    struct value {
        int type;
        union{
            string str;
            number num;
            
        } value;
        
    };
    
  • Lua 유 니 버 설 데이터 구조의 실현 은 주로 숫자, 문자열, 관련 표, nil, userdata, Lua 함수, C 함수
    /*
    ** basic types                     //                     
    */
    #define LUA_TNONE		(-1)       //              
                                  
    #define LUA_TNIL		0          //              
    #define LUA_TBOOLEAN		1      //             
    #define LUA_TLIGHTUSERDATA	2      //              void*
    #define LUA_TNUMBER		3          //             lua_Number 
    #define LUA_TSTRING		4          //            TString
    #define LUA_TTABLE		5          //              Table
    #define LUA_TFUNCTION		6      //             CClosure\ LClosure
    #define LUA_TUSERDATA		7      //             void*
    #define LUA_TTHREAD		8          //  Lua   ,    lua_State
    
    Lua 내부 에서 하나의 매크로 로 데이터 형식 에 GC
    // LUS_TSTRING           GC  
    #define iscollectable(o)	(ttype(o) >= LUA_TSTRING)
    
    가 필요 하 다 는 것 을 나타 낸다. GC 작업 을 해 야 하 는 데이터 형식 에는 모두 CommonHeader 매크로 가 정의 하 는 구성원 이 있 고 이 구성원 은 구조 체 가 정의 하 는 초기 부분 에 있다.
    typedef struct Table {
      CommonHeader;                 //     GC     
      lu_byte flags;                /* 1<

    CommonHeader的定义:

    /*
    ** Common Header for all collectable objects (in macro(   ) form, to be
    ** included in other objects)
    ** 
    ** next      GC     
    ** tt         ,             
    ** marked  GC      
    */
    
    #define CommonHeader	GCObject *next; lu_byte tt; lu_byte marked
    
    또 하나의 GCheader 구조 체 가 있 는데 그 중에서 구성원 은 CommonHeader
    /*
    ** Common header in struct form
    */
    typedef struct GCheader {
      CommonHeader;
    } GCheader;
    
    만 Lua 에서 GCobject 를 사용 하고 연합 체 는 쓰레기 회수 가 필요 한 모든 데이터 유형 을 포괄 한다
    /*
    ** Union of all collectable objects
    */
    union GCObject {
      GCheader gch;
      union TString ts;
      union Udata u;
      union Closure cl;
      struct Table h;
      struct Proto p;
      struct UpVal uv;
      struct lua_State th;  /* thread */
    };
    
    결론:
  • 쓰레기 수 거 를 해 야 하 는 모든 Lua 데이터 형식 은 반드시 CommonHeader 를 이 구조 체 로 정의 하 는 초기 부분 일 것 이다.
  • GCobject 라 는 연합 체 는 쓰레기 회수 가 필요 한 모든 데이터 형식 을 모두 포함 시 켜 서로 다른 유형의 데 이 터 를 찾 는 것 이 편리 하 다.
  • /*
    ** Union of all Lua values 
    **               
    */
    typedef union {
      GCObject *gc;
      void *p;
      lua_Number n;
      int b;
    } Value;
    
    
    
    
    
    /*
    ** Tagged Values
    */
    
    #define TValuefields	Value value; int tt
    
    typedef struct lua_TValue {
      TValuefields;
    } TValue;
    
    
    Lua 통용 데이터 구조 조직
  • 구체 적 인 유형 에는 CommonHeader 가 있 고 모든 데이터 형식 이 통용 되 는 필드
  • 를 저장 합 니 다.
  • Tvalue 는 모든 데 이 터 를 통일 적 으로 나타 내 는 데이터 구조 로 서 내부 적 으로 연합 체 Value 를 사용 하여 모든 데 이 터 를 포함한다.
  • 좋은 웹페이지 즐겨찾기