HTMC เป็นเครื่องมือที่ช่วยให้คุณสามารถรวมรหัส C ในหน้า HTML ของคุณได้อย่างง่ายดายและในทางกลับกัน ไฟล์ที่ลงท้ายด้วย .htmc สามารถใช้เพื่ออธิบายโครงสร้างของหน้าแบบคงที่ใน HTML และแบบไดนามิกใน C เหมือนกับตัวประมวลผล preprocessors hypertex อื่น ๆ เช่น PHP ไฟล์ต้นฉบับ C ปกติสามารถรวบรวมด้วย HTMC และใช้ในการสร้างหน้าเว็บแบบไดนามิกอย่างสมบูรณ์
HTMC ใช้ GCC และ GNU linker เพื่อสร้างไบนารีดั้งเดิมที่ได้รับการปรับปรุงสูงซึ่งสามารถแคชและทำงานตามความต้องการผ่าน HTMC ในทางทฤษฎี สิ่งนี้ช่วยให้การดำเนินการที่เร็วขึ้น* เมื่อเทียบกับภาษาที่ตีความทั่วไปหลายภาษาเช่น PHP, Python และ JavaScript
การเขียนโค้ดเว็บใน C อาจเป็นความท้าทายที่สนุกสนานหรือแบบฝึกหัดทางวิชาการ เมื่อได้รับการแก้ไขมากพอคุณจะได้รับ HTMC เพื่อทำทุกสิ่งที่คุณต้องการในหน้าเว็บแบบไดนามิกหรือจุดสิ้นสุด HTTP API
* ประสิทธิภาพของรหัสที่ดำเนินการผ่าน HTMC ยังไม่ได้รับการทดสอบ นอกจากนี้การเพิ่มประสิทธิภาพที่สำคัญที่สุดยังไม่ได้ดำเนินการเนื่องจากพวกเขาต้องการ HTMC อย่างแรงเพื่อรวมเว็บเซิร์ฟเวอร์ของตัวเอง
HTMC ถูกสร้างขึ้นเพื่อรองรับ USECASE หลายรายการ ณ ตอนนี้สามารถใช้ HTMC ได้:
include และ libhtmc.a )โหมดที่แนะนำสำหรับการให้บริการเนื้อหาเว็บคือ CGI เนื่องจากช่วยให้สามารถรวมเข้ากับซอฟต์แวร์เว็บที่มีอยู่ได้ง่าย
CGI เป็นที่รู้จักกันว่าเก่าและช้าดังนั้นทำไม HTMC จะได้รับเว็บเซิร์ฟเวอร์ของตัวเองในบางจุด เว็บเซิร์ฟเวอร์ในตัวจะใช้ preelocated arenas หน่วยความจำและการเพิ่มประสิทธิภาพเครือข่ายเพื่อเพิ่มความเร็วในการดำเนินการและลดค่าใช้จ่ายมากที่สุดหวังว่า
หมายเหตุ: ณ ตอนนี้แทนที่ GCC หรือ GNU linker ด้วยซอฟต์แวร์อื่น ๆ ไม่ได้รับการสนับสนุน ตัวเลือก commandline บางตัวที่ระบุโดย HTMC อาจแตกต่างกันในคอมไพเลอร์/linkers อื่น ๆ
Libhtmc มีฟังก์ชั่น HTMC ทั้งหมด ห้องสมุดสามารถใช้ในโปรแกรมดั้งเดิมอื่น ๆ เพื่อรวม HTMC แต่ยังรวมถึงอินเทอร์เฟซเพื่อโต้ตอบกับ HTMC Runtime และจัดการรหัส 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 อย่างง่ายในภาษาระดับสูงและเรียกใช้ HTMC เมื่อจัดการคำขอ ในตัวอย่างนี้ Golang ถูกใช้เป็นหนึ่งในภาษาพื้นเมืองที่ง่ายที่สุดที่รองรับคุณสมบัติเหล่านี้นอกกรอบ เว็บเซิร์ฟเวอร์ Golang รวมอยู่ในที่เก็บนี้
htmc-cgi-ws ล่าสุดสำหรับ Linux จากที่นี่htmc-cgi-ws ไปยังมันhtmc-cgi-ws ได้รับการยอมรับว่าเป็นปฏิบัติการ chmod +x ./htmc-cgi-ws
htmc-cgi-ws ในฐานะผู้ใช้ Super (ถ้าจำเป็น) และทำตามคำแนะนำบนหน้าจอ [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