Implementé una biblioteca de desarrollo multiplataforma en lenguaje C

De: casa rural

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

Introducción a TBOX

TBOX es una biblioteca de desarrollo multiplataforma implementada en lenguaje C.

Para cada plataforma, se encapsula una interfaz unificada, lo que simplifica las operaciones comunes en varios procesos de desarrollo, de modo que pueda prestar más atención al desarrollo de aplicaciones prácticas durante el proceso de desarrollo, en lugar de perder tiempo en la compatibilidad de interfaz trivial y hacer completa Se optimiza el uso de Algunas funciones exclusivas de cada plataforma.

El propósito de este proyecto es hacer que el desarrollo en C sea más fácil y eficiente.

Las plataformas compatibles actualmente son: Windows, Macosx, Linux, Android, iOS, *BSD, etc.

Se admiten varios modos de compilación a través de xmake:

  • Lanzamiento: compilación de la versión oficial, deshabilitar la información de depuración, aserciones, varios mecanismos de detección, habilitar las optimizaciones del compilador

  • Depuración: el modo de depuración, la información detallada de depuración, la aserción, la detección de memoria fuera de los límites, la fuga de memoria, el análisis de competencia de bloqueo y otros mecanismos de detección están habilitados de forma predeterminada.

  • Pequeño: compilación minimizada, todos los módulos de extensión están deshabilitados de forma predeterminada y las optimizaciones minimizadas del compilador están habilitadas

  • Micro: para la plataforma integrada, solo se compila el micronúcleo tbox, solo se proporciona la interfaz multiplataforma más básica y la biblioteca generada tiene solo alrededor de 64 K (implementación de interfaz libc liviana incorporada)

característica

Biblioteca de corrientes

Para flujo de datos como http, archivo, socket, datos, etc., implementa una interfaz unificada para lectura y escritura, y admite: bloqueo, no bloqueo, asíncrono tres modos de lectura y escritura.

Admite la adición de múltiples capas de flujos de filtro en el medio para el filtrado de flujos, la realización durante la lectura y la realización de operaciones como descompresión, conversión de codificación y cifrado al mismo tiempo, lo que reduce en gran medida el uso de memoria.

Proporcionar principalmente los siguientes módulos:

  • stream: Flujo genérico sin bloqueo para el procesamiento de E/S individual general, al tiempo que admite corrutinas para transferencias asíncronas.

  • transfer: Streamer, que mantiene la transmisión de dos streams.

  • static_stream: Flujo estático optimizado para búferes de datos estáticos para un análisis de datos ligero y rápido.

Biblioteca de rutinas

  • Soporte de cambio de rutina rápido y eficiente

  • Proporcione soporte multiplataforma, consulte boost para el algoritmo de conmutación central y reescríbalo y optimícelo Arquitecturas admitidas actualmente: x86, x86_64, arm, arm64, mips32

  • Proporcionar soporte de comunicación de datos entre corrutinas de canal, basado en modelos de producción y consumo.

  • Proporcionar semáforo, soporte de bloqueo de rutina

  • Tanto los módulos de socket como los de flujo admiten corrutinas de forma nativa y pueden cambiar sin problemas entre subprocesos y corrutinas.

  • Proporciona instancias de servidor simples basadas en rutinas como http y archivo. Con solo unos pocos cientos de líneas de código, se puede escribir un servidor io de alto rendimiento desde el socket. La lógica del código es más clara que el modo de devolución de llamada asincrónica.

  • Al mismo tiempo, brinda soporte para los modos de corrutina stackfull y stackless. La corrutina sin pila es más liviana (cada corrutina solo ocupa docenas de bytes) y el cambio es más rápido (se sacrificará cierta facilidad de uso).

  • Admite epoll, kqueue, poll, select e IOCP

  • Admite la espera y la programación simultáneas de tomas, tubería io y proceso en corrutinas y sondeadores

base de datos

  • Unifique y simplifique la interfaz de operación de la base de datos, adáptese a varias fuentes de datos, conecte y abra automáticamente bases de datos compatibles a través de una URL unificada y use el modelo iterador para la enumeración de datos.

  • Actualmente admite dos bases de datos relacionales sqlite3 y mysql, y también se puede personalizar y ampliar para usar otras bases de datos relacionales.

biblioteca xml

  • Proporciona dos modos de análisis, DOM y SAX, para xml. El modo SAX adopta el modo de iteración externa, que tiene mayor flexibilidad y rendimiento, y puede elegir una ruta específica para el análisis.

  • El proceso de análisis se basa completamente en la transmisión, por lo que es altamente transmisible. Puede realizar un servicio integral de descarga, descompresión, transcodificación y análisis, y también puede analizar datos a gran escala con poca memoria.

  • Proporcione un escritor xml para admitir la generación xml

Banco de memoria

  • En referencia a la implementación del mecanismo de administración de memoria del kernel de Linux y al llevar a cabo varias transformaciones y optimizaciones, se implementa un conjunto completo de arquitectura de administración de grupos de memoria exclusivo de TBOX.

  • En el modo de depuración, los problemas de memoria comunes, como pérdidas de memoria, desbordamiento de memoria fuera de los límites y cobertura de superposición de memoria, se pueden detectar y ubicar fácilmente, y se realizan estadísticas y análisis breves del uso general de la memoria.

  • Hace uso completo de datos de bloques grandes, datos de bloques pequeños y datos de cadenas, evitando la generación de una gran cantidad de fragmentos externos y fragmentos internos. La operación de asignación tiene varias optimizaciones, y la eficiencia es O(1) en el 96% de los casos.

biblioteca de contenedores

  • Proporciona contenedores comunes como hash, lista enlazada, matriz, cola, pila, montón mínimo máximo, etc.

  • Admite varios tipos de miembros comunes y, al principio del contenedor original, sus tipos de miembros también se pueden personalizar y ampliar por completo.

  • Todos los contenedores admiten operaciones de iterador.

  • La mayoría de los contenedores pueden admitir operaciones de serialización y deserialización basadas en secuencias.

biblioteca de algoritmos

  • Proporciona varios algoritmos de clasificación: clasificación de burbuja, clasificación de montón, clasificación rápida, clasificación de inserción.

  • Proporciona varios algoritmos de búsqueda: recorrido lineal, búsqueda binaria.

  • Proporciona varios algoritmos transversales, de eliminación y estadísticos.

  • Usando iterador como interfaz, realiza la separación de algoritmo y contenedor, similar a stl, pero implementado por c, que es más liviano.

biblioteca de red

  • Implementar el módulo de cliente http

  • implementar cookies

  • Implementar análisis de dns y almacenamiento en caché

  • Implementar ssl (compatible con openssl, polarssl, mbedtls)

  • Soporte ipv4, ipv6

  • Admite el modo asíncrono a través de coroutine

biblioteca de matemáticas

  • Proporciona soporte aritmético de punto fijo de varias precisiones

  • Proporciona un generador de números aleatorios.

biblioteca libc

  • Una implementación ligera de libc, totalmente multiplataforma y optimizada para diferentes arquitecturas.

  • Se admiten la mayoría de las operaciones de cadenas y cadenas anchas.

  • Varias interfaces de operación que no distinguen entre mayúsculas y minúsculas para cadenas extendidas y cadenas anchas

  • Extensiones memset_u16, memset_u32interfaces etc., y altamente optimizadas, especialmente indicadas para programas de renderizado de gráficos

biblioteca libm

  • Una implementación ligera de algunas interfaces libm, así como la encapsulación de las interfaces del sistema de uso común. (Solo una parte se ha implementado en la actualidad, y se implementará por completo en el futuro)

  • Expanda algunas interfaces comunes, agregue cálculos de versión entera para funciones comunes como sqrt, log2, etc., que están altamente optimizadas, no involucran operaciones de punto flotante y son adecuadas para entornos integrados.

biblioteca de objetos

  • La biblioteca CoreFoundation liviana similar a Apple admite objetos comunes como objeto, diccionario, matriz, cadena, número, fecha y datos, y puede extender fácilmente la serialización de objetos personalizados.

  • Admite serialización y deserialización de formatos xml, json, binary y plist de Apple (xplist/bplist). Además, implementa su propio formato de serialización binaria y realiza un cifrado simple para texto sin formato.Bajo la premisa de no afectar el rendimiento, el tamaño serializado es un 30% más bajo que el de bplist.

biblioteca de la plataforma

  • Proporcione interfaces comunes del sistema, como archivo, directorio, socket, subproceso, hora, etc.

  • Proporcionar interfaz atómica, atomic64

  • Proporcionar temporizadores de alta precisión y baja precisión

  • Proporciona operaciones de grupos de subprocesos de alto rendimiento

  • Proporcione eventos, mutex, semáforos, spinlock y otros eventos, mutex, semáforos, operaciones de spinlock

  • Proporciona una interfaz para obtener información de la pila de funciones, lo cual es conveniente para la depuración y ubicación de errores.

  • Proporciona una interfaz de carga de biblioteca dinámica multiplataforma (si el sistema lo admite)

  • Proporcione sondeador io, encapsulación multiplataforma para epoll, poll, select, kqueue

  • Proporciona una interfaz de cambio de contexto multiplataforma, utilizada principalmente para la implementación de rutinas, y la eficiencia de cambio es muy alta

biblioteca de compresión

  • Admite la compresión y descompresión zlib/zlibraw/gzip (requiere compatibilidad con la biblioteca zlib de terceros).

biblioteca de codificación de caracteres

  • Admite la transcodificación mutua entre utf8, utf16, gbk, gb2312, uc2, uc4 y admite formatos endian grandes y pequeños.

Biblioteca de utilidades

  • Implementar el códec base64/32

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

  • Implemente herramientas de depuración auxiliares, como salida de registro y aserción.

  • Implementar la codificación y decodificación de URL

  • Implementa interfaces relacionadas con la operación de bits, admite el análisis de varios formatos de datos y puede realizar operaciones de análisis en campos de 8 bits, 16 bits, 32 bits, 64 bits, flotante, doble y cualquier bit, y admite big-endian, little-endian y local-end. modos al mismo tiempo Optimizado para algunas operaciones, como static_stream y stream, hay interfaces relacionadas para encapsularlos, lo que es conveniente para el análisis rápido de datos en el flujo.

  • Implemente swap16, swap32, swap64 y otras operaciones de intercambio de bits, y optimice para cada plataforma.

  • Implemente algunas interfaces avanzadas de procesamiento de bits, como: estadísticas rápidas del bit 0, recuento rápido de bits del 0 inicial y el 1 inicial, recuento rápido de bits del 01 final

  • Implemente un módulo singleton, que puede encapsular rápidamente objetos estáticos y objetos de instancia, y lograr la seguridad global de subprocesos

  • Implemente el módulo de opciones, analice los parámetros de la línea de comandos y proporcione operaciones rápidas y convenientes de creación y análisis de opciones de línea de comandos, lo cual es muy útil para escribir programas de terminal.

Biblioteca de expresiones regulares

  • Admite operaciones de coincidencia y reemplazo

  • Admite modos globales, multilínea, que no distinguen entre mayúsculas y minúsculas y otros modos

  • Use la biblioteca regular pcre, pcre2 y posix

Algunos proyectos usando tbox:

  • gbox

  • vm86

  • xhacer

  • rastrear

  • mas cosas

compilar

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

ejemplo

#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;
}
--- FEO ---

Supongo que te gusta

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