P prophittcorey در prophitt.me

ساخت یک وب‌اپلیکیشن مدرن با زبان C و تکنولوژی قدیمی CGI

۳ دقیقه مطالعه ۶۷۵ امتیاز ۲۹۵ نظر ۲۱ مهر ۱۴۰۵

ساخت یک وب‌اپلیکیشن مدرن با زبان C و تکنولوژی قدیمی CGI — A Modern Web App in C

خلاصه

این مقاله نشان می‌دهد چگونه می‌توان یک محصول تجاری وب را با استفاده از زبان C، معماری CGI و سیستم‌عامل OpenBSD به شکلی مینیمال، امن و بدون وابستگی‌های پیچیده پیاده‌سازی کرد. این رویکرد ثابت می‌کند تکنولوژی‌های قدیمی در دنیای مدرن امروز همچنان کارآمد و قدرتمند هستند.

مقدمه

اگر در سال ۱۹۹۴ می‌خواستید یک وب‌سایت پویا راه‌اندازی کنید، کار شما نوشتن یک برنامه به زبان C، قرار دادن آن در پوشه cgi-bin و سپردن اجرای آن به سرور Apache بود. اکنون پس از گذشت دهه‌ها، یک محصول تجاری واقعی به نام marketyour.games با دقیقاً همان تکنولوژی‌های بنیادی پیاده‌سازی و عرضه شده است.

این وب‌اپلیکیشن تمامی ویژگی‌های مدرن را دارد: حساب کاربری، داشبورد جستجو، مدیریت فایل‌ها، پرداخت از طریق Stripe و ارسال ایمیل از طریق Postmark. همچنین از تکنیک پیشرفت تدریجی (Progressive Enhancement) پیروی می‌کند و نیازی به JavaScript ندارد. تمام این سیستم مدرن فقط بر پایه زبان C و پروتکل CGI ساخته شده است.

پشته تکنولوژی و معماری (BCHS)

پشته نرم‌افزاری این پروژه شامل OpenBSD، زبان C، وب‌سرور httpd و SQLite است. در این معماری خبری از فریمورک‌های پیچیده، زبان‌های قالب‌بندی (Templating) جداگانه یا پایگاه‌داده‌های سنگین نیست:

  • بدون فریمورک: برنامه نوشته شده متغیرهای محیطی CGI را می‌خواند و پاسخ HTTP تولید می‌کند.
  • بدون قالب: کدهای HTML مستقیماً توسط برنامه‌ C تولید و خروجی داده می‌شوند.
  • پایگاه‌داده محلی: از SQLite به صورت مستقیم از طریق API زبان C استفاده می‌شود.
  • بدون کانتینر: خروجی کار یک باینری استاتیک است که به سادگی روی سرور قرار می‌گیرد.

هر درخواست HTTP باعث اجرای یک پروسه تازه می‌شود و انتشار نسخه جدید تنها با جایگزین کردن یک فایل باینری انجام می‌شود؛ بدون نیاز به راه‌اندازی مجدد سرور و بدون هیچ‌گونه قطعی (Downtime).

کتابخانه‌ها و ابزارهای جانبی

امنیت و سادگی در این پروژه با کمک ابزارهای سیستم‌عامل OpenBSD مانند pledge و unveil تضمین شده است که به کمک آن‌ها، پروسه CGI درون یک سندباکس ایزوله اجرا می‌شود. برای اتصال به سرویس‌های خارجی تنها از چند کتابخانه معدود استفاده شده است:

  • کتابخانه libcurl برای درخواست‌های برون‌شبکه به Stripe و Postmark.
  • کتابخانه libsodium برای تولید شناسه‌های تصادفی، هش کردن رمز عبور و اعتبارسنجی وب‌هوک‌ها.
  • کتابخانه libcjson برای پردازش داده‌های JSON که به صورت تک‌فایل در پروژه ادغام (Vendor) شده است.
  • نسخه Amalgamation پایگاه‌داده SQLite که آن هم به صورت یک فایل واحد کامپایل می‌شود.

چرا این رویکرد برای مهندسان اهمیت دارد؟

مرور بحث‌های مهندسان در Hacker News نکات جالبی را درباره این پروژه روشن می‌کند. بسیاری از توسعه‌دهندگان به یاد دوران گذشته و سیستم‌هایی مانند FastCGI افتادند. برخی اشاره کردند که اگرچه فرآیند Fork کردن پروسه‌ها در گذشته کند محسوب می‌شد، اما امروزه با بهینه‌سازی هسته سیستم‌عامل‌ها و برای ترافیک‌های معقول، کاملاً قابل قبول و سریع است. همچنین برخی زبان‌هایی مانند Go را به دلیل خروجی باینری واحد پیشنهاد دادند، اما سادگی مطلق و حذف وابستگی‌های پشته BCHS همچنان جذابیت خود را حفظ کرده است.

مزایای اصلی این سبک توسعه عبارتند از:

  • کاهش ریسک زنجیره تأمین (Supply Chain Risk): به جای داشتن گراف بزرگی از وابستگی‌های تو در تو، تنها با یک کامپایلر C و چند کتابخانه شناخته‌شده روبه‌رو هستید.
  • شفافیت کامل: کل برنامه قابل درک است، کامپایل کامل آن چند ثانیه طول می‌کشد و فرآیند دیباگ با ابزارهای سنتی مانند gdb به راحتی انجام می‌شود.
  • بار عملیاتی بسیار پایین: عدم نیاز به نگهداری سرورهای دیتابیس جداگانه یا زیرساخت‌های پیچیده ابری.

این پروژه نشان می‌دهد که بازگشت به اصول بنیادین وب و زبان‌های سطح‌پایین، گاهی می‌تواند پیچیدگی‌های غیرضروری توسعه نرم‌افزار مدرن را به شدت کاهش دهد.

این مطلب به‌صورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل

خبرهای فناوری در قالب پست و ویدیوی کوتاه، در اینستاگرام هکرنیوز بلاگ. به‌زودی
هر خبر به محض انتشار، به‌همراه پادکست روزانه در کانال تلگرام هکرنیوز بلاگ.