# DPIR **Repository Path**: ChehgAnXu/DPIR ## Basic Information - **Project Name**: DPIR - **Description**: DPIR是数据交换语言的中间代表,一个程序只要支持了DPIR就等于支持了XML、JSON、YAML等所有数据交换语言。 DPIR还可以作为不同数据交换语言之间相互转换的中介,只要实现了一种数据交换语言和DPIR之间的相互转换,就等于实现了该数据交换语言和所有其它数据交换语言之间的相互转换。 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-28 - **Last Updated**: 2022-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **此处只是简介,详细文档请稳步Wiki** # DPIR:用于数据交换语言的中间代表 所谓数据交换语言就是像 **JSON、XML、YAML** 这样的用于在程序与程序之间、程序与用户之间进行数据交换的语言;传统的数据交换方式普遍都采用这些数据交换语言来实现。 但是传统的数据交换方式有两大弊端: 1. 使用不同数据交换语言的程序之间无法交换数据。 2. 为了方便人工编辑,数据交换语言都是可读性很强的文本形式,这种形式不够底层,程序解析起来很麻烦。 为了解决这些弊端,我从 **LLVM** 中得到灵感——为什么不设计一种用于数据交换语言的中间代表(Intermediate Representation)? 我将这种 **IR** 命名为 **DPIR**(Data Propagating Intermediate Representation)。 **DPIR** 要足够底层,使程序可以很方便地对它进行读写,同时所有数据交换语言都要能够在它们自己和 **DPIR** 之间自由转换。 这样一来,所有程序只要能够支持 **DPIR**,就相当于支持了所有的数据交换语言,而且还省去了解析数据交换语言的麻烦。 当然,还要开发出一套工具用来在各种数据交换语言和 **DPIR** 之间进行相互转换。 # DPIR的初步设计 为了照顾种类繁多的字符编码,**DPIR** 的字符串要用单独的字符串文件保存,非字符串内容则用数据文件保存。 ### 字符串文件 字符串文件的命名格式为`name.dpir-str-code`。 其中`name`是源文件名,比如从`config.json`文件转换来的字符串文件`name`就是`config`;`code`是字符串编码格式名,比如采用 **UTF-8** 编码格式保存的字符串文件名就是`config.dpir-str-utf8`。 一个 **DPIR** 中可以有多个采用不同编码格式的字符串文件。 字符串文件中的每个字符串都以`\0`结尾,通过由1开始的索引访问,0索引用于代表空字符串。 ### 数据文件 数据文件的命名格式为`name.dpir-data`。 **以类GO语法描述的数据文件格式:** ```go // 全文件结构,所有字段对齐到block。 type full_file struct{ fileHead file_head // 文件头,记录了一些全局元信息。 root array_table/map_tabl/list_table/struct_table/string/integer/float/complex // root是整个数据结构的根,可以是数组table, map table, list table, struct table或字符串、整数、浮点数、复数。 // 后续是root的子孙table们(如果有的话);每个table都对齐到整block。 } //-------------------------------------------------- //******************************************************************* type file_head struct{ blockSizeLog uint8 // 用于指定block的size,(以byte为单位):blockSize=1 << blockSizeLog fileHeadSize uint8 // file_head的Size(以block为单位) majorVersion uint8 // 主版本号 minorVersion uint8 // 副版本号 generalEncodeFlag byte // UTF和ASCII在多种字符集中都兼容,所以要单独用一个byte来表示,以便可以和其它字符集自由组合。 charSetFlag byte // 支持的字符集 encodeFormatFlag byte // 支持的字符编码格式,需要和charSetFlag配合使用。 rootTypeFlag byte // 用于指定root的type sonKeyTypeFlag byte // (当rootTypeFlag为TYPE_MAP时)指定对应的map_table的所有entry的keyType sonValueTypeFlag byte // (当rootTypeFlag为TYPE_ARRAY或TYPE_MAP时)指定对应的array_table或map_table的所有entry的valueType // file_head全文件只有一个,占不了多少空间,所以file_head中的sonKeyTypeFlag和sonValueTypeFlag即使用不到也会保留。 reserveFileHead [n]byte // 保留空间,用于将file_head补齐到整block。 } // generalEncodeFlag: const( ASCII = 1<