محتويات الدورة

C / الأساسي: قراءة البرامج وبناؤها / الدرس 1

سلسلة الأدوات ونموذج برنامج C

تتبع النص المصدري خلال الترجمة والتنفيذ، وافصل قواعد اللغة عن اختيارات الأدوات والمنصة.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تمييز المعالجة المسبقة والترجمة والتجميع والربط.
  • شرح main المستضافة وتصريحات المكتبة والمخرجات الملحوظة.
  • اختيار C17 وتفسير التشخيصات ضمن سياقها.

كيف تصبح الملفات برنامجا

يصف مصدر C الكائنات والدوال والعمليات؛ وليس تسجيلا لتعليمات المعالج. وحدة الترجمة هي الملف المصدري بعد المعالجة المسبقة، بما فيه النص الذي تجلبه الترويسات. يترجم التنفيذ الوحدات ويجمع التعريفات والمكتبات المطلوبة. يفسر التفكير بهذه الوحدات كيف يكون تصريح الدالة مرئيا بينما يغيب تعريفها عند الربط.

تعرض سلسلة أدوات شائعة المعالجة المسبقة والترجمة والتجميع والربط كمراحل مستقلة. يحدد معيار ISO C سلوك الترجمة، لكنه لا يشترط برامج أوامر مستقلة لهذه المراحل. نجاح المترجم لا يثبت صحة منطق التطبيق ولا خلو البرنامج من جميع أخطاء التنفيذ.

البداية والتصريحات والآثار

في البرنامج المستضاف، تعد int main(void) صيغة قياسية لنقطة البداية. تصرح stdio.h بالدالة puts حتى يستطيع المترجم التحقق من استدعائها. يحتوي النص الحرفي المحارف المعروضة، وتضيف puts سطرا جديدا. تعني إعادة الصفر نجاح الإنهاء بالنسبة إلى البيئة المضيفة، وقد تفسر هذه البيئة قيم الحالة الأخرى وفق اصطلاحاتها الموثقة.

C وC++ لغتان مختلفتان. ترجم هذا الملف بوصفه C، وأبق اللاحقة .c، وتجنب نقل نصائح cout أو new أو المراجع أو الأصناف إليه. يوضح المثال الصغير عقدا بالفعل: تصف تصريحات المكتبة الاستدعاءات المسموحة، ويوفر التنفيذ سلوكها.

c برنامج مستضاف كامل
#include <stdio.h>

int main(void)
{
    puts("C program ready");
    return 0;
}
الناتج المتوقع
C program ready

توفر الترويسة التصريح؛ وتكتب puts سطرا واحدا ثم تبلغ main عن النجاح.

اختيار وضع لغة قابل لإعادة البناء

يسجل أمر صريح مثل cc -std=c17 -Wall -Wextra -Wpedantic hello.c -o hello اللغة المقصودة وتحذيرات مفيدة. تخص هذه الخيارات أدوات متوافقة مع GCC، وليست من قواعد C النحوية. ويتوقف اسم الملف التنفيذي وطريقة تشغيله على بيئة التطوير. احتفظ بالمصدر وأمر البناء معا عندما تطلب إعادة إنتاج نتيجة.

تتغير الإعدادات الافتراضية للمترجمات بين الإصدارات. يمنع اختيار C17 قبول تركيب أحدث أو امتداد GNU عرضا بوصفه أساس الدورة. التحذيرات أدلة للفحص، وليست برهانا على قابلية نقل كل برنامج مقبول. ابدأ بأول تشخيص لأن الرسائل اللاحقة قد تكون نتيجة للخطأ الأول.

تتبع تغيرات الكائنات

الكائن منطقة تخزين تمثل قيمة من نوع معين. يبدأ count هنا باثنين، ثم تستبدل التعليمة التالية القيمة المخزنة بخمسة، وتلاحظ printf تلك القيمة. الإسناد عملية، وليس تقرير مساواة رياضية. تكتمل كل تعليمة كاملة قبل بدء التالية في هذا التنفيذ البسيط أحادي الخيط.

يمكن لجدول التتبع تسجيل القيمة بعد كل تعليمة والنص المكتوب عند كل استدعاء إخراج. هذا أوثق من تخيل عناوين الذاكرة أو سجلات المعالج. تتيح الآلة المجردة تفسير النتيجة دون الادعاء بأن كل متغير مصدري يشغل خانة فعلية على المكدس.

c ملاحظة قيمة مخزنة
#include <stdio.h>

int main(void)
{
    int count = 2;
    count = count + 3;
    printf("count=%d\n", count);
    return 0;
}
الناتج المتوقع
count=5

يطابق %d النوع int. ويكتمل الإسناد المنفصل قبل أن تقرأ printf المتغير count.

تمييز أنواع الأدلة

يمنع الخطأ النحوي الترجمة؛ ويظهر الرمز غير المحلول عادة أثناء الربط؛ والإجابة الخاطئة فشل منطقي أثناء التشغيل. والانهيار أحد الأعراض الممكنة فقط لشيفرة C غير الصالحة. تسبب بعض الأخطاء سلوكا غير معرّف لا تفرض اللغة له نتيجة. لذلك لا تثبت مشاهدة تشغيل واحد مخرجا قابلا للنقل لبرنامج غير صالح.

احتفظ بسجل صغير يتضمن إصدار المترجم ووضع اللغة والمدخلات والمخرجات المتوقعة والفعلية. عندما تفاجئك نتيجة، اختزل البرنامج مع إبقاء العطل. تحول هذه الممارسة التقارير المبهمة إلى ادعاءات قابلة للفحص، وتهيئك لأدوات الاختبار والتنقيح اللاحقة.

الأخطاء الشائعة وإصلاحها

لا يجد الرابط دالة.

لماذا يحدث؟
أُدرج تصريحها، لكن تعريفها أو الملف الكائني المطلوب غائب.
كيف تصلحه؟
اربط وحدة الترجمة أو المكتبة الموثقة التي تتضمن التعريف.
كيف تتجنب تكراره؟
سجل مدخلات البناء وميز التصريح من التعريف.

لا يترجم المصدر إلا بوصفه C++.

لماذا يحدث؟
يختار الملف أو المشغل لغة أخرى.
كيف تصلحه؟
استخدم ملف .c ومشغل C بوضع C17 صريح.
كيف تتجنب تكراره؟
تحقق من أمر الاستدعاء الفعلي قبل مقارنة قواعد اللغات.

يبدو أن ملفا تنفيذيا قديما يتجاهل التعديل.

لماذا يحدث؟
فشل البناء أو أُنتج الملف التنفيذي في مسار آخر.
كيف تصلحه؟
عالج التشخيصات وتأكد من المسار وأعد البناء بنجاح.
كيف تتجنب تكراره؟
شغّل الملف المرتبط بعملية البناء الناجحة المسجلة فقط.

اختبر فهمك

1. توقع التتبع إذا بدأ count بأربعة وأضاف الإسناد سبعة، واشرح تعديل المصدر.

اعرض الحل المشروح

استبدل 2 في التهيئة بـ4 والثابت المضاف 3 بـ7. يصبح count بعد التهيئة 4 وبعد الإسناد 11، وتكتب printf النص count=11 ثم سطرا جديدا. يبقى النوع int والتنسيق %d، ولا يلزم افتراض عنوان أو معمارية.

2. يبلغ البناء عن puts غير مصرّح بها ثم أخطاء لاحقة. حدد التحقيق الأول وتقريرا قابلا لإعادة الإنتاج.

اعرض الحل المشروح

تحقق من تضمين stdio.h قبل الاستدعاء ومن اختيار المعالجة المسبقة للمصدر المتوقع. أصلح أول تشخيص ذي صلة ثم أعد البناء قبل تتبع الرسائل اللاحقة. أرفق المصدر القصير كاملا وإصدار المترجم وأمر C17 الدقيق ونص التشخيص. لا تخف التصريح المفقود بتصريح مخترع.

أهم ما تعلمته

  • يُترجم البرنامج ويُربط قبل ملاحظة سلوكه عند التشغيل.
  • اختر وضع اللغة صراحة وتعامل مع التشخيصات كأدلة.
  • يثبت التشغيل الناجح ذلك التشغيل؛ أما العقود اللغوية فتبرر الاستدلال القابل للنقل.

المراجع الرسمية