كيف يفهم الحاسب لغات البرمجة؟ ما هي المترجمات وكيف تبنى وما مبدأ عملها؟
إن كنت مبرمجاً أو قد تعاملت مع
لغات البرمجة ونفّذت برنامجًا يقدم عملك، فأنت بالتأكيد استعملت أحد البرامج التي تكتب بواسطتها شفرتك البرمجية. هذه البرامج هو حديثنا في هذا المقال، فهي استثنائية بصنعها وليست كأي برنامج عادي، فكلنا نستخدمها لنقوم ببناء برامج أخرى وبالتالي تُعدّ برامج الأم، وتدعى “
المترجمات“.
فبفرض لدينا برنامج مكتوب بلغة عالية المستوى (كـ
جافا أو C) ونريد تنفيذه من قبل الحاسوب، هذا يتطلب أن يكون لدينا مرحلة وسيطية تجعل الحاسوب قادرًا على فهم هذه اللغة نظرًا لأن الحاسوب يعمل على لغة الآلة (أصفار وواحدات)، وبالتالي عملية الترجمة هي تحويل الكود من لغة المصدر إلى لغة الآلة.
وبالطبع للقيام بذلك يجب أن يمر بعدة مراحل:[list="box-sizing: border-box; margin-bottom: 30px;"]
[*] التحليل اللفظي (المفردات)
[*] التحليل القواعدي
[*] تحليل المعاني
[*]توليد الشيفرة الوسيطية
[*]توليد الشيفرة النهائية
[/list]
وبذلك نحصل على برنامج الهدف.
المرحلة الأولى- التحليل اللفظي
عندما تقوم بتنفيذ برنامجك، يقوم المترجم أولًا باستخراج الكلمات التي تُسمى في عالم الحوسبة “المفردات Tokens” انطلاقًا من سلسلة الحروف، فإذا كان لدينا الشيفرة البرمجية التالية:
- اقتباس :
- For( i = 1; i < 10; i++)
فهنا سيستخرج أي سلسلة محرفية والتعرف على ماهيتها، مثلاً For هي كلمة محجوزة، i هي معرّف، إشارة = عملية إسناد، 1 هو معرف وهكذا… ومن ثم يقوم ببناء جدول للرموز، وهي عبارة عن قائمة من تركيبات تحمل خصائص المفردات التي تم تحديدها سابقاً، مثلاً 10 هو معرف ونوعهاinteger أي رقم صحيح وهكذا.
المرحلة الثانية – مرحلة التحليل القواعدي
يتم هنا التحقق من النحو الخاص باللغة للشيفرة التي أدخلتها ويكون وفقًا لمجموعة من القواعد التي تمثل الضابط الذي يحكم صحة تسلسل المفردات Tokens التي تم مسحها من قبل المرحلة الأولى.
وبعد ذلك يقوم ببناء ما يدعى بشجرة الإعراب باستخدام الـTokens التي استخرجها سابقًا، وهي شجرة تمثّل التسلسل الصحيح للكلمات وذلك بعد التأكد من صحة العبارة وهل هي صحيحة قواعديًا أم لا.
كالمثال التالي:
هذه الصورة تمثل تمامًا شجرة الإعراب للعملية الحسابية، وكما نلاحظ صحة تسلسل العملية التي مكّنتنا من بناء شجرة الإعراب الخاصة. شجرة الإعراب وقواعد بناء المترجم تُعدان بحثًا كبيرًا لمن يدرس في مجال الحاسوب، وهنا نحاول قدر الإمكان أن نعرفك ببساطة عليها.
المرحلة الثالثة- مرحلة تحليل المعاني
على المترجم في هذه المرحلة أن يتأكد إن كان ما كتبته له معنى، فقد تكون شيفرتك صحيحة قواعديًا ولكن ليس لها معنى، مثل إسناد محرف لمتغير من نوع رقم صحيح، أو إسناد متغير لمتغير، وتعتمد هذه المرحلة بشكل أساسي على جدول الرموز الذي استخرجها المترجم في المرحلة الأولى، وذلك لأن جدول الرموز هو من سيساعدنا على تجنب الأخطاء، مثلاً:
- اقتباس :
- X=5;
إسناد قيمة لمتغير X غير مصرح عنه سابقًا، فسيتم البحث عن المتغير في الجدول وإن لم يرَه سيعطي خطأ معنوياً، فجدول الرموز لديه كل اسم متغير وقيمته ونوعه وبالتالي يجنبنا هذه الأخطاء تمامًا.
المرحلة الرابعة- مرحلة توليد الشيفرة الوسيطية
وهنا وبعد كل ما سبق يقوم المترجم بإنتاج الشيفرة البرمجية إما بلغة الآلة أو لغة Assembly.
تماماً كالمثال التالي:
قد تسأل نفسك الآن ما هي الأدوات التي ساعدت في بناء هذا المترجم ليقوم بكل هذه المراحل والتدقيقات؟
في الحقيقة كما قلنا سابقًا، تُعدّ هذه البرامج برامج خاصة، وكيفية بنائها ليس اعتياديًا، فهناك عدة أدوات خاصة لبنائها. ولكن الآن سنتكلم عن أهم أداتين وتعدان الأداتين الأساستين والأكثر شهرة، وهما:
الأداة البرمجية (LEX)
وهي أداة تقوم بتوليد محلل المفردات أو ما يسمى بالماسح Scanner مكتوب بلغة c، حيث يستخدم قوالب جاهزة لمطابقة السلاسل المحرفية للشيفرة التي كتبتها ومن ثم يقوم بتحويلها إلى مفردات tokens وهي معرفات عددية ثابتة ترسل إلى محلل القواعدي.
فعندما يصادف الماسح متغيراً x مثلًا في سلسلة الدخل، فسيقوم بإرساله كـ token إلى المحلل القواعدي، ومن ثم يقوم بإدخاله إلى جدول الرموز وتعيين خصائصه مثل اسمه وقيمته ونوعه وحجمه وغير ذلك.
الأداة البرمجية (BISON)
وهي أداة تولد شيفرة بلغة C لمحلل القواعد، يعرف أيضًا بالمعرب Parser. يقوم المعرب باستخدام قواعد اللغة لتحليل الـ Tokens الآتية من الماسح، ومنها يبني شجرة الإعراب الموافقة حسب تسلسل الـ Tokens ليتسنّى من خلالها تحديد فيما إذا كانت العبارة تنتمي للنحو أم لا. وفي حال عدم مطابقتها للنحو، سيرسل الـ Bison رسالة خطأ.
من ثم وباستخدام أحد مترجمات لغة الـ C سيتم الحصول على البرنامج النهائي base.exe وهو المترجم الجديد.
هنا تعبر تمامًا عن مراحل بناء مترجم بسيط.
وبالطبع هذا ليس كل شيء عن بناء المترجم، هذا فقط تعريف بسيط عنه، فهنالك الكثير من العمل والكثير من الشيفرات والقواعد وملفات c التي يجب عليك كتابتها وبناؤها لتصل للنهاية.
وإن كنت مهتماً في هذا القطاع، فتستطيع استخدام هذا المقال التعريفي كرأس خيط للبحث عن المزيد، فهذا مجال واسع ودقيق.