HTMC는 HTML 페이지에서 C 코드를 쉽게 통합 할 수있는 도구입니다. .htmc 로 끝나는 파일은 PHP와 같은 다른 HyperTex 전 처리기와 마찬가지로 HTML에서 통계적으로 페이지의 구조를 설명하는 데 사용될 수 있습니다. 일반 C 소스 파일은 HTMC로 컴파일 될 수 있으며 완전히 동적 웹 페이지를 생성하는 데 사용될 수 있습니다.
HTMC는 GCC와 GNU 링커를 사용하여 HTMC를 통해 요구 사항에 따라 캐시하고 실행할 수있는 고도로 최적화 된 네이티브 바이너리를 생성합니다. 이론적으로 이것은 PHP, Python 및 JavaScript와 같은 많은 일반적인 해석 언어에 비해 훨씬 빠른 실행*을 허용합니다.
C로 웹 코드를 작성하는 것도 재미있는 도전이나 학업 운동이 될 수 있습니다. 충분한 땜질이 주어지면 HTMC가 동적 웹 페이지 또는 HTTP API 엔드 포인트에서 필요한 모든 것을 수행 할 수 있습니다.
* HTMC를 통해 실행 된 코드의 성능은 아직 테스트되지 않았습니다. 또한 가장 중요한 최적화는 HTMC가 자체 웹 서버를 통합해야하므로 아직 구현되지 않았습니다.
HTMC는 다수의 usecase를 지원하도록 만들어졌습니다. 현재 HTMC를 사용할 수 있습니다.
include 디렉토리 및 libhtmc.a 의 헤더 사용)웹 컨텐츠를 제공하기위한 권장 모드는 기존 웹 소프트웨어와 쉽게 통합 할 수 있으므로 CGI입니다.
CGI는 오래되고 느리게 알려져 있으므로 HTMC가 어느 시점에서 자체 웹 서버를 얻는 이유. 통합 웹 서버는 실행 속도를 최대화하고 오버 헤드를 최소화하기 위해 Preallocated Arenas, 메모리 및 네트워크 최적화를 사용합니다.
참고 : 현재 GCC 또는 GNU 링커를 다른 소프트웨어로 교체하는 것은 권장되지 않습니다. HTMC로 지정된 일부 CommandLine 옵션은 다른 컴파일러/링커에서 다를 수 있습니다.
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) | 요청 된 크기의 메모리 버퍼 또는 NULL 경우 void * 메모리 버퍼로 반환합니다. |
void htmc_free(void *ptr) | htmc_alloc 과 할당 된 메모리 버퍼를 해방하십시오 |
HTMC를 사용하는 가장 쉬운 방법은 고급 언어로 간단한 CGI 웹 서버를 작성하고 요청을 처리 할 때 HTMC를 호출하는 것입니다. 이 예에서 Golang은 이러한 기능을 상자에서 지원하는 가장 간단한 모국어 중 하나로 사용됩니다. 이 저장소에는 Golang 웹 서버가 포함되어 있습니다.
htmc-cgi-ws 다운로드하십시오htmc-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에서 영감을 받았습니다.