لغة البرمجة C

لغة البرمجة C تعرف عليها وعلى إستخدامتها ومجالات عملها ومميزاتها

لغة C ظهرت لأول مرة في العام 1972 عندما قام دينيس ريتشي بتطويرها في مختبرات Bell. كان الهدف من إنشاء لغة C هو إنشاء لغة برمجة تكون قادرة على تطوير نظم تشغيل Unix. وبفضل سهولة استخدامها وكفاءتها، انتشر استخدام لغة C بسرعة وأصبحت لغة المفضلة في مجال برمجة الأنظمة.

لماذا لغة C؟

قد تتسائل، معظم اللغات في التي صممت في تلك الفترة أغلبها لا يتم استخدامه الآن، فلما C -ومشتقاتها- لا تزال شائعة؟

أولاً، لغة C توفر قدرة عالية في التحكم المباشر في الذاكرة. يمكن للمبرمجين تعريف المتغيرات والوصول إلى الذاكرة بشكل مباشر، مما يعطيهم مرونة كبيرة في تطوير أنظمة متقدمة وتطبيقات فعالة.

ثانياً، لغة C تتميز بأداءها العالي وكفاءتها. إذا كنت بحاجة إلى برنامج يعمل بسرعة ويستهلك موارد قليلة، فلغة C هي الخيار المثالي. تحكم المبرمج في كيفية تنفيذ البرامج واستخدام الموارد يجعلها مثالية لتطوير الأنظمة المضمنة- Embedded Systems- وتطبيقات الوقت الحقيقي- Real Time Applications.

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

  1. stdio.h: تعتبر هذه المكتبة من أكثر المكتبات استخدامًا في لغة C. توفر وظائف لإدخال وإخراج البيانات، مثل printf() وscanf() ومفاتيح الإدخال/الإخراج (stdin وstdout وstderr).
  2. stdlib.h: تحتوي هذه المكتبة على وظائف هامة لإدارة الذاكرة والتحكم في البرنامج. تشمل وظائف لإلغاء التخصيص (malloc() وfree()) وتحويل النص إلى عدد (atoi() وatof()) وغيرها.
  3. string.h: توفر هذه المكتبة وظائف للتعامل مع السلاسل النصية. يمكن استخدامها لنسخ ومقارنة السلاسل والبحث فيها ودمجها وتجزيئها. على سبيل المثال، تشمل وظائف مثل strcpy() وstrlen() وstrcmp() وغيرها.
  4. time.h: توفر هذه المكتبة وظائف للتعامل مع الوقت والتوقيت. يمكن استخدامها للحصول على التاريخ والوقت الحالي وتحويل الوقت إلى صيغة قابلة للقراءة. تشمل وظائف مثل time() وlocaltime() وstrftime() وغيرها.

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

رابعًا، لغة C محمولة وقابلة للانتقال بين المنصات المختلفة. يمكن تطوير برامج C على نظام واحد وتشغيلها على نظم تشغيل مختلفة دون الحاجة إلى تعديل كبير. هذا يجعلها مناسبة لتطوير البرامج التي تحتاج إلى التوافق والنقلية.

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

مجالات لغة C

أنظمة المضمنة- Embedded Systems:
يتم كتابة نواة أنظمة تشغيل iOS وAndroid وWindows Phone أيضًا بلغة البرمجة C. هذه النوى تعتبر تكييفًا للأنظمة الموجودة Mac OS وLinux وWindows. بالتالي، الهواتف الذكية التي نستخدمها يوميًا تعمل على نواة برمجية بلغة C.

ماك:
تعتمد أجهزة ماك على لغة C أيضًا، حيث يتم كتابة نواة نظام التشغيل OS X بشكل رئيسي بلغة C. كل برنامج وبرنامج تشغيل في أجهزة ماك، تمامًا مثل أجهزة الكمبيوتر التي تعمل بنظام التشغيل ويندوز وLinux، يعمل على نواة برمجية بلغة C.

لينكس:
تعتمد نظام لينكس بشكل رئيسي على لغة C، مع وجود بعض الأجزاء المكتوبة بلغة التجميع. تستخدم تقريبًا 97 في المئة من أقوى 500 كمبيوتر متعدد الوظائف في العالم نواة لينكس. كما يُستخدم على نطاق واسع في أجهزة الكمبيوتر الشخصية.

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

نواة أنظمة التشغيل المكتوبة بلغة C:
علاوة على ذلك، تلعب قواعد البيانات دورًا حاسمًا في مختلف الأنظمة في مجالات متنوعة مثل الشؤون المالية والحكومية ووسائل الإعلام والترفيه والاتصالات والصحة والتعليم والتجزئة وشبكات التواصل الاجتماعي والويب. تم تطوير أشهر قواعد البيانات المستخدمة في العالم، بما في ذلك قاعدة بيانات أوراكل وMySQL وخادم MS SQL وPostgreSQL ،بشكل أساسي بلغة C (بالإضافة إلى بعض الاستخدامات للغة C++).

أفلام ثلاثية الأبعاد:
تتم كتابة التطبيقات المستخدمة في إنشاء أفلام ثلاثية الأبعاد بشكل عام بلغات البرمجة C وC++. تحتاج هذه التطبيقات إلى كفاءة وسرعة عالية للتعامل مع كميات ضخمة من البيانات وإجراء العديد من الحسابات في الثانية. كلما كانت هذه التطبيقات أكثر كفاءة، زادت سرعة إنتاج لقطات الفيلم من قبل الفنانين والمحركين، مما يؤدي إلى توفير التكاليف للشركة المنتجة.

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

ثم تذهب إلى سيارتك. إذا كانت تحتوي على الميزات التالية، فإنها مبرمجة أيضًا بلغة C:

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

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

على الرغم من أن لغة البرمجة المستخدمة في الأنظمة المضمنة قد تختلف من علامة تجارية إلى أخرى، إلا أنها عادةً ما تبرمج بلغة C بسبب ميزات اللغة المرنة والفعالة والأداء الجيد والاقتران بالأجهزة.

مميزات C في كتابة الكود

التلاعب بالذاكرة – Memory Manipulation:

الوصول إلى عناوين الذاكرة وحساب المؤشرات هي ميزة هامة تجعل لغة C مناسبة تمامًا لبرمجة الأنظمة (أنظمة التشغيل والأنظمة المضمنة).

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

مثلاً، يمكن أن يتم تصميم المتحكم المصغر بحيث يتم إرسال البايت في عنوان الذاكرة 0x40008000 عن طريق جهاز الاستقبال/المرسل الجامع (أو UART، وهو عنصر أجهزة شائع للتواصل مع الواجهات الخارجية) كلما تم ضبط البت-bit- رقم 4 في عنوان 0x40008001 على القيمة 1، وعندما يتم ضبط ذلك البت، سيتم إلغاء ضبطه تلقائيًا بواسطة الجهاز الخارجي.

سيكون هذا هو الكود لدالة C التي ترسل بايتًا عبر UART:

#define UART_BYTE *(char *)0x40008000
#define UART_SEND *(volatile char *)0x40008001 |= 0x08

void send_uart(char byte)
{
UART_BYTE = byte; // كتابة البايت في عنوان 0x40008000
UART_SEND; // ضبط البت رقم 4 في عنوان 0x40008001
}

سيكون اول سطر في الدالة هو:

*(char *)0x40008000 = byte;

يخبرنا هذا السطر أن نفهم القيمة 0x40008000 كمؤشر-pointer- إلى حرف، ثم نقوم بإلغاء الاشارة (إعطاء القيمة المشيرة إليها) لهذا المؤشر (باستخدام العملية * ) وأخيرًا نقوم بتعيين قيمة البايت إلى تلك الاشارة الملغاة. بعبارة أخرى: نكتب قيمة المتغير بايت في عنوان الذاكرة 0x40008000.

سيكون السطر الثاني هو:

*(volatile char *)0x40008001 |= 0x08;

في هذا السطر، نقوم بعملية OR على القيمة في عنوان 0x40008001 والقيمة 0x08 (00001000 بالنظام الثنائي، أي واحد في البت رقم 4)، ونحفظ النتيجة في عنوان 0x40008001. بمعنى آخر: نضبط البت رقم 4 في البايت الموجود في عنوان 0x40008001. نعلن أيضًا أن القيمة في عنوان 0x40008001 هي متقلبة (volatile).

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

الاستخدام الدقيق للموارد

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

على سبيل المثال، يمكننا تحديد المسجلات في أجهزة المتحكم المصغر، مثل تحكمات GPIO (التي تستخدم للتحكم في التناظري والرقمي في الأجهزة الطرفية)، وكتابة القيم فيها لتحكم في مخرجات الأجهزة أو قراءة القيم منها لاستلام إشارات الإدخال.

في البرنامج التالي، نقوم بتعيين قيمة 1 على المسجل المتناظر PORTA وتحديده كمخرج، ثم نكتب قيمة 0 على هذا المخرج. هذا يعني تشغيل LED المتصل بالمخرج.

#define PORTA *((volatile unsigned char *)0x40004000)

void main()
{
PORTA = 0x01; // تعيين القيمة 1 على المسجل PORTA
PORTA = 0x00; // تعيين القيمة 0 على المسجل PORTA
}

يجب أن نلاحظ النوع المستخدم في التحويل القسري هنا (volatile unsigned char *). هذا يحدد العنوان (0x40004000) كعنوان لمؤشر غير ثابت (volatile) يشير إلى char بدلاً من نوع البيانات الافتراضي (int). النوع غير الثابت يخبر المترجم أن القيمة في هذا العنوان قد تتغير خارج نطاق تحليله وبالتالي يجب إعادة قراءة القيمة من العنوان بعد كل تعيين.

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

فيما سبق كان عرض مبسط لمزايا لغة C التقنية، في حالة انك لم تفهم بشكل كامل، لا تقلق.. المفاهيم بالفعل معقدة وهي مقدمة للمتخصصين بكتابة الكود.

يمكنك الإطلاع على تعريف REST API من هنا.

اشترك فى القائمة البريدية

عن الكاتب

شارك على وسائل التواصل

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

سبعة عشر + خمسة عشر =