Implementou uma biblioteca de desenvolvimento multiplataforma em linguagem C

De: gite

Link: https://gitee.com/tboox/tbox

Introdução ao TBOX

TBOX é uma biblioteca de desenvolvimento multiplataforma implementada em linguagem C.

Para cada plataforma, uma interface unificada é encapsulada, o que simplifica as operações comuns em diversos processos de desenvolvimento, para que você possa prestar mais atenção ao desenvolvimento de aplicações práticas durante o processo de desenvolvimento, ao invés de perder tempo com compatibilidades de interfaces triviais, e fazer total uso de Alguns recursos exclusivos de cada plataforma são otimizados.

O objetivo deste projeto é tornar o desenvolvimento em C mais fácil e eficiente.

As plataformas atualmente suportadas são: Windows, Macosx, Linux, Android, iOS, *BSD, etc.

Vários modos de compilação são suportados pelo xmake:

  • Lançamento: compilação da versão oficial, desabilitar informações de depuração, declarações, vários mecanismos de detecção, habilitar otimizações do compilador

  • Depuração: modo de depuração, informações detalhadas de depuração, asserção, detecção de memória fora dos limites, vazamento de memória, análise de concorrência de bloqueio e outros mecanismos de detecção são habilitados por padrão

  • Pequeno: Compilação minimizada, todos os módulos de extensão são desabilitados por padrão e as otimizações minimizadas do compilador são habilitadas

  • Micro: Para a plataforma incorporada, apenas o microkernel tbox é compilado, apenas a interface multiplataforma mais básica é fornecida e a biblioteca gerada tem apenas cerca de 64K (implementação de interface libc leve integrada)

característica

Biblioteca de streams

Para dados de fluxo como http, arquivo, soquete, dados, etc., ele implementa uma interface unificada para leitura e gravação e suporta: bloqueio, não bloqueio, três modos de leitura e gravação assíncronos.

Ele suporta a adição de várias camadas de fluxos de filtro no meio para filtragem de fluxo, realizando durante a leitura e executando operações como descompactação, conversão de codificação e criptografia ao mesmo tempo, o que reduz bastante o uso de memória.

Fornecer principalmente os seguintes módulos:

  • stream: fluxo genérico sem bloqueio para processamento geral de io individual, enquanto suporta corrotinas para transferências assíncronas.

  • transfer: Streamer, que mantém a transmissão de dois streams.

  • static_stream: fluxo estático otimizado para buffers de dados estáticos para análise de dados leve e rápida.

Biblioteca de corrotina

  • Suporte de comutação de corrotina rápido e eficiente

  • Forneça suporte multiplataforma, consulte o algoritmo de comutação de núcleo, reescreva-o e otimize-o. Arquiteturas atualmente suportadas: x86, x86_64, arm, arm64, mips32

  • Fornecer suporte de comunicação de dados entre corrotinas de canal, com base em modelos de produção e consumidor

  • Fornece semáforo, suporte de bloqueio de corrotina

  • Ambos os módulos socket e stream suportam nativamente corrotinas e podem alternar perfeitamente entre threads e corrotinas

  • Fornece instâncias de servidor simples baseadas em corrotinas como http e file. Com apenas algumas centenas de linhas de código, um servidor io de alto desempenho pode ser escrito a partir do soquete. A lógica do código é mais clara que o modo de retorno de chamada assíncrono.

  • Ao mesmo tempo, fornece suporte para os modos de corrotina stackfull e stackless. A corrotina stackless é mais leve (cada corrotina ocupa apenas dezenas de bytes) e a comutação é mais rápida (alguma facilidade de uso será sacrificada)

  • Suporte epoll, kqueue, poll, select e IOCP

  • Suporta espera e agendamento simultâneos de soquetes, pipe io e processo em corrotinas e pollers

base de dados

  • Unifique e simplifique a interface de operação do banco de dados, adapte-se a várias fontes de dados, conecte e abra automaticamente bancos de dados suportados por meio de um URL unificado e use o modelo de iterador para enumeração de dados.

  • Atualmente suporta sqlite3 e mysql dois bancos de dados relacionais, e também pode ser customizado e estendido para usar outros bancos de dados relacionais.

biblioteca xml

  • Fornece dois modos de análise, DOM e SAX, para xml. O modo SAX adota o modo de iteração externa, que tem maior flexibilidade e desempenho, e pode escolher um caminho específico para análise.

  • O processo de análise é completamente baseado em fluxo, por isso é altamente transmitível. Ele pode realizar um serviço completo de download, descompactação, transcodificação e análise, e também pode analisar dados em grande escala com pouca memória.

  • Fornecer gravador de xml para dar suporte à geração de xml

banco de memória

  • Referindo-se à implementação do mecanismo de gerenciamento de memória do kernel linux e realizando várias transformações e otimizações, um conjunto completo de arquitetura de gerenciamento de pool de memória exclusivo para TBOX é implementado.

  • No modo de depuração, problemas comuns de memória, como vazamentos de memória, estouro de memória fora dos limites e cobertura de sobreposição de memória, podem ser facilmente detectados e localizados, e estatísticas e análises breves do uso geral da memória são executadas.

  • Ele faz pleno uso de dados de blocos grandes, dados de blocos pequenos e dados de string, evitando a geração de um grande número de fragmentos externos e fragmentos internos. A operação de alocação tem várias otimizações, e a eficiência é O(1) em 96% dos casos.

biblioteca de contêineres

  • Fornece contêineres comuns, como hash, lista vinculada, array, queue, stack, min max heap, etc.

  • Suporta vários tipos de membros comuns e, no início do contêiner original, seus tipos de membros também podem ser totalmente personalizados e estendidos.

  • Todos os contêineres oferecem suporte a operações de iterador.

  • A maioria dos contêineres pode dar suporte a operações de serialização e desserialização baseadas em fluxo.

Biblioteca de algoritmos

  • Fornece vários algoritmos de ordenação: ordenação por bolhas, ordenação por heap, ordenação rápida, ordenação por inserção.

  • Fornece vários algoritmos de pesquisa: travessia linear, pesquisa binária.

  • Fornece vários algoritmos de travessia, exclusão e estatísticos.

  • Usando iterator como interface, realiza-se a separação de algoritmo e container, semelhante ao stl, mas implementado por c, que é mais leve.

biblioteca de rede

  • Implemente o módulo cliente http

  • implementar cookies

  • Implementar análise e armazenamento em cache de DNS

  • Implementar ssl (suporte openssl, polarssl, mbedtls)

  • Suporte ipv4, ipv6

  • Suporta modo assíncrono através de corrotina

biblioteca de matemática

  • Fornece suporte aritmético de ponto fixo de várias precisões

  • Fornece um gerador de números aleatórios

biblioteca libc

  • Uma implementação leve de libc, totalmente multiplataforma e otimizada para diferentes arquiteturas.

  • A maioria das operações de string e string larga são suportadas.

  • Várias interfaces de operação que não diferenciam maiúsculas de minúsculas para strings estendidas e strings largas

  • Extensões memset_u16, memset_u32etc. interfaces e altamente otimizadas, especialmente indicadas para programas de renderização de gráficos

biblioteca libm

  • Uma implementação leve de algumas interfaces libm, bem como encapsulamento de interfaces de sistema comumente usadas. (Apenas uma parte foi implementada no momento e será totalmente implementada no futuro)

  • Expanda algumas interfaces comuns, adicione cálculos de versão inteira para funções comuns, como sqrt, log2, etc., que são altamente otimizadas, não envolvem operações de ponto flutuante e são adequadas para ambientes incorporados.

biblioteca de objetos

  • A biblioteca CoreFoundation leve, semelhante a uma maçã, suporta objetos comuns, como objeto, dicionário, matriz, string, número, data e dados, e pode estender facilmente a serialização de objetos personalizados.

  • Suporta serialização e desserialização de formatos xml, json, binário e plist da apple (xplist/bplist). Além disso, ele implementa seu próprio formato de serialização binária e realiza criptografia simples para texto simples.Na premissa de não afetar o desempenho, o tamanho serializado é 30% menor que o do bplist.

Biblioteca da plataforma

  • Fornece interfaces de sistema comuns, como arquivo, diretório, soquete, thread, hora, etc.

  • Fornecer interface atômica, atomic64

  • Fornece temporizadores de alta precisão e baixa precisão

  • Fornece operações de pool de threads de alto desempenho

  • Fornecer eventos, mutex, semáforo, spinlock e outros eventos, mutex, semáforo, operações de spinlock

  • Fornece uma interface para obter informações da pilha de funções, o que é conveniente para depuração e localização de erros

  • Fornece uma interface de carregamento de biblioteca dinâmica multiplataforma (se o sistema suportar)

  • Fornece io poller, encapsulamento multiplataforma para epoll, poll, select, kqueue

  • Fornece uma interface de comutação de contexto de plataforma cruzada, usada principalmente para implementação de corrotina, e a eficiência de comutação é muito alta

Biblioteca de compactação

  • Suporte a compactação e descompactação zlib/zlibraw/gzip (requer suporte à biblioteca zlib de terceiros).

biblioteca de codificação de caracteres

  • Suporta transcodificação mútua entre utf8, utf16, gbk, gb2312, uc2, uc4 e suporta formatos endian grandes e pequenos.

Biblioteca de utilitários

  • Implementar codec base64/32

  • Implemente algoritmos de hash comuns, como crc32, adler32, md5, sha1, etc.

  • Implemente ferramentas auxiliares de depuração, como saída de log e declaração

  • Implementar codificação e decodificação de URL

  • Ele implementa interfaces relacionadas à operação de bits, suporta análise de vários formatos de dados e pode executar operações de análise em campos de 8 bits, 16 bits, 32 bits, 64 bits, float, double e qualquer bit e suporta big-endian, little-endian e local-end Otimizado para algumas operações, como static_stream e stream, existem interfaces relacionadas para encapsulá-los, o que é conveniente para análise rápida de dados no stream.

  • Implemente swap16, swap32, swap64 e outras operações de troca de bits e otimize para cada plataforma.

  • Implemente algumas interfaces avançadas de processamento de bits, como: estatísticas rápidas do bit 0, contagem rápida de bits do 0 inicial e do 1 inicial, contagem rápida de bits do 01 final

  • Implemente um módulo singleton, que pode encapsular rapidamente objetos estáticos e objetos de instância e obter segurança de thread global

  • Implemente o módulo de opção, analise parâmetros de linha de comando e forneça operações de análise e criação de opções de linha de comando rápidas e convenientes, o que é muito útil para escrever programas de terminal

Biblioteca de Expressões Regulares

  • Suporta operações de correspondência e substituição

  • Suporta modos globais, multilinhas, insensíveis a maiúsculas e minúsculas e outros

  • Use a biblioteca regular pcre, pcre2 e posix

Alguns projetos usando tbox:

  • gbox

  • vm86

  • xmake

  • itracer

  • mais itens

compilar

Instale primeiro: 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

exemplo

#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_str(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
    tb_getchar();

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

Acho que você gosta

Origin blog.csdn.net/weixin_41055260/article/details/123814157
Recomendado
Clasificación