HTMC est un outil qui vous permet d'intégrer facilement le code C dans vos pages HTML et vice versa. Les fichiers se terminant par .htmc peuvent être utilisés pour décrire la structure d'une page statiquement en HTML et dynamiquement en C, un peu comme les autres préprocesseurs Hypertex tels que PHP. Les fichiers source en C réguliers peuvent également être compilés avec HTMC et utilisés pour générer des pages Web entièrement dynamiques.
HTMC utilise GCC et le linker GNU pour générer des binaires natifs hautement optimisés qui peuvent être mis en cache et exécuter à la demande via HTMC. En théorie , cela permet une exécution beaucoup plus rapide * par rapport à de nombreux langages interprétés communs comme PHP, Python et JavaScript.
La rédaction du code Web en C peut également être un défi amusant ou un exercice académique. Étant donné suffisamment de bricolage, vous pouvez faire en sorte que HTMC fasse tout ce dont vous avez besoin dans une page Web dynamique ou un point de terminaison API HTTP.
* Les performances du code exécutées via HTMC n'ont pas encore été testées. De plus, les optimisations les plus importantes n'ont pas encore été implémentées car elles nécessitent strictement HTMC pour intégrer son propre serveur Web.
HTMC est conçu pour prendre en charge plusieurs USECases. À partir de maintenant, HTMC peut être utilisé:
include et libhtmc.a )Le mode recommandé pour servir le contenu Web est CGI car il permet une intégration facile avec les logiciels Web existants.
CGI est connu pour être vieux et lent, donc pourquoi HTMC obtiendra son propre serveur Web à un moment donné. Le serveur Web intégré utilisera les arènes préallouées, les optimisations de la mémoire et du réseau pour maximiser la vitesse d'exécution et minimiser les frais généraux, espérons-le.
Remarque: Pour maintenant, le remplacement de GCC ou GNU Linker par d'autres logiciels n'est pas encouragé. Certaines options de ligne de commande spécifiées par HTMC peuvent être différentes dans d'autres compilateurs / lieurs.
libhtmc contient toutes les fonctions HTMC. La bibliothèque peut être utilisée dans d'autres programmes natifs pour intégrer HTMC, mais comprend également une interface pour interagir avec le HTMC Runtime et manipuler le code HTML
| Interface de fonction | Description |
|---|---|
void htmc_bind(htmc_handover_t *handover) | Lie un pointeur htmc_handover_t à l'unité d'exécution HTMC actuelle |
int htmc_printf(const char *fmt, ...) | Écrit une chaîne formatée sur la page HTML |
int htmc_vpprintf(const char *fmt, va_list args) | Écrit une chaîne formatée sur la page HTML |
int htmc_puts(const cahr *s) | Écrivez une chaîne de texte brut sur la page HTML (plus rapide que htmc_printf ) |
int htmc_query_scanf(const char *fmt, ...) | Lit les valeurs des arguments de requête HTTP |
int htmc_query_vscanf(const char *fmt, va_list args) | Lit les valeurs des arguments de requête HTTP |
int htmc_form_scanf(const char *fmt, ...) | Lit les valeurs des arguments corporels HTTP dans les demandes postales |
int htmc_form_vscanf(const char *fmt, va_list args) | Lit les valeurs des arguments corporels HTTP dans les demandes postales |
int htmc_error(const char *fmt, ...) | Jette un message d'erreur formaté |
void *htmc_alloc(size_t size) | Renvoie un void * dans un tampon de mémoire de la taille demandée ou NULL s'il échoue |
void htmc_free(void *ptr) | Libère un tampon de mémoire alloué avec htmc_alloc |
La façon la plus simple d'utiliser HTMC est de créer un serveur Web CGI simple dans un langage de haut niveau et d'invoquer HTMC lors de la gestion des demandes. Dans cet exemple, Golang est utilisé car il est l'une des langues maternelles les plus simples qui prend en charge ces fonctionnalités hors de la boîte. Un serveur Web Golang est inclus dans ce référentiel.
htmc-cgi-ws pour Linux à partir d'icihtmc-cgi-wshtmc-cgi-ws est reconnu comme un exécutable chmod +x ./htmc-cgi-ws
htmc-cgi-ws en tant que super utilisateur (si nécessaire) et suivez les instructions à l'écran [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
Remarque: la cible par défaut est all . Les cibles alternatives sont les cibles:
make htmc # Build ONLY the executable
make libhtmc # Build ONLY the library
make htmc-cgi-ws # Build ONLY the CGI Web Server
HTMC est distribué selon les termes de la licence du MIT. Voir la licence pour plus d'informations.
Ce projet a été initialement inspiré par PKD667 / CWEB.