المعلوماتية > برمجيات

البرمجة بلغة C++/C على نظام لينيكس

استمع على ساوندكلاود 🎧

لعلَّ من أكثر الأمور إزعاجاً أثناءَ البرمجةِ أن تكونَ مضطراً لاستخدامِ بيئةٍ برمجيّةٍ لم تكن تعرفها، بواجهةٍ مربكةٍ وربّما مكلفةٍ أحياناً. هناكَ بديلٌ أقلُّ تعقيداً، سنتعرَّفُ كيف نترجمُ البرامجَ من خلالِ واجهةِ سطرِ الأوامرِ باستعمالِ أدوات (gcc) الخاصّةِ بنظامِ GNU/Linux.

تاريخٌ مختَصَرٌ عن نظام لينيكس:

ظهرت النّسخةُ الأولى لنظامِ لينيكس أواخرَ عامِ 1990 نتيجةَ اتّحادِ مشروعَين طُوِّرا سابقاً وبشكلٍ منفصلٍ؛ عُرِفَ المشروع الأوّلُ بـ (GNU) لِـ ريتشارد ستالمان من معهد MIT، الّذي بدأ عام 1984 والّذي كان يهدفُ إلى تطويرِ نظامِ تشغيلٍ مكتملٍ مشابهٍ لنظامِ يونيكس (Unix) يدعَمُ مبدأ البرمجةِ الحُرِّةِ أو مفتوحة المصدر.

إلّا أنّه وعلى الرّغم من احتوائِه على مجموعةٍ متكاملةٍ من البرامجِ (مكتبات، مترجمات، نظامُ إدارة الواجهةِ الرّسوميّة، نظامُ إعداد النّصوص TeX، برامج للمستخدم النهائيّ،..) فقد كان يفتقد إلى نواة تشغيلٍ، ثمّ ما هي إلّا بضعُ سنواتٍ حتّى قامَ لينوس تروفالدز من جامعةِ فنلندا بتطويرِ نواةٍ مشابهةٍ لليونيكس عام 1991 وجعلها تحت رخصةٍ حرةٍ عامَ 1992، وبهذا اكتملَ مشروعُ نظام لينيكس*.

أدوات (GCC):

من أجل كتابةِ البرامجِ على نظام GNU، كان لابدّ من مترجمٍ للغةِ C، لكن آنذاك لم تكن مترجمات لغة C مجانيّة، وهذا ما دفع مشروع GNU إلى تطوير مترجمٍ من الصّفر؛ هو مترجم (gcc).

و قد ظهرت ،GNU C/C++ Compiler اختصارٌ لـ GCC، النّسخة الأولى له عامَ 1987، وهذه كانت خطوةٌ تاريخيّةٌ في عالمِ البرمجةِ الحرّة فقد كان أوّل مترجمٍ حرٍّ، يستطيعُ المطوّرون استخدامَه لكتابةِ برامجِ النّظام.

ثمَّ سرعان ما توسّع ليدعمَ لغاتٍ أخرى منها: Fortran، Ada، Java، Objective-C، و ++C ...

وأصبح اختصاراً GCC يعني:

GNU Compiler Collection

مثال: تحويل وتنفيذ برنامج بسيطٍ مكتوبٍ بالـ C

# الخطوة الأولى:

تأكّد من وجود المترجم بكتابة الأمر:

which gcc

الّذي سيُظِهرُ مسارَ المترجمِ داخلَ ملفّاتِ النّظام.

ولمعرفةِ رقم الإصدار:

gcc --version

معظمُ توزيعاتِ لينيكس تحتوي مترجمَ gcc داخلِها وإذا كانت التّوزيعةُ الّتي لديك لا تحتوي المترجم، قم بتحميله وتنصيبه بكتابة الأمر:

sudo apt-get install build-essential

من خلال نافذة سطر الأوامر (cntrl + alt + T):

سيقوم هذا بتحميلِ حزم التّرجمةِ وتنصيبِها.

# الخطوة الثانيّة: كتابةُ شفرة البرنامج.

اكتب البرنامج التّالي باستخدام nano أو gedit أو أيِّ محررِ نصوصٍ تفضله وقم بحفظه تحت اسم hello.c

# الخطوة الأخيرة: ترجمة وتنفيذ البرنامج.

لترجمة البرنامج نفّذ الأمر: gcc hello.c -o hello-executable

يمثل gcc اسم المترجم، و-o يعني اسم الخرج hello-executable

الّذي سوف نقوم بتنفيذه بعد انتهاء التّرجمة بنجاحٍ.

لتنفيذ البرنامج، تقوم بتنفيذِ الأمر: ./hello-executable

النّتيجة:

فيما يخصُّ البرامجَ المكتوبةَ بلغة ++C، مثلاً لنكتبِ البرنامج التّالي:

تستبدل اسمَ المترجمِ في الخطوةِ السّابقةِ بـ ++g الّذي يمثل مترجمَ البرامجِ المكتوبةِ بـ ++C وتُغيّير امتدادَ الملفِ إلى cpp أو C.

والبقيّة كما في المثالِ السّابقِ.

وبهذا تعرّفنا على كيفيّة ترجمةِ وتنفيذِ البرامجِ المكتوبةِ بلغة C++/C على اللينيكس.

لننتقل إلى مثالٍ أكثرَ عمليّةً؛ لنفترض أنَّك ترغبُ في تجريب آخر نُسخةٍ من تطبيقكَ المفضّلِ وقد حمّلتَ شيفرتَه المصدريّةَ.

ربما تتساءلُ لماذا أحمِّلُ الشِّفرةَ المصدريّةَ وأنا لستُ مبرمجاً؟

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

في عالمِ البرمجةِ مفتوحةِ المصدرِ**، يُوّفرُ المبرمجونَ والشّركاتُ الحرّة** على حدٍّ سواء الشّفراتِ المصدريّةِ لبرامجهم.

من ناحيةٍ أخرى وانطلاقاً أيضاً من مبدأ البرمجةِ مفتوحةِ المصدرِ الّذي تدعمه توزيعات لينيكس، يتشارك المطوّرون فيما بينَهم الشّفراتِ المصدريّةِ والتّعديلاتِ الّتي يجرونها على هذه البرامج، كنوعٍ من تبادلِ المعارفِ.

الآن لنفترض أنّك تريدُ تجريبَ آخرِ نسخةٍ من تطبيقِكَ المُفضّلِ، ولا تملك سوى الشّفرة المصدريّة. في هذه الخطوة لا تحتاج فعلاً لأن تكونَ مبرمجاً محترفاً، فقط بِضعُ أوامرَ على نافذة سطرِ الأوامرِ ويكون البرنامج صالحاً للاستخدام.

لنحمِّل الشّفرة المصدريّة لبرنامج المحادثة Pidgin

# أولاً: حمِّل آخرَ إصدارٍ للملفِّ من الموقع الرّسميّ:

هنا

# ثانياً: فكّ ضغطَ الملفِّ باستعمال الأمر:

tar -jxvf pidgin*

الامتداد tar.bz2 هو المكافئ لامتداد zip على الويندوز.

# ثالثاً: ادخل المجلد النّاتج عن العمليّة السّابقة وقم بتنفيذ الملفِّ 'configure' بكتابة الأمر: ./configure

- يقوم هذا الأمر بالبحث عن الملفّات الضّروريّة لترجمة ملفّات البرنامج.

- العلامة /. تُعلِمُ مفسّرَ سطرِ الأوامرِ بالبحث في المجلد الحاليّ.

- قد يكون من المفيدِ أن تقرأ ملفَّ ReadMe في حالِ كانت هناكَ تعليماتٌ خاصةٌ.

- في نهاية العمليّة، يُحتمل أن تقرأ رسالةً تُعلِمُكَ بنقص أحدِ الملفّات، قم بتحميلها بتنفيذ الأمر: sudo apt-get install [script-name]

واستبدل script-name بـ اسم الملفِّ النِّاقص.

(مثلاً عند تنفيذِ الأمر configure/. يظهرُ أنّ الملفَّ intltool ناقصٌ، فتقوم بتحميلِه بكتابةِ الأمر: sudo apt-get install intltool

#أخيراً: ترجمة وتنفيذ البرنامج.

بعد انتهاء الخطوة السّابقة، يترجَمُ البرنامجُ بكتابةِ الأمر: sudo make

تختلف مدةُ هذه العمليّةِ بحسب النّظام وحجمِ البرنامج.

عند انتهاءِ العمليّةِ السَّابقةِ، تنفذ البرنامجَ بكتابةِ الأمر: sudo make install

وبهذا تنتهي ترجمةُ البرنامج، الآن يمكنك فتحه بكتابة اسمه Pidgin على سطر الأوامر.

هامش:

* انتشرت تسميةُ لينيكس بدل غنو/لينيكس، وهذا خطأ فهو يتألّف من نظام غنو (الّذي يمثّل مجموعةَ التّطبيقاتِ المكوِنّةِ للنّظام) المطوّرة ضمن مشروع غنو لـ ريتشارد ستالمان، ونواة لينيكس المطوّرة من قبل لينوس تروفالدز (الوحدة البرمجيّة الّتي تعمل كواجهةٍ بين برامج النّظام والعتاد).

** في هذا المقال اعتمدنا مصطلحَي' البرمجة الحرّة' و'مفتوحةُ المصدر' للتّعبير عن نفس الشّيء لغرض التّبسيط، لكنّهما في الحقيقة يختلفان. لمعرفة الفرق بين البرمجة الحرّة ومفتوحة المصدر هنا

المراجع:

[1] هنا

[2] An Introduction to GCC -- Brian Cough (p. 3)

[3] Using the GNU Compiler Collection -- Richard Stallman et al.

[4] C programming in LInux -- David Haskins

[5] هنا

[6] هنا