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的啟發。