يونيو 30، 2011

مع السي و gcc و المصرف الناشئ clang/llvm

في الشهر المنصرم قضيت ساعات طويلة في إسترجاع بعض ما تعلمته سابقا عن لغة البرمجة سي C و تعلم البعض الآخر مستخدما حاسوب متنقل بموصفات ضعيفة. رغم ذلك ثبت عليه ثلاثة أنظمة تشغيل حرة و مفتوحة المصدر، خفيفة الوزن، جد متطورة تقنيا و قابلة للتخصيص لأبعد الحدود: آرتش لينكس (Arch Linux), فري بي إس دي (FreeBSD 8.2) و أوبن بي إس دي (OpenBSD 4.9)

على آرتش أستخدم واجهة E17، مدير النوافذ Fluxbox على فري بي إس دي، ثم مدير النوافذ الإفتراضي FVWM على أوبن بي إس دي. استهلاك الذاكرة لا يتجاوز 42 ميجا على E17 و في حدود 30 ميجا مع Fluxbox و 23 ميجا مع FVWM.

بالنسبة لمحرر الأكواد البرمجية بلغة السي، إعتمدت على كل من Geany و Code::Blocks و أحيانا أخرى على المحرر النصي nano أو vi. التصريف/التجميع إما من سطر الأوامر أو من زر compile/build لـ geany و code::blocks. هذا الأخير متوفر على نظام ويندوز و هو أحدث و أفضل من المحرر Dev-C++ المنتشر بين الطلبة.

بالنسبة لعملية التصريف فهي تتم بواسطة تجميعة مصرفات جنو (GNU Compiler Collection) أو GCC بالختصار. جي سي سي مشهور جدا و هو المستخدم في تجميع تقريبا كل المنصات الحرة و المفتوحة المصدر بكل برامجها و مكتباتها، لذلك فهو ذو أهمية بالغة. جي سي سي يوفر كل الأدوات الضرورية لتجميع/تصريف ليس فقط البرامج المكتوبة بلغة السي بل أيضل تلك المكتوبة بـ سي++, جافا و Objective C إلى جانب لغات أخرى و هو يدعم أكثر من 40 معمارية مختلفة. جي سي سي مرخص تحت رخصة غنو العموميمة الإصدار الثالث (GPLv3). رخصىة جيدة لكن يراها البعض أكثر تعقيدا من الإصدار الثاني كما تضع قيودا إضافية على الشركات التي تريد التلاعب ببراءات الإختراع لملاحقة المجتمع الحر. في المقابل نجد إهتماما متزايدا بتطوير LLVM / Clang و هما معا البديل و المنافس لجي سي سي بحيث سيقدمان مصرف:
  • بترخص أكثر تساهلا.
  • مرن و ببنية موزعة و تعتمد على الوحدات بمعتى يسهل تطويره.
  • برامج تنفيدية محسنة لتحقيق أداء أفضل.

مشروع clang ممول من طرف Apple و مشروع FreeBSD غالبا سيكون أول نظام تشغيل مجمع حصريا بواسطتة.

لتجربة clang على ubuntu يكفي تثبيت حزمة بإسم clang و هي ستتكفل بتثبيت كل الإعتمادات اللازمة. ثم لتجميع برنامج بواسطته يكفي تنفيذ مثلا:
clang -v demo.c -o demo

محتوى demo.c قد يكون مثلا:
#include <stdio.h>

int main()
{
    printf("Hi everyone!\n");

    #ifdef __clang__
    printf("I was compiled using clang/llvm ;)\n");
    #endif

    return 0;
}


clang للآن - على ما يبدوا - مازال يحتاج إلى بعض أدوات gcc مثل ld و as لكن ذلك ليس بالشيء الكبير

الطريقة البديلة للتخلص كليا من gcc لم تنجح معي ربما لعلل أو لقدم الإصدار (استخدمت أبونتو 10.10) أو لأني غفلت عن خطوة معينة. الطريقة هي كالتالي:
clang -emit-llvm demo.c -c -o demo.bc
lli-2.8 demo.bc
llc-2.8 demo.bc -o demo.s

ثم اداة llvm-as و llvm-ld بطريقة قريبة من:
as --32 -o demo.o demo.s
ld -melf_i386 -o demo demo.o


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

أيضا لمعرفة كل التوجيهات (preprocessors) المدعومة من طرف clang يكفي تنفيذ:
clang -dM -E - < /dev/null
في النهاية أود الإشارة إلى كتاب عربي في لغة السي من إعداد خليل أونيس يدعى كتاب لغة السي الشامل. هذا الكتاب الأقل ما يمكن أن أقول فيه هو أنه رائع و مميز و سعدت جدا بقراءة معظمه. أكثر كتب برمجة إشتريتها كانت كتب سي و سي++ (8 أو أكثر) لم يعجبني ولا واحد منها، لكن هذا الكتاب رغم أنه مجاني و متاح إلا أنه لا يقدر بثمن للفائدة التطبيقية التي بذاخله. رحلتي مع سي لم و ربما لن تنتهي لأن السي و الأنظمة الشبيهة بيونكس متقاربون في النهاية.

ليست هناك تعليقات:

إرسال تعليق