HTMC هي أداة تتيح لك دمج رمز C بسهولة في صفحات HTML والعكس بالعكس. يمكن استخدام الملفات التي تنتهي في .htmc لوصف بنية الصفحة بشكل ثابت في HTML وديناميكيًا في C ، مثل المعالجات المسبقة الأخرى مثل PHP. يمكن أيضًا تجميع ملفات مصدر C العادية باستخدام HTMC واستخدامها لإنشاء صفحات ويب ديناميكية بالكامل.
يستخدم HTMC GCC و GNU Linker لإنشاء ثنائيات أصلية محسّنة للغاية يمكن تخزينها مؤقتًا وتشغيلها عند الطلب عبر HTMC. من الناحية النظرية ، يتيح ذلك تنفيذًا أسرع بكثير* مقارنة بالعديد من اللغات المفسرة الشائعة مثل PHP و Python و JavaScript.
يمكن أن تكون كتابة رمز الويب في C أيضًا تحديًا ممتعًا أو تمرينًا أكاديميًا. بالنظر إلى العبث الكافي ، يمكنك الحصول على HTMC للقيام بكل ما تحتاجه في صفحة ويب ديناميكية أو نقطة نهاية API HTTP.
* لم يتم اختبار أداء الكود الذي تم تنفيذه من خلال HTMC بعد. وأيضًا ، لم يتم بعد تنفيذ التحسينات الأكثر أهمية لأنها تتطلب HTMC بشكل كبير دمج خادم الويب الخاص به.
تم تصميم HTMC لدعم عدة usecases. اعتبارا من الآن ، يمكن استخدام HTMC:
include و libhtmc.a )الوضع الموصى به لخدمة محتوى الويب هو CGI لأنه يتيح التكامل السهل مع برنامج الويب الحالي.
من المعروف أن CGI قديم وبطيء ، ولهذا السبب ستحصل HTMC على خادم الويب الخاص به في مرحلة ما. سيستخدم خادم الويب المتكامل الساحات المدمجة ، وتحسينات الذاكرة والشبكة لزيادة سرعة التنفيذ وتقليل النفقات العامة إلى الحد الأدنى.
ملاحظة: اعتبارًا من استبدال GCC أو GNU Linker مع البرامج الأخرى لا يتم تشجيعها. قد تكون بعض خيارات سطر الأوامر المحددة بواسطة 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 بسيط بلغة عالية المستوى واستدعاء HTMC عند التعامل مع الطلبات. في هذا المثال ، يتم استخدام Golang لأنه أحد أبسط اللغات الأصلية التي تدعم هذه الميزات خارج المربع. يتم تضمين خادم الويب Golang في هذا المستودع.
htmc-cgi-ws لـ Linux من هنا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 بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا. انظر الترخيص لمزيد من المعلومات.
استلهم هذا المشروع في البداية من PKD667/CWEB.