HTMC es una herramienta que le permite integrar fácilmente el código C en sus páginas HTML y viceversa. Los archivos que terminan en .htmc se pueden usar para describir la estructura de una página estáticamente en HTML y dinámicamente en C, al igual que otros preprocesadores de Hyptex como PHP. Los archivos de origen C regulares también se pueden compilar con HTMC y utilizar para generar páginas web completamente dinámicas.
HTMC utiliza GCC y el enlazador GNU para generar binarios nativos altamente optimizados que se pueden almacenar en caché y ejecutarse a través de HTMC. En teoría , esto permite una ejecución mucho más rápida* en comparación con muchos lenguajes interpretados comunes como PHP, Python y JavaScript.
Escribir código web en C también puede ser un desafío divertido o ejercicio académico. Dado suficiente retoques, puede hacer que HTMC haga todo lo que necesita en una página web dinámica o punto final de la API HTTP.
* El rendimiento del código ejecutado a través de HTMC aún no se ha probado. Además, las optimizaciones más importantes aún no se han implementado, ya que requieren que HTMC integre un servidor web propio.
HTMC está construido para admitir múltiples USCases. A partir de ahora, se puede usar HTMC:
include y libhtmc.a )El modo recomendado para servir contenido web es CGI, ya que permite una fácil integración con el software web existente.
Se sabe que CGI es viejo y lento, por lo que HTMC obtendrá su propio servidor web en algún momento. El servidor web integrado utilizará ámbitos, memoria y optimizaciones de red preallocadas para maximizar la velocidad de ejecución y minimizar la sobrecarga, con suerte.
Nota: A partir de ahora, no se recomienda reemplazar el enlace GCC o GNU con otro software. Algunas opciones de línea de comandos especificadas por HTMC pueden ser diferentes en otros compiladores/enlazadores.
LibHTMC contiene todas las funciones HTMC. La biblioteca se puede usar en otros programas nativos para integrar HTMC, pero también incluye una interfaz para interactuar con el tiempo de ejecución HTMC y manipular el código HTML
| Interfaz de función | Descripción |
|---|---|
void htmc_bind(htmc_handover_t *handover) | Atrae un puntero htmc_handover_t a la unidad de ejecución HTMC actual |
int htmc_printf(const char *fmt, ...) | Escribe una cadena formateada en la página HTML |
int htmc_vpprintf(const char *fmt, va_list args) | Escribe una cadena formateada en la página HTML |
int htmc_puts(const cahr *s) | Escriba una cadena de texto simple en la página HTML (más rápido que htmc_printf ) |
int htmc_query_scanf(const char *fmt, ...) | Lee valores de los argumentos de consulta HTTP |
int htmc_query_vscanf(const char *fmt, va_list args) | Lee valores de los argumentos de consulta HTTP |
int htmc_form_scanf(const char *fmt, ...) | Lee valores de HTTP Body Arguments en solicitudes de publicación |
int htmc_form_vscanf(const char *fmt, va_list args) | Lee valores de HTTP Body Arguments en solicitudes de publicación |
int htmc_error(const char *fmt, ...) | Lanza un mensaje de error formateado |
void *htmc_alloc(size_t size) | Devuelve un void * a un búfer de memoria del tamaño solicitado o NULL si falla |
void htmc_free(void *ptr) | Libera un búfer de memoria asignado con htmc_alloc |
La forma más fácil de usar HTMC es crear un servidor web CGI simple en un idioma de alto nivel e invocar HTMC al manejar las solicitudes. En este ejemplo, Golang se usa ya que es uno de los idiomas nativos más simples que admite estas características de la caja. Se incluye un servidor web de Golang en este repositorio.
htmc-cgi-ws para Linux desde aquíhtmc-cgi-ws en élhtmc-cgi-ws sea reconocido como un ejecutable chmod +x ./htmc-cgi-ws
htmc-cgi-ws como súper usuario (si es necesario) y siga las instrucciones en la pantalla [alevm@alevm ws]$ sudo ./htmc-cgi-ws
You're missing some important htmc files, proceed with the download? [Y/n]: Y
Downloading <https://alessandro-salerno.github.io/htmc/bin/htmc> to ./bin/htmc ... Done!
Downloading <https://alessandro-salerno.github.io/htmc/bin/libhtmc.a> to ./bin/libhtmc.a ... Done!
Downloading <https://alessandro-salerno.github.io/htmc/include/libhtmc/libhtmc.h> to ./include/libhtmc/libhtmc.h ... Done!
Downloading <https://alessandro-salerno.github.io/htmc/examples/index.htmc> to ./index.htmc ... Done!
Listening on localhost:80
localhost/index.htmc Compiling for linux
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/cli.c -o obj/common/cli.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/compile.c -o obj/common/compile.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/emit.c -o obj/common/emit.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/libhtmc/impl/base-impl.c -o obj/common/libhtmc/impl/base-impl.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/libhtmc/impl/debug-impl.c -o obj/common/libhtmc/impl/debug-impl.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/libhtmc/libhtmc.c -o obj/common/libhtmc/libhtmc.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/load.c -o obj/common/load.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/log.c -o obj/common/log.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/main.c -o obj/common/main.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/parse.c -o obj/common/parse.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -flto -c src/common/util.c -o obj/common/util.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/cli.c -o lib/common/cli.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/compile.c -o lib/common/compile.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/emit.c -o lib/common/emit.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/libhtmc/impl/base-impl.c -o lib/common/libhtmc/impl/base-impl.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/libhtmc/impl/debug-impl.c -o lib/common/libhtmc/impl/debug-impl.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/libhtmc/libhtmc.c -o lib/common/libhtmc/libhtmc.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/load.c -o lib/common/load.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/log.c -o lib/common/log.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/main.c -o lib/common/main.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/parse.c -o lib/common/parse.o
gcc -O2 -std=c2x -Wno-unused-parameter -Iinclude/ -DEXT_HTMC_BUILD=""24.10.09"" -fPIC -g -w -c src/common/util.c -o lib/common/util.o
gcc -flto obj/common/cli.o obj/common/compile.o obj/common/emit.o obj/common/libhtmc/impl/base-impl.o obj/common/libhtmc/impl/debug-impl.o obj/common/libhtmc/libhtmc.o obj/common/load.o obj/common/log.o obj/common/main.o obj/common/parse.o obj/common/util.o -o bin/htmc
ar rcs bin/libhtmc.a lib/common/cli.o lib/common/compile.o lib/common/emit.o lib/common/libhtmc/impl/base-impl.o lib/common/libhtmc/impl/debug-impl.o lib/common/libhtmc/libhtmc.o lib/common/load.o lib/common/log.o lib/common/main.o lib/common/parse.o lib/common/util.o
cd cgi-ws && go build -o ../bin/htmc-cgi-ws
Finished!
alessandrosalerno@MacBook-Pro-di-Alessandro-3 htmc %
git clone https://github.com/Alessandro-Salerno/htmc
cd htmc/
make
Nota: El objetivo de marca predeterminado es all . Los objetivos de marca alternativos son:
make htmc # Build ONLY the executable
make libhtmc # Build ONLY the library
make htmc-cgi-ws # Build ONLY the CGI Web Server
HTMC se distribuye bajo los términos de la licencia MIT. Vea la licencia para más información.
Este proyecto se inspiró inicialmente en PKD667/CWEB.