天天看點

[開源]一個用C語言實作的跨平台開發庫,使C開發更加的簡單高效

作者:一飛開源
一飛開源,介紹創意、新奇、有趣、實用的免費開源應用、系統、軟體、硬體及技術,一個探索、發現、分享、使用與互動交流的開源技術社群平台。緻力于打造活力開源社群,共建開源新生态!

一、開源項目簡介

[開源]一個用C語言實作的跨平台開發庫,使C開發更加的簡單高效

TBOX是一個用c語言實作的跨平台開發庫。

針對各個平台,封裝了統一的接口,簡化了各類開發過程中常用操作,使你在開發過程中,更加關注實際應用的開發,而不是把時間浪費在瑣碎的接口相容性上面,并且充分利用了各個平台獨有的一些特性進行優化。

這個項目的目的,是為了使C開發更加的簡單高效。

二、開源協定

使用Apache-2.0開源協定

三、界面展示

[開源]一個用C語言實作的跨平台開發庫,使C開發更加的簡單高效

四、功能概述

特性

流庫

針對http、file、socket、data等流資料,實作統一接口進行讀寫,并且支援: 阻塞、非阻塞、異步 三種讀寫模式。 支援中間增加多層filter流進行流過濾,實作邊讀取,内部邊進行解壓、編碼轉換、加密等操作,極大的減少了記憶體使用。

主要提供以下子產品:

  • stream:通用非阻塞流,用于一般的單獨io處理,同時支援協程以實作異步傳輸。
  • transfer:流傳輸器,維護兩路流的傳輸。
  • static_stream:針對靜态資料buffer優化的靜态流,用于輕量快速的資料解析。

協程庫

  • 快速高效的協程切換支援(具體性能參考:基準測試報告)
  • 提供跨平台支援,核心切換算法參考boost,并且對其進行重寫和優化,目前支援架構:x86, x86_64, arm, arm64, mips32
  • 提供channel協程間資料通信支援,基于生産、消費者模型
  • 提供信号量、協程鎖支援
  • socket、stream都子產品原生支援協程,并且可線上程和協程間進行無縫切換
  • 提供http、file等基于協程的簡單伺服器執行個體,隻需幾百行代碼,就可以從socket開始寫個高性能io伺服器,代碼邏輯比異步回調模式更加清晰
  • 同時提供stackfull, stackless兩種協程模式支援,stackless協程更加的輕量(每個協程隻占用幾十個bytes),切換更快(會犧牲部分易用性)
  • 支援epoll, kqueue, poll, select 和 IOCP

資料庫

  • 統一并簡化資料庫操作接口,适配各種資料源,通過統一的url來自動連接配接打開支援的資料庫,資料的枚舉采用疊代器模型。
  • 目前支援sqlite3以及mysql兩種關系型資料庫,也可自定義擴充使用其他關系型資料庫。

xml庫

  • 針對xml提供DOM和SAX兩種解析模式,SAX方式采用外部疊代模式,靈活性和性能更高,并且可以選擇指定路徑,進行解析。
  • 解析過程完全基于stream,是以是高度流化的,可以實作邊下載下傳、邊解壓、邊轉碼、邊解析一條龍服務,使用較低的記憶體也可以解析大規模資料。
  • 提供xml writer以支援對xml生成

記憶體庫

  • 參考linux核心記憶體管理機制的實作,并對其進行各種改造和優化,所實作的TBOX獨有的一整套記憶體池管理架構。
  • 調試模式下,可以輕松檢測并定位記憶體洩露、記憶體越界溢出、記憶體重疊覆寫等常見記憶體問題,并對整體記憶體的使用進行了統計和簡要分析。
  • 針對大塊資料、小塊資料、字元串資料進行了充分的利用,避免了大量外部碎片和内部碎片的産生。配置設定操作進行了各種優化,96%的情況下,效率都是在O(1)。

容器庫

  • 提供哈希、連結清單、數組、隊列、堆棧、最小最大堆等常用容器。
  • 支援各種常用成員類型,在原有的容器期初上,其成員類型還可以完全自定義擴充。
  • 所有容器都支援疊代器操作。
  • 大部分容器都可以支援基于stream的序列化和反序列化操作。

算法庫

  • 提供各種排序算法:冒泡排序、堆排序、快速排序、插入排序。
  • 提供各種查找算法:線性周遊、二分法搜尋。
  • 提供各種周遊、删除、統計算法。
  • 以疊代器為接口,實作算法和容器的分離,類似stl,但是c實作的,更加輕量。

網絡庫

  • 實作http用戶端子產品
  • 實作cookies
  • 實作dns解析與緩存
  • 實作ssl(支援openssl, polarssl, mbedtls)
  • 支援ipv4、ipv6
  • 支援通過協程實作異步模式

數學運算庫

  • 提供各種精度的定點運算支援
  • 提供随機數生成器

libc庫

  • libc的一個輕量級實作,完全跨平台,并且針對不同架構進行了優化。
  • 支援大部分字元串、寬字元串操作。
  • 擴充字元串、寬字元串的各種大小寫不敏感操作接口
  • 擴充memset_u16、memset_u32等接口,并對其進行高度優化,尤其适合圖形渲染程式

libm庫

  • libm部分接口的一個輕量級實作,以及對常用系統接口的封裝。(目前隻實作了部分,之後有時間會完全實作掉)
  • 擴充部分常用接口,增加對sqrt、log2等常用函數的整數版本計算,進行高度優化,不涉及浮點運算,适合嵌入式環境使用。

object庫

  • 輕量級類apple的CoreFoundation庫,支援object、dictionary、array、string、number、date、data等常用對象,并且可以友善擴充自定義對象的序列化。
  • 支援對xml、json、binary以及apple的plist(xplist/bplist)格式序列化和反序列化。 并且實作自有的binary序列化格式, 針對明文進行了簡單的加密,在不影響性能的前提下,序列化後的大小比bplist節省30%。

平台庫

  • 提供file、directory、socket、thread、time等常用系統接口
  • 提供atomic、atomic64接口
  • 提供高精度、低精度定時器
  • 提供高性能的線程池操作
  • 提供event、mutex、semaphore、spinlock等事件、互斥、信号量、自旋鎖操作
  • 提供擷取函數堆棧資訊的接口,友善調試和錯誤定位
  • 提供跨平台動态庫加載接口(如果系統支援的話)
  • 提供io輪詢器,針對epoll, poll, select, kqueue進行跨平台封裝
  • 提供跨平台上下文切換接口,主要用于協程實作,切換效率非常高

壓縮庫

  • 支援zlib/zlibraw/gzip的壓縮與解壓(需要第三方zlib庫支援)。

字元編碼庫

  • 支援utf8、utf16、gbk、gb2312、uc2、uc4 之間的互相轉碼,并且支援大小端格式。

實用工具庫

  • 實作base64/32編解碼
  • 實作crc32、adler32、md5、sha1等常用hash算法
  • 實作日志輸出、斷言等輔助調試工具
  • 實作url編解碼
  • 實作位操作相關接口,支援各種資料格式的解析,可以對8bits、16bits、32bits、64bits、float、double以及任意bits的字段進行解析操作,并且同時支援大端、小端和本地端模式,并針對部分操作進行了優化,像static_stream、stream都有相關接口對其進行了封裝,友善在流上進行快速資料解析。
  • 實作swap16、swap32、swap64等位交換操作,并針對各個平台進行了優化。
  • 實作一些進階的位處理接口,例如:位0的快速統計、前導0和前導1的快速位計數、後導01的快速位計數
  • 實作單例子產品,可以對靜态對象、執行個體對象進行快速的單例封裝,實作全局線程安全
  • 實作option子產品,對指令行參數進行解析,提供快速友善的指令行選項建立和解析操作,對于寫終端程式還是很有幫助的

正規表達式庫

  • 支援比對和替換操作
  • 支援全局、多行、大小寫不敏感等模式
  • 使用pcre, pcre2和posix正則庫

一些使用tbox的項目:

  • gbox
  • vm86
  • xmake
  • itrace
  • 更多項目

五、技術選型

目前支援的平台有:

  • Windows
  • Macosx
  • Linux
  • Android
  • iOS

通過xmake)支援各種編譯模式:

  • Release: 正式版編譯,禁用調試資訊、斷言,各種檢測機制,啟用編譯器優化
  • Debug: 調試模式,預設啟用詳細調試資訊、斷言、記憶體越界檢測、記憶體洩漏、鎖競争分析等檢測機制
  • Small: 最小化編譯,預設禁用所有擴充子產品,啟用編譯器最小化優化
  • Micro: 針對嵌入式平台,僅僅編譯tbox微核心,僅提供最基礎的跨平台接口,生成庫僅64K左右(内置輕量libc接口實作)

編譯

請先安裝: xmake

# 預設直接編譯目前主機平台
$ cd ./tbox
$ xmake

# 編譯mingw平台
$ cd ./tbox
$ xmake f -p mingw --sdk=/home/mingwsdk 
$ xmake

# 編譯iphoneos平台
$ cd ./tbox
$ xmake f -p iphoneos 
$ xmake

# 編譯android平台
$ cd ./tbox
$ xmake f -p android --ndk=xxxxx
$ xmake

# 交叉編譯
$ cd ./tbox
$ xmake f -p linux --sdk=/home/sdk #--bin=/home/sdk/bin
$ xmake           

例子

#include "tbox/tbox.h"

int main(int argc, char** argv)
{
    // init tbox
    if (!tb_init(tb_null, tb_null)) return 0;

    // trace
    tb_trace_i("hello tbox");

    // init vector
    tb_vector_ref_t vector = tb_vector_init(0, tb_element_cstr(tb_true));
    if (vector)
    {
        // insert item
        tb_vector_insert_tail(vector, "hello");
        tb_vector_insert_tail(vector, "tbox");

        // dump all items
        tb_for_all (tb_char_t const*, cstr, vector)
        {
            // trace
            tb_trace_i("%s", cstr);
        }

        // exit vector
        tb_vector_exit(vector);
    }

    // init stream
    tb_stream_ref_t stream = tb_stream_init_from_url("http://www.xxx.com/file.txt");
    if (stream)
    {
        // open stream
        if (tb_stream_open(stream))
        {
            // read line
            tb_long_t size = 0;
            tb_char_t line[TB_STREAM_BLOCK_MAXN];
            while ((size = tb_stream_bread_line(stream, line, sizeof(line))) >= 0)
            {
                // trace
                tb_trace_i("line: %s", line);
            }
        }

        // exit stream
        tb_stream_exit(stream);
    }

    // wait 
    getchar();

    // exit tbox
    tb_exit();
    return 0;
}           

六、源碼位址

通路一飛開源:https://code.exmay.com/

繼續閱讀