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_u32
etc. 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 ---