المجلة الإلكترونية - مركز تحميل - القران الكريم - اتفاقية الاستخدام - تصفح الجوال - الاعلان - أضفنا في المفضلة

اشترك في مجموعة اصدقاء مجله الابتسامه البريديه الان
البريد الإلكتروني:

العودة   مجلة الإبتسامة > العالم التقني > صيانة الكمبيوتر > لغات البرمجة و الشبكة و انظمة التشغيل


ما هو المترجم Compiler ؟

لغات البرمجة و الشبكة و انظمة التشغيل



جديد مواضيع قسم لغات البرمجة و الشبكة و انظمة التشغيل

إضافة رد

كيفيه ارسال موضوع جديد
 
LinkBack أدوات الموضوع انواع عرض الموضوع
قديم August 15, 2009, 06:36 AM   رقم المشاركة : 1
معلومات العضو
عزم الارادة
صديق للمجله






عزم الارادة غير متصل

ما هو المترجم Compiler ؟



ما هو المترجم Compiler ؟


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

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

التعريف السابق بنفس الشكل والصوره هو الذي يحدث في عالم البرمجه ، فجميعنا نعرف أن الحاسب (المعالج والذاكره) لا يتعاملان الى مع الأرقام الثنائيه 0 و 1 (سيران تيار أو عدم سيرانه) ، لذلك أي برنامج نكتبه يجب أن يتحول الى هذه اللغه ( لغه الأله Machine Langauge ) ، وهو بالضبط وظفيه المترجم ، التحويل من لغه الى لغه أخرى (قد تكون لغه الأله أو لغه أخرى على حسب نوع المترجم والغرض المصمم من أجله) .

الى الأن ، هذا المفهوم يعرفه أغلب المبرمجين ، حتى الجدد منهم ، وهو مهمه التحويل (الصندوق الأسود) الذي يبينه الشكل التالي :



موضوعنا الليله هو كشف الستار وأزاله اللون الأسود من الصندوق ونعرف مالذي يجري بالضبط من خلف الكواليس ....

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

فالمعالج يحتوي على أمور كثيره اهمها هي وحده الحساب والمنطق وهي المسؤوله عن تنفيذ جميع العمليات الحسابيه والمنطقيه ، ونستطيع أعطاء هذا المعالج أوامر بتنفيذ أي مهام نريدها وذلك بواسطه لغه يفهمها هذا المعالج . فمثلا لو ذكرنا له 001 0101 101 فمعناه أجمع على محتويات المسجل الفلاني القيمه الفلانيه .. ومن هنا كانت لغه الأله هي اللغه الوحيده التي يمكن أن نكتب بها برنامجا يقوم المعالج بتنفيذه . (البرامج في بدائه ذلك الوقت ، كانت جميعها تنصب في العمليات الحسابيه ، وحساب المثلثات والدوال الرياضيه مثل الجيب والجتا وما الى ذلك ) .

بعد ذلك بدأت بضعه شركات مثل أنتل وموتورلا بانتاج المعالجات الخاصه بها ، وبالطبع لكل معالج تعلميات Instruction Set تحتلف عن الأخر، كما أن تركيب المعالج من الداخل وعدد المسجلات وطريقه العمل تختلف من معالج لأخر .. في البدايه أول معالج ظهر 4004 يتعامل مع 4 بت (ال ALU يتعامل مع 4 بت ، وحجم ال Data Bus 4 -Bit ) . وبعدها وفي زمن قياسي بدأ العصر الثاني للمعالجات 8085 Intel ، و Intel 8086 ولم تتعدى 5 سنوات وظهر الثالث وحاليا نحن في الجيل الخامس للمعالجات ..(لن نغوص أكثر في هذا الموضوع ، قد نتكلم عنه في موضوع مستقل في المسقبل باذن الله) .


بدأ المبرمجين بعدها بالأستفاده من قدرات هذه المعالجات وبدؤا بكتابه البرامج (أغلبها رياضيه وحسابيه كما ذكرت) ولكن سرعان ما بدأت المشاكل بالظهور ، فالمبرمج لم يستطيع حفظ مجموعه صماء من الأرقام (التعليمات) اضافه في حال أراد أن يعدل على برنامج كتبه أو يضيف أمور أخرى Maintenance فهذه الأمور أصبحت كابوس nightmere لمبرمجي لغه الأله وخاصه الجدد منهم !

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

ومن هنا كانت ولاده مفهوم التحويل أو الترجمه في عالم البرمجه ، وبدأ المبرمجين بالأرتياح في التعامل مع البرمجه بلغه الأسبملي ، فبدل أن كانوا يتعاملوا مع لغه الأله الصماء لمعالجات Motorola الأن يستطيعوا أستخدام لغه الأسمبلي الخاصه بمعالجات Motorola وهي فقط لا تتعدى 70 تعليمه (في بدايات ظهور المعالج ، ومع كل جيل جديد تتولد العديد من التعليمات أيضا) ، اضافه على ذلك وهو الأهم أن البرمج لن يهتم بالعنوان الفلاني في الذاكره الذي يحفظ في قيمه ما ، فقط سوف يتذكر أسم متغير Variable ويتولى الأسمبلر مهمه تحويل المتغير الى عنوان "قابل للتعديل Relocatble" ماذا تعنى الجمله الأخيره ، لا عليك منها الأن ، سوف نتعرف عليها بعد قليل .

أذا مهمه ال Assembler تحويل الكود من لغه الأسمبلي الى لغه الأله ، تحويل المتغيرات الى عنواين قابله للتعديل من قبل الرابط ، أيضا سوف يقوم الأسمبلر بتحويل اي Label الى عنوان بالنيابه عنك ،اضافه الى تجاهل التعليقات Comments التي تكتبها في برنامجك (والتي هي ضروريه لفهم عمل البرنامج خصوصا في البرامج الكبيره ) .


ومع تطور قدرات المعالج من 4 بت الى 8 الى 16 بت ، تغيرت متطلبات البرمجه أيضا ، فبدلا من أن تكون مجرد أجراء عمليات حسابيه ، أصبحت هناك متطلبات أخرى كبرامج لمعالجه النصوص ، برامج لتخزين البيانات ، ألعاب بسيطه للترفيه ، أصبحت الخوارزميات أكثر تعقيدا ويصعب كتابتها بلغه الأله .. ومن هنا كانت لغه الأسمبلي أيضا كابوس لكتابه أحد هذه البرامج خصوصا عند صيانه البرامج ..

كنتيجه لهذا الأمر أحتاج المبرمجين الى لغه أكثر سهوله في وصف البرنامج وأقرب الى لغه الأنسان حتى يتم تطبيق الخوارزميات المعقده بأسهل أسلوب ، ومن هنا ظهرت أول لغه برمجه من هذا النوع "عاليه المستوى High Level" وهي اللغه فورتران وبعدها تبعتها بقيه اللغات مثل Basic ، وباسكال وسي ، وكل من هذه اللغات كان لها سبب ما في ظهورها ، فمنها ما كان كتطبيق لمنهج Paradigms مختلف في البرمجه مثل OO ، أو كان نتيجه لعيب في اللغه السابقه ، أو كان سبب تعليمي بحت .

الأن لكي نقوم بتنفيذ برنامج مكتوب بلغه عاليه المستوى في معالج معين ، نحتاج الى أن نحوله Compile it الى لغه الأله مباشره ، أو الى لغه الأسمبلي للمعالج المعين ، وبعدها نستخدم Assembler لكي نحول من الأسمبلي الى لغه الأله ..

تميزت اللغات العاليه المستوى HLL بالسهوله في الكتابه وفي الصيانه أيضا ، حيث يمكن أن أنفذ مهمه كتبت في لغه الأسمبلي بعشره أسطر بسطرين في اللغه HL .
لكن بالطبع
الكود الناتج سيكون أطول في حاله أستخدمنا اللغه HL ، حيث أن كل سطر بالأسمبلي سيتحول الى سطر أخر في لغه الأله (أي تعليمه تتحول الى تعلميه واحد فقط) لكن في حاله HLL أي تعليمه سوف تتحول الى عده تعليمات قد تصل الى 7 أو 10 تعليمات .

لو نظرنا قليلا فسوف ندرك ميزه نادره في اللغات HLL ، حيث سنجد أنها تعمل على أي معالج بشرط توفر مترجم لهذه اللغه Compiler ، فاذا قمنا بكتابه برنامج بلغه السي يعمل تحت معالجات أنتل ، فسوف يعمل هذا البرنامج في معالجات موتورلا عندما نجد مترجم للغه سي تعمل على هذا النوع من المعالجات .
هذه الميزه تسمى Portability ويترجمها البعض بالمحموليه .

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

الكلام "قد" يكون صحيح في حالات وحالات أخرى لا ، والسبب هنا هو نظام التشغيل Operating System .


مثال بسيط ، أكتب برنامج بلغه السي أو أي لغه HLL في نظام Windows ، وترجم البرنامج وخذ الناتج ملف exe في أي نظام ويندوز أخر يعمل بنغس معالج النظام الأول ، وسوف يعمل ملف exe مباشره بدون ترجمه الملف الأصلي ... لكن خذ مثلا هذا الملف واذهب به الى أي نظام تشغيل أخر ، ولن يعمل بالطبع . السبب في هذا الأمر هو تعليمات اللغه في الأصل وخاصه الأدخال والاخراج تعتمد على نظام التشغيل ، فثلا printf في ويندوز قد تقوم بمناداه دوال في النظام System Call تختلف بالطبع عن الدوال في نظام أخر .

اذا لغات ال HLL تتميز بالسهوله Simplicity و Portability و Readablity أيضا فالبرنامج المكتوب بها يكون أكثر مقروئيه من المكتوب بلغه الأسمبلي أو الأله . ولكنه بالطبع أكبر حجما وأقل كفائه effecincy !


نعود الى الأجابه للسؤال السابق : "هل نستطيع الأستنغناء عن المترجم" ؟
نعم ، اذا كنت تستطيع كتابه برامجك بلغه الأسمبلي
نعم ، اذا كنت تستطيع تعديل أنظمه متقدمه كتبت بلغه الأسمبلي ..
نعم ، اذا كنت تستطيع كتابه ملاييييييين الأسطر من الشفره ، وتستطيع تعديل أي منها في ثواني ، وقرائتها وفهمها في ثواني !!!
لا ، غير ذلك

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

نعود لصديقنا المترجم بين أخينا السوداني والأخ الياباني ، فحتى يقوم بالترجمه بشكل صحيح ، عليه أن يفهم مالذي يقوله الشخص الأول (تحليل للكلام) ومن ثم يقوم بترجمه ما فهمه الى الشخص الثاني (توليد الكلام ) .

بنفس الأمر في المترجم ، يجب أن يحلل النص أولا في مرحله يمكن أن نطلق عليها أجمالا ب Analysis Phases بعدها يقوم يتحويل اللغه الجديده المراد الوصوله اليها وهي مرحله Sysntheses Phases (التوليد) . ها هو صندوقنا الأسود بدء بالأنكشاف ..

الأن لماذا يحلل المترجم وبعدها يبدأ بالتوليد ؟ هنا الجواب هنا للتأكد من أن البرنامج صحيح وموافق تماما للقواعد في اللغه . فاذا كان هناك خطأ ما في هذه المرحله سيتوقف من العمل ، وسيخبرك بمكان هذا الخطأ (في الاخطاء النحويه -قواعديه- Syntax Error سوف يتوقف المترجم مباشره من العمل ، أما في الأخطاء الأخرى لن يتوقف من العمل وسيكمل مرحله تحليله واكتشاف باقي الأخطاء ، طبعا هذا ما يعرف ب Error Recovery ، سوف نتكلم عن كل هذا لاحقا !).

هكذا تكون مرحله التحليل Analysis تتكون من عده مراحل ، كل واحده لها دور معين وهي :
Lexical Analysis
Sytanx Analysis
Semantic Analysis
Inermedaite Code Generation

أما مرحله التوليد ، فهي توليد الكود الهدف Target Code بعدما تأكدنا تماما من خلو البرنامج من الأخطاء ، وهي تتكون من :
Code Optimization -قد يحتوي المترجم على محسن أو قد لا يحتوي-
Code Generation

طبعا مرحله التحليل لسيت خاصه فقط بانتاج مترجمات ، هناك العديد من التطبيقات تتطلب عمليه تحليل Analysis للكود ، مثلا برنامج يقوم بعمل معالجه معين للكود ، أو برنامج يقوم بتلوين كلمات معينه في النص Syntax Highleight ، أو حتى المفسر Interpreter يقوم بعمليه تحليل للنص لكي يقوم تنفيذه مباشره ..

المراحل السابقه كما ذكرت هي فقط Model بسيط لعلميه الترجمه ، لكن هناك مراحله أخرى "مهمه" للغايه مثل التعامل مع جدول يسمى جدول الرموز Symbol Table و مرحله التعامل مع الأخطاء error Handling .

دعنا الأن نكشف الستار عن الصندوق الأسود ، لكي نرى مكان جميع هذه المراحل بالضبط ، وتبقى كل مرحله من هذه المراحل هي صندوق أسود بحد ذاتها ، حيث أن أسم المرحله يوضح عملها ، لكن بالطبع ما يجري بالخلف قد يكون مختلف كثيرا عن ما تتصوره :



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

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



^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^
^^^^^^^

لكشف الستار حول هذه الصناديق السوداء ، سوف نحتاج لأكثر من 20 مقال أو أكثر ، وبما أن هذا الموضوع عباره عن مقدمه بسيطه للمترجمات وليس درس From A To Z لذلك سوف نتحدث عن كل مرحله بشكل مبسط للغايه ، وإن كتب لنا عمر سوف نكمل تلك المراحل كل على حده ، طبعا أهم في الموضوع هو الحديث النظري ثم العملي يجب أن نطبق ما درسناه في الجزء النظري ، والا سيبقى كلام "نظري" فقط بدون فائده ..

لنبدأ من البدايه بعد كتابتك للبرنامج Source Code ثم قمت بتشغيل المترجم Compiler ماذا سيحدث بعد ذلك ؟ بالطبع سيتحول ال Source Code الى Machine Code في ملف Object ينتهي امتداده ب Obj . نعم هذا كل شيء ولكن يجب أن نعرف بالضبط ما هي وظيفه المكونات التي توجد في الصوره السابقه ووظيفه كل منهم على حده ، وهو موضوع مقاله اليوم .

المحلل اللغوي Lexical Analysis (طبعا ترجمه هذه المصطلحات أمر عقيم جدا ، لذلك لاتأبه للترجمه فقد قمت بكتابتها لزياده عدد الأسطر فقط فهي "لا تودي ولا تجيب" ) . وظيفه هذا المكون هو عمل Scan لل Source Code ويقوم في هذه الأثناء بالتعرف على ال Token المكون لل Source Code . فمثلا وجد المتغير x فسوف ينظر ال Lexical Analysis ويري هل هذا المتغير موافق للقاعده التي يجب أي متغير يطبقها ، فاذا لم يكن المتغير مطابق للقاعده مثلا المتغير 3d (بدأ برقم) أو المتغير S Number (أحتوى على مسافه) فيقوم بعدها ال Lexical باصدار رساله خطأ تنص على أن هذا المتغير خاطئ لأنه غير موافق للقاعده الخاصه بتعريف المتغيرات (سوف نطلق على المتغيرات أسم Identifier "معرفات") .

في حال كان ال Identifier صحيح ، سوف يكمل ال Lexcial عمله ، وهنا لديه وظائف أخرى وهي رفع هذا ال Identifier في جدول الرموز Symbol Table اذا لم يكن موجود في الجدول ، واذا كان موجود فبالطبع لن يضيفه ، هذا الأمر ، الأمر الثاني وهو أن ال Lexical Analysis عندما يتعرف على اي معرف ، سوف يقوم أيضا باعادته الى المرحله الثانيه وهي مرحله ال Syntax Analysis "هل تترجم الى المحلل النحوي ، ربما" ، حتى تستوعب الأمر أكثر فإنك يمكن أن تعتبر أن هناك داله تسمى Lexcial Analysis وظيفه هذه الداله هو ثلاثه أمور ، أولا تتعرف على ال Identfier التالي ، بعدها ترفعه في جدول الرموز اذا لم يكن موجود ، وبعدها تعيد هذا ال Identifier الى الداله المستدعيه وهي ال Syntax Analysis . لماذا يعيد ال Lexical ال Identifier الى ال Syntax ؟ بالطبع حتى يتأكد من أنه مطابق لقواعد Syntax اللغه ..

اذا الى الأن يجب أن نعرف قاعدتين ، أحدها خاصه بقواعد اللغه ونعرفها عن طريق Context Free Grammer ، والأخرى لتعريف قواعد ال Identifier وتسمى Regular Exepression ، كيف ، لماذا ، بماذا ، من أين ... كل هذه الأسئله بالتأكيد سوف تخطر على بالك ، لكن كل ما عليك الأن هو أن تتجاهلها فقط "بكل بساطه" . وفي المقال القادم سوف نضع النقاط على الحروف وتكمل بيت القصيد بنفسك ..

مثال بسيط لتوضيح طريقه عمل ال Lexical ، اذا كان لدينا سطر Statement يحتوي على :

CODE:
x = y + z * 30


يقوم بعمليه المسح Scan الى أن يصل للفراغ التالي White Space ، ,وسوف يتعرف على الأتي :

Identifier x
Assignment operator =
Identifier y
plus operator +
Identifier z
multiplication operator *
number 30

كيف تعرف على ال Identifier والمعاملات الحسابيه ، هذا عن طريق ال Regular Experssion ، تذكر هذا . بالنسبه للفارغات و التعليقات سوف يتجاهلها ال Lexical Analysis . كيف سيتعرف على الفراغات والتعليقات ؟ بالطبع يجب أن يكون هناك Regular Exepression يصف لي أشكال هذه الأمور (Token) .

هل هذا كل ما في الأمر ، بالطبع لا ، المقاله القادمه سنتكلم بالتفصيل عن محتويات هذه المرحله وسنقوم بكتابه Lexcial Analysis بسيط للغايه باذنه تعالى ..

المرحله الثانيه وهي التي يبدأ بها المترجم عمله وهي Syntax Analysis ، وهي كما ذكرنا تتأكد من أن ال Token التي جائت من المرحله الأولى تتوافق مع القواعد الخاصه باللغه . كيف يمكن التأكد من ذلك ، "نظريا" يمكنك أن تقول أنه الSyntax Analyzer (يسمى Parser أيضا) ينشى شجره تسمى Parse Tree على أساس القاعده التي تحددها أنت. الشكل التالي يبين ال Parse Tree لل Statement السابق على أساس القاعده التاليه :

أي Identifier يعتبر Expression
أي رقم Number يعتبر Expression
أي Expression + أو - Expression يعتبر Expression أيضا .
أي Identifier = Expression يعتبر Statement
أي while ( Expression) stmt يعتبر Statement وكذلك ال For يعتبر Statement أي if ( Expression) then stmt تعتبر Statement .

(stmt أختصار ل Statement ، أيضا في حال كتبنا exp بالطبع سوف تكون أختصار ل Expression) .

هذه التعليمه Statement :
CODE:
x = y + z * 30


تصبح ال Syntax Tree للتعليمه السابقه :



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

المرحله التاليه وهو مرحله ال Symantic Analyzer وهي تقوم بعمل فحص للأنواع البيانات والتأكد من أي كل عمليه تجري على ما يرام ، فمثلا لن يسمح لك باستخدام عدد حقيقي كIndex في مصفوفه ، أيضا يقوم بعمل Convert في بعض الأحيان مثلا أجريت عمليه حسابيه بين متغير صحيح وحقيقي فسوف يقوم "ضمنيا" بعمليه تحويل العدد الصحيح الى حقيقي .. هذه هذ وظيفه ال symantic Analysis وهي ال Type Checking ، كما يقوم أيضا بجلب واضافه معلومات أخرى عن ال Identifier الموجوده في جدول الرموز Symbol Table ، فكما عرفنا سابقا أن ال Lexical Analyzer هو الذي يقوم برفع ال Identifier الى هذا الجدول (ولكن جدول الرموز لن يستطيع معرفه المعلومات الأخرى عن هذه ال Idntifier مثل المجال Scope ، الحجم Size ، وفي حال كان ال Identifier هو أسم للداله فلن يعرف نوع القيم المرسله والراجعه وطريقه الأرسال "بالقيمه أو بالمؤشر" ) ، كل هذه الأمور يقوم ال symantic بالتعرف عليها ..

المرحله التاليه وهو مرحله توليد كود يعتبر وسيط أو Abstract أي كود عام (يمكن أن تعتبره ك Psuedo-Code) يمكن أن نقوم بتحويله الى لغه الأله لأي معالج ، وهناك طرق كثيره لعمل مثل هذا الكود وأشهرها هي ال Three Address Code ، سوف نتناولها فيما بعد .

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

المرحله الأخير وهي توليد الكود الهدف أو الكود المراد الوصول اليه سواء كود بلغه الأله او أي لغه أخرى على حسبب وظيفه المترجم ، وسوف يأخذ Code Generation مخرجات المرحله السابقه ويقوم بالتوليد على هذا الأساس .

هناك مرحلتين أخريات هما Symbol Table Management و ال Error Handling ، والأولى كما ذكرناها سابقا نحتفظ بها ال Identifier وال Keywords وجميع المراحل تتعامل مع هذا الجدول ، أما ال Error Handling فالغرض منه ايجاد باقي الأخطاء في ال Source Code وعدم التوقف مع ظهور أول خطأ ، وهنا سوف نستخدم بعض طرق الأصلاح حتى نكمل عمليه الترجمه .

الصوره التاليه توضح وظيفه كل من المراحل السابقه بشكل مبسط للغايه :



لاحظ أنه بعد أجراء المرحله الأولى تتغير أسماء المعرفات ، ولكنها تبقى بنغس الأسم في جدول الرموز ... أيضا في مرحله توليد الكود ، هنا يجب أن تولد كود الأسمبلي على حسب المعالج الذي تعمل عليه ، فاذا كنت تعمل في معالجات أنتل فاكتب كود هذه المنصه ، أما اذا كنت تعمل على معالجات أخرى مثل موتورولا MC6800 فالكود الأسمبلي سوف يختلف أيضا ،في الصوره السابقه الكود على حسب Intel Instruction.

بالنسبه الى أول أربعه مراحل فعاده ما يطلق عليها Front End حيث هذه المراحل تتعامل مع ال Source Code وليس لها أي علاقه مع الكود الهدف target Code بعض الأحيان مرحله التحسين تكون هنا أيضا ، وبعض الأحيان تكون في الجهه الثانيه ، أما أخر مرحله فتسمى Back End وهل التي تتعامل فقط مع ال Target Code . طبعا لهذا التقسيم فائده جيده ، ففرضا قمنا بكتابه مترجم سي++ لمعالجات أنتل ، فلو أردنا أن نقوم بكتابه مترجم لمعالجات موتورولا ، كل ما علينا هو تغيير ال Back End ويكون ال Front End كما هو (حيث كما ذكرنا ليس له علاقه بالبرنامج الهدف) .


الى هنا تعرفنا على الأشياء الأساسيه التي يقوم بها المترجم لحظه الضغط على زر الترجمه ، لكن هناك أمور أخرى يجب أن تتوافر لكي يعمل البرنامج النهائي مثل Linker و Loader و Assembler لكي ننتج كود الأله ، بالاضافه الى أن هناك بعض المترجمات قبل البدء بعمليه الترجمه تقوم بتشغيل Preprocess يقوم بعمليه تبديل Substitute لعده أمور ، مثلا في لغه سي و سي++ يقوم ال Preprocessor بالتعامل مع الجمل التي تحتوي على # ، ويقوم المعالج التمهيدي بالتعامل معها وتحويلها الى الشيء المطلوب ، وعندما يبدأ المترجم عمله فلن يرى أي جمله تحتوي على # لأن المعالج التهميدي قد حولها الى جمل عاديه .

اذا من الممكن أن نعتبر الصوره التاليه هي نموذج لأنتاج اي لغه :



المرحله الأولى هنا وهي تختلف باختلاف اللغات ، فمثلا لغه سي++ تدعم ال Preprocessor بينما في الجافا لا توجد Preprocessor ، لذلك هذه المرحله ليست Standard بل على حسب اللغه ، وكما ذكرنا الوظيفه الأساسيه هي عمل شيء معين قبل أن يبدأ المترجم عمله ، مثلا تعريف الثوابت في لغه السي باستخدام #define فمثلا لو كتبنا :

CODE:
#define MAx 10


وفي منتصف البرنامج كان هناك MAX ، وقمنا بتشغيل المترجم ، سوف يبدأ ال Preprocessor عمله ويقوم بتغيير أي MAX في منتصف البرنامج بالقيمه 10 وهو ما يسمى ب Substitute ، أيضا جمل #include يقوم ال Preprocessor باستبدال الملف الرأس بمحتوياته .(راجع قسم سي++ للمزيد عن ال Preprocessor ).

الأن أنتهي ال Preprocessor عمله ، وبدأ المترجم وأنتهي عمله أيضا ، الناتج هو كما ذكرنا في البدايه أما أن تكون كود بلغه الأسمبلي (وهو الأشهر)ملف ينتهي بالأمتداد ASM ، أو كود بلغه الأله مباشره (أي أن Assembler مضمن ضمن المترجم) وهنا في هذه الحاله لن نحتاج الى المرحله التاليه .

نرجع للصوره ، قمنا بعد عمليه الترجمه باستخراج ملف Assembly ، وبعدها سوف ندخله في المجمع Assembler وسوف يخرج كود بلغه الأله في ملف Object ، هذا الكود أو الملف يسمى عاده ب Relocatable Machine Code ، بمعني أن العنواين في هذا الكود قابله للتعديل . ماذا يعني هذا الكلام ؟ ولماذا يجب أن نعدل في العنواين ؟ وهو ما سنراه بعد قليل ..

الأن لدينا Relocatable Machine Code سوف ندخله في ال Linker لكي يرتبط ببعض المكتبات اذا أحتاج ذلك أو أي ملف Object ، أما ال Loader فهو المسؤول عن رفع البرنامج الى الذاكره في مواقع يقوم بتعديلها هو لكي تتناسب مع المواقع الموجوده لديه ، سنعرف بعد قليل كيف يتم ذلك بعد أن نتعرف على ظيفه الأسمبلر Assembler ،

لنفرض أن لدينا التعليمه التاليه في ال Source Code :
CODE:
b = a + 2


الأن بعد ترجمه هذه ال Statement ، خرج لدينا كود الأسمبلي التالي :
CODE:
MOV R1,a
ADD R1,2
MOV b,R1


حسنا عندما نضغط على زر Assembler أو عندما يعمل هذا ال Assembler فهو يقوم بعمل مسح Scan أو يمكن أن نطلق عليها Pass مرتين ، أي يقوم بالقرائه من البدايه الى النهايه Two Passes ، في الدوره الأولى سوف يقوم بتخزين أسماء المتغيرات وعنواينها في جدول يسمى جدول الرموز (يختلف عن الجدول الموجود في المترجم) ، فعندما يجد المتغير الأول سوف يرفعه في الجدول بالاضافه الى موقع هذا المتغير مثلا 0 ، واذا وجد الثاني فسوف يدخله في الجدول أيضا مع موقعه مثلا 4 (الزياده بأربعه بايت لأن حجم الأعداد الصحيحه هي 4) ، ومن خلال كود الأسمبلي السابق ، فإن جدول الرموز بعد الدوره الأولي سوف يكون بالشكل :



الأن يقوم الأسمبلر بالدوره الثانيه ، وهنا سوف يقوم بأمرين ، الأول هو تحويل كود الأسمبلي الى كود لغه الأله ، الثاني هو تحويل أي أسم متغير أو Label الى العنوان الموجود في جدول الرموز .. وهكذا يخرج لدينا كود لغه الأله القابل للتعديل ، لماذا قابل للتعديل ؟ لأن المتغير a الان في الموقع 0 ونحن نعرف أن المواقع في الذاكره من 0 الى رقم ما تكون محجوزه لنظام التشغيل ، لذلك سوف يقوم ال Loader عندما يبدأ عمله بايجاد خانات مناسبه مثلا من الموقع 100 ، وبعدها يزيد الى أي عنوان في البرنامج ويقوم بتحميله في الذاكره ، لذلك سمى بال Relocatable لأن ال Loader سوف يزيد على هذا العنوان عدد معين حتى يضعه في مكان مناسب في الذاكره .

لنفرض أن كود لغه الأله Relocatable Machine Code لكود الأسمبلي السابق هو :

CODE:
0001 01 00 00000000
0011 01 10 00000011
0010 01 00 00000100


أول أربعه بايت هي لعمليه Load و Store أو Add .
البايتان الثانيان هم لتحديد المسجل
البايتان التاليان هم Tag لتحديد هل القيمه التاليه (سواء عنوان أو قيمه قابله للتعديل) 00 تدل على أنها قابله للتعديل .

الأن عندما يبدأ ال Loader عمله ، ولنفرض أنه أراد البدء من العنوان 15 ، اذا فسوف يقوم بزياده 15 على كل عنوان قابل للتعديل في كود لغه الأله ، ويصبح لدينا :

CODE:
0001 01 00 00001111
0011 01 10 00000011
0010 01 00 00010011


لاحظ السطر الثاني القيمه 2 لم تتغير لأنه عباره عن رقم 2 وليس عنوان (ويعرف ال Loader ذلك عن طريق ال Tag) .


الى هنا نتوقف الليله ، وأمل أن تكون عزيزي الطالب أن تكون أخذت لمحه قويه عن موضوع المترجمات ، أما بالنسبه لطلاب ماده المترجمات فالمره القادمه بمشئيه الله نحاول التعمق أكثر وأكثر في الموضوع .. ونحاول أن نقوم بكتابه مترجم من جمله رياضيه الى أخرى From Infix To PostFix ...

بالتوفيق للجميع ،
منقول

 

 







   رد مع اقتباس

قديم October 14, 2009, 08:07 AM   رقم المشاركة : 2
معلومات العضو
طهر المشاعر
امـ نوافـــ






طهر المشاعر غير متصل

رد: ما هو المترجم Compiler ؟


رائع جدا ..
شكرا لك..





   رد مع اقتباس

قديم October 19, 2009, 02:41 PM   رقم المشاركة : 3
معلومات العضو
اريج الزهوور
صديقة المجله






اريج الزهوور غير متصل

رد: ما هو المترجم Compiler ؟








   رد مع اقتباس

إضافة رد

لغات البرمجة و الشبكة و انظمة التشغيل

لغات البرمجة و الشبكة و انظمة التشغيل



مواقع النشر (المفضلة)
المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
برنامج frndic المترجم العربي والفرنسي dj1ali تحميل برامج و شروحات الكمبيوتر 11 February 10, 2011 04:26 PM
المترجم الفوري | تحميل المترجم الفورى 2009 | برنامج المترجم الفوري كامل hima_tiger تحميل برامج و شروحات الكمبيوتر 186 November 7, 2009 12:50 AM
المترجم العملاق للنصوص والكتب بجميع اللغات bestbest1 تحميل برامج و شروحات الكمبيوتر 0 August 4, 2009 07:13 AM
برنامج المترجم الفوري hostil_31 تعليم اللغات الاجنبية 55 July 24, 2009 01:56 AM
(علوم الاسلام الدفينة) الفلم الالماني المترجم T-N-T :::RoMaNs المواضيع العامه 4 July 1, 2009 09:30 AM

أدوات الموضوع
انواع عرض الموضوع


معلومات عن الحيوانات كلمات عن الحياة تحميل برنامج محول الصوتيات كيفية الوضوء علاج الاكتئاب تحميل برنامج الفوتوشوب قصص مضحكه كلام عن الحب مجلة لها فوائد العسل ملابس محجبات ديكورات حوائط تحميل كتب مجانية تحميل افلام ابل اندرويد بلاك بيري كتب طبخ حواء صور منتديات السوق الالكتروني مكياج اسماء بنات جديدة وكالة ناسا


الساعة الآن 03:52 AM


Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0 PL2
المقالات والمواد المنشورة في مجلة الإبتسامة لاتُعبر بالضرورة عن رأي إدارة المجلة ويتحمل صاحب المشاركه كامل المسؤوليه عن اي مخالفه او انتهاك لحقوق الغير , حقوق النسخ مسموحة لـ محبي نشر العلم و المعرفة - بشرط ذكر المصدر