HTMC是一种工具,可让您轻松地将C代码集成到HTML页面中,反之亦然。以.htmc结尾的文件可用于在HTML中静态地描述页面的结构,并在C中动态地描述页面的结构,就像其他Hypertex预处理器(如PHP)一样。常规C源文件也可以使用HTMC编译,并用于生成完全动态的网页。
HTMC使用GCC和GNU链接生成可以缓存并通过HTMC按需运行的高度优化的本机二进制文件。从理论上讲,与许多常见的解释语言(如PHP,Python和JavaScript)相比,这允许执行*。
在C中编写网络代码也可能是一个有趣的挑战或学术练习。给定足够的修补,您可以让HTMC在动态网页或HTTP API端点中完成所需的一切。
*尚未测试通过HTMC执行的代码性能。同样,最重要的优化尚未实现,因为它们非常要求HTMC集成自己的Web服务器。
HTMC旨在支持多个用途。截至目前,可以使用HTMC:
include目录和libhtmc.a标题)服务Web内容的推荐模式是CGI,因为它可以轻松地与现有Web软件集成。
众所周知,CGI是旧的且缓慢的,因此为什么HTMC在某个时候会获得自己的Web服务器。集成的Web服务器将使用预关注的竞技场,内存和网络优化来最大化执行速度并最大程度地减少开销。
注意:截至目前,不鼓励使用其他软件替换GCC或GNU链接器。 HTMC指定的某些命令行选项在其他编译器/链接器中可能有所不同。
LIBHTMC包含所有HTMC功能。该库可以在其他本机程序中用于集成HTMC,但还包括一个与HTMC运行时交互的接口并操纵HTML代码
| 功能接口 | 描述 |
|---|---|
void htmc_bind(htmc_handover_t *handover) | 将htmc_handover_t指针绑定到当前HTMC执行单元 |
int htmc_printf(const char *fmt, ...) | 将格式的字符串写入HTML页面 |
int htmc_vpprintf(const char *fmt, va_list args) | 将格式的字符串写入HTML页面 |
int htmc_puts(const cahr *s) | 将普通文本字符串写入HTML页面(比htmc_printf快速) |
int htmc_query_scanf(const char *fmt, ...) | 从HTTP查询参数读取值 |
int htmc_query_vscanf(const char *fmt, va_list args) | 从HTTP查询参数读取值 |
int htmc_form_scanf(const char *fmt, ...) | 在邮政请求中读取HTTP主体参数的值 |
int htmc_form_vscanf(const char *fmt, va_list args) | 在邮政请求中读取HTTP主体参数的值 |
int htmc_error(const char *fmt, ...) | 投掷格式的错误消息 |
void *htmc_alloc(size_t size) | 将void *返回到请求的大小的内存缓冲区或NULL缓冲区 |
void htmc_free(void *ptr) | 释放使用htmc_alloc分配的内存缓冲区 |
使用HTMC的最简单方法是用高级语言创建一个简单的CGI Web服务器,并在处理请求时调用HTMC。在此示例中,Golang被使用是因为它是最简单的本地语言之一,它支持这些功能。该存储库中包含Golang Web服务器。
htmc-cgi-wshtmc-cgi-ws移动到其中htmc-cgi-ws被认为是可执行的 chmod +x ./htmc-cgi-ws
htmc-cgi-ws ,并按照屏幕上的说明进行操作 [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
注意:默认设置目标就是all 。替代目标是:
make htmc # Build ONLY the executable
make libhtmc # Build ONLY the library
make htmc-cgi-ws # Build ONLY the CGI Web Server
HTMC根据MIT许可证的条款分发。有关更多信息,请参见许可证。
该项目最初是受PKD667/CWEB的启发。