مقارنة لغات البرمجة
C: اللغة التي يتم تشغيل كل شيء آخر عليها
C هي اللغة الكامنة وراء كل شيء آخر: النواة، وبرامج التشغيل، والمترجمين الفوريين الذين تديرهم خوادم Python، ومحركات قاعدة البيانات خلف مواقع الويب الخاصة بك. بالنسبة لفرق العمليات، تعد لغة C أقل شيئًا تكتبه كل يوم وأكثر شيئًا يجب عليك قراءته بطلاقة، لأن عمليات كتابات CVE وتتبعات المكدس والمقالب الأساسية تجري أعمالها باستخدام مفردات لغة C. هذه هي المقالة المخصصة وراء مقارنة C-vs-C++.
النقاط الرئيسية
- النموذج صادق: الذاكرة اليدوية من خلال malloc/free، والحساب على المؤشرات، والسلوك غير المحدد كحقيقة على مستوى المواصفات بدلاً من فئة الأخطاء؛ الانضباط الذي يجعل لغة C سريعة هو نفس الانضباط الذي يجعل لغة C الإهمال باهظة الثمن.
- السلوك غير المحدد هو الخطر المتناوب: الفهرسة خارج الحدود، والتجاوز الموقع، والفئات التي يتم استخدامها بعد الاستخدام والتي تتوافق مباشرة مع عائلات مكافحة التطرف العنيف الخاصة بسلامة الذاكرة (تم توصيلها تقريبًا واحدة تلو الأخرى في بيانات مكافحة التطرف العنيف على مدار عقود)؛ تعمل أجهزة Fuzzers (أدوات من فئة AFL-libFuzzer) والمطهرات على تحويل التخمينات إلى ظروف إعادة إنتاج.
- تعتبر أدوات تصحيح الأخطاء ذات مستوى عالمي وتستحق المعرفة: gdb وvalgrind/memcheck وAddressSanitizer وأشباهها (UBSan وTSan) تلتقط فئات من الأخطاء في وقت الاختبار والتي تشير إليها آثار مكدس الإنتاج فقط؛ هذا المزيج هو السبب في أن مبدأ "البناء باستخدام المطهرات في CI" هو قاعدة منزلية في كل فريق من فرق C الثقيلة نعمل معه.
- قراءة لغة C هي مهارة عملياتية: إعلانات CVE تشير إلى الوظائف والأنواع، وتنتج أخطاء تقسيمات الخدمة آثارًا خلفية في مفردات gdb، كما تُظهر إنشاءات الحزم من مصادر فئة شجرة المنافذ تحذيرات المترجم التي تفصل الجودة عن البريد غير الهام؛ ميزة القارئ تتراكم بهدوء لسنوات.
- ABI هو النسيج الضام: كل "واجهة وظيفية أجنبية" (أنواع Python، وRust's FFI، وGo's cgo) على شكل حرف C لأن لغة C أصبحت لغة مشتركة لحدود المكتبة؛ هذا الدور يبقي لغة C ذات صلة بغض النظر عن أسلوب المطور.
- عندما تظل لغة C هي الأداة المناسبة للكتابة: النوى، وبرامج التشغيل، والبرامج الثابتة المضمنة، والحلقات الأعمق حيث يهيمن سلوك ذاكرة التخزين المؤقت؛ وفي أماكن أخرى، تغطي مقارنات اللغة (Rust لإعادة كتابة مكونات C غير الآمنة بأمان، وGo لأدوات العمليات) الاختيارات الحديثة الصادقة.
ملاحظة ميدانية
استغرق خطأ C الذي جعلنا إضفاء الطابع المؤسسي على المطهرات ثلاثة أسابيع للعثور عليه من خلال فولكلور تتبع المكدس وثلاث دقائق تحت عنوان AddressSanitizer: يعرف النظام البيئي للمترجم بالفعل أشياء لا يجب على البشر البحث عنها في الساعة الثانية صباحًا.
أسئلة شائعة
هل يجب أن نكتب بنية تحتية جديدة بلغة C؟
تقريبًا لا يحدث ذلك تمامًا: عندما يكون الحد الأقصى من التحكم مهمًا، تظل النواة وبرامج التشغيل C؛ الخدمات والأدوات تنشر Python/Go/Rust اليوم؛ إن النواة C ذات الحواف الآمنة هي الشكل العملي الحديث.
لماذا يتم إلقاء اللوم على لغة C في العديد من التهديدات الشائعة؟
لأن الأخطاء المتعلقة بسلامة الذاكرة تعيش بالضبط في المكان الذي تعيش فيه UB ولأن مثل هذه الحصة الهائلة من التعليمات البرمجية المهمة في العالم هي C. يقوم المديرون بالتخفيف من خلال أدوات ذاكرة أكثر أمانًا والتشويش وإعادة الكتابة المستهدفة وفقًا لممارسات "التطوير الاستباقي".
كيف يمكن للمسؤولين تعلم قراءة لغة C بفعالية؟
اختر مصدر الخدمة الحقيقي: الحزم ذات قواعد التعليمات البرمجية الصغيرة (يعد curl بداية جيدة)، واقرأ تقارير CVE مقابل الإصلاحات، وتدرب مع gdb في مربع اختبار. الطلاقة هي بضعة عطلات نهاية الأسبوع بالإضافة إلى التحف الحقيقية.
هل لغة C الحديثة (C17/C23) مختلفة بما يكفي لتغيير القصة؟
تزايدي: يتطور المعيار بعناية، لكن نموذج الذاكرة ومشهد UB يظلان واقعًا طويل الأمد؛ الأدوات، وليس الزبد القياسي، هو المكان الذي حدث فيه التقدم في مجال السلامة.
كيف تساعدك Kinetikatech في مقارنة لغات البرمجة
لا ينبغي أن تضطر إلى أن تصبح خبيرًا في مقارنة لغات البرمجة: لغات عمل النظام، والبرمجة النصية، والخدمات، مقارنة بما يهم فعليًا في الإنتاج: ضمانات السلامة، والسرعة الأولية، ومن يمكنك توظيفه، ومدى صعوبة نشر الخدمات الناتجة وتصحيحها. ولهذا توجد إدارة الخوادم و صيانة المواقع بالضبط: الإعداد والتحصين والمراقبة ومهندس مناوب ليلًا ونهارًا.