Struct 是什麼?
Struct(結構)是C語言中的關鍵字, 是讓使用者能定義固定存取結構的工具, 它能劃分一塊記憶體的空間並給予助憶符號, 也就是屬性(Property)或也可稱為欄位(Filed), 來存取記體. 配合它使用的還有Bit Struct(位元結構)與Potiner(指標). Bit Struct與Struct的作用相同, 但Bit Struct劃分空間的單位為Bit不同於Struct劃分空間的單位Byte; 而指標用於指向一記憶體位置, 所有透過該指標的操作, 皆會影響到該塊記憶體, 而且依指標型別的不同, 可再被區分為整數指標, 浮點數指標, Struct指標, 指標的指標. 而Eva_Struct在Java中提供上述這些C語言功能的模擬.
Struct 與各種語言的關係.
Struct與指標, 在過去非常受到重視的原因常常是因為它的執行效能, 但在效能並非唯一的場合中, Struct與指標也仍有利用價值. 事實上, 所有與I/O有關的場合都很適合Struct與指標的運用, 因為他們可以幫難以理解的二元資料加上容易理解的命名, 並且簡單地解決編碼與解碼的工作.
其實I/O的需求, 不論在任何程式語言中都有, 例如在Java之後才開始發展的C#, 就完整地添加了Struct與指標的支援; 而在手機應用方面, 相對於Android平台的iOS, 其所使用的Objective-C 也能支援Struct與指標; 而有些程式語言, 雖然未支援Struct與指標, 卻以更好的資料parsing方式來取代它們在I/O中的地位, 例如Erlang裡就支援位元語法, 能很簡單地將資料串中的任意指定位元取出與放入, 等同於Struct的功能, 而Scala中也可以透過Extractor的功能再去寫出位元語法的功能.
但Java未對於I/O沒有程式語言層級上的支援, 多只是透過ByteBuffer去讀寫I/O stream的資料. 若只是單純地讀寫資料, ByteBuffer是夠用了, 但若是要對資料進行編碼解碼, 則使用者就必需再自行去處理各種編解碼上的位移與運算. 而Eva_Struct試圖去彌補這個缺憾, 在Java中提供Struct與指標的相關功能.
其實I/O的需求, 不論在任何程式語言中都有, 例如在Java之後才開始發展的C#, 就完整地添加了Struct與指標的支援; 而在手機應用方面, 相對於Android平台的iOS, 其所使用的Objective-C 也能支援Struct與指標; 而有些程式語言, 雖然未支援Struct與指標, 卻以更好的資料parsing方式來取代它們在I/O中的地位, 例如Erlang裡就支援位元語法, 能很簡單地將資料串中的任意指定位元取出與放入, 等同於Struct的功能, 而Scala中也可以透過Extractor的功能再去寫出位元語法的功能.
但Java未對於I/O沒有程式語言層級上的支援, 多只是透過ByteBuffer去讀寫I/O stream的資料. 若只是單純地讀寫資料, ByteBuffer是夠用了, 但若是要對資料進行編碼解碼, 則使用者就必需再自行去處理各種編解碼上的位移與運算. 而Eva_Struct試圖去彌補這個缺憾, 在Java中提供Struct與指標的相關功能.
Struct 與各種媒體間的關係.
從Java的角度去看, 資料在各種媒體間傳輸, 在不同的媒體上, 資料需以不同的格式存在. 要對網路進行I/O時, 資料以Byte陣列的型式被寫入網路卡Buffer, 在Java中進行處理時, 資料以物件的型式存在, 而當資料存放在資料庫時, 又變成以表格資料的型式存在.
當資料由一個媒體, 傳送到另一個媒體時, 就需要去做格式轉換的工作. 當資料從網路卡Buffer被讀入時, Byte陣列會被變成物件 , 而當物件要存入資料庫時, 又把進行ORM把物件變成表格資料. 但若是在Java中所做的處理很少, 僅是為了把網路資料存入資料庫, 或把資料庫的資料讀出傳送至網路, 這麼多的轉換其實並不划算.
但若使用Eva_Struct, 就可以很簡單地把Byte陣列包裹成Struct物件, 並且把Struct物件以欄位資料的方式儲存在資料表的欄位中, 其中除了Struct物件的建立需要運算的成本外, 機乎沒有其它任何的轉換成本.
當資料由一個媒體, 傳送到另一個媒體時, 就需要去做格式轉換的工作. 當資料從網路卡Buffer被讀入時, Byte陣列會被變成物件 , 而當物件要存入資料庫時, 又把進行ORM把物件變成表格資料. 但若是在Java中所做的處理很少, 僅是為了把網路資料存入資料庫, 或把資料庫的資料讀出傳送至網路, 這麼多的轉換其實並不划算.
但若使用Eva_Struct, 就可以很簡單地把Byte陣列包裹成Struct物件, 並且把Struct物件以欄位資料的方式儲存在資料表的欄位中, 其中除了Struct物件的建立需要運算的成本外, 機乎沒有其它任何的轉換成本.
Eva_Struct 的使用時機.
- C所寫的程式與Java所寫的程式, 想透過網路互相溝通時, 讓雙方的Coder/Decoder部份的程式碼盡量保持一致.
- 想將原本由C所寫的程式, 改成Java版的時侯.
- 想減少因為傳輸至不同媒體, 所需做的資料轉換的時侯.