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

كيف تبني لغة برمجة(المرحلة الأولى) مقدمة في علم المترجمات

اذهب الى الأسفل

كيف تبني لغة برمجة(المرحلة الأولى) مقدمة في علم المترجمات  Empty كيف تبني لغة برمجة(المرحلة الأولى) مقدمة في علم المترجمات

مُساهمة  mijbar الخميس مايو 26, 2011 5:48 pm

بسم الله الرحمن الرحيم...
اليوم ان شاء الله سأحاول أن أبدأ معكم المرحلة الأولى في علوم اللغات و
المترجمات و ندعو الله أن يوفقنا حتى نصل الى مرحلة معقولة من الدروس ان
شاء الله

المرحلة الأولى



ماهي لغات الحاسب؟؟


لغة الحاسب الأساسية هي الMachine Code أو لغة الإلة و هي اللغة التي لا يفهم الحاسب غيرها (معلومة قديمة و لكنها البداية الصحيحة)
و لأنها ليست لغة بسيطة و لا يمكن بناء نُظُم أو تطبيقات بها لعدة أسباب
منها أنها تعتمد على نوع المعالج و الhardware المصاحب له .. أيضاً غير
مناسبة لعقلية المطورين بل تناسب أكثر علماء الHardware و المشتغلين به..
لهذا دعت الحاجة الى ظهور لغات أخرى أسهل و أكثر تخصصاً
مثل ال Assembly و B و C و ++C و COBOL و Fortran و ...... الخ

و لكن في النهاية جميع اللغات السابقة يجب أن تتحول في نهاية المطاف الى Machine Code و هذا ما تقوم به المترجمات


المترجمات أيضاً لها أنواع
1- الAssembler

الأسمبلر هو اسم الmodule الذي يقبل مدخل(input) من لغة الAssembly و يُنتج
(output) مُخرج من لغة الإلة Machine Code و في العادة يكون تصميم
الأسمبلر بسيط فهو مجرد Line by Line Translation أي مترجم سطري و هذا
لطبيعة الAssembly البسيطة فهو يقوم بعمل Recognition للأوامر (mnemonics) و
تحويلها الى الmachine code المناظر لها متبوعاً بالقيم التي تليه
بالطبع الAssemblers الأحدث أكثر تعقيداً و لكن مازالت الفكرة الأساسية واحدة...

2- الCompiler


الCompiler هو اسم الmodule الذي يقبل input من لغة High Level مثل الC و يعطي output من الObject Code المناظر له..
مقارنةً بما يفعله الAssembler فالCompiler أكثر تعقيداً فهو يقوم بعمل
Analysis للInput و يحاول التعرف على المكونات الأساسية للكود(Tokens) ثم
يحاول مقارنة مجموعات ال Tokens المتتالية بالGrammar Rules التي يعرفها
حتى يصل الى المناسب و من ثم يفهم المقصود و يترجمه و هذا أصعب كثيراً بما
يقوم به الassembler و يزداد صعوبة مع سهولة اللغة و رقيها..
و من الCompiled Languages مثلاً ال ++C/C و ال COBOLو الSNOBOL و الPascal

3-الInterpreter


الinterpreter هو اسم الmodule الذي يقوم بعملية الترجمة للسطر ثم ينتظر
تنفيذه ثم ينتقل للسطر الأخر و هكذا و هو يشبه الى حد ما الCompiler و لكنه
في أغلب الأحيان لا يمكن ان تُنتج منه Executable File أي أنه يجب أن يقوم
الinterpreter بعمل الترجمة كل مرة لتشغيل البرنامج كما أن مهمته تزداد
تعقيداً في وجود الLoops و الConditions و لأنه يجب عليه أن يترجم الloop
كلها ثم يحتفظ بالكود الخاص بها في الذاكرة حتى يكررها ثم ينتقل بعد هذا
الى مابعدها...
مقارنةً بينها و بين الCompilers فالInterpreters أبطأ كما أنها تحتاج الى
ذاكرة أكبر لعملية الInterpretation أو الترجمة و لكن توجد مميزات أنك
تستطيع اكتشاف الأخطاء و تعديلها أثناء عمل البرنامج دون الحاجة الى اغلاقه
و تعديله و بناؤه من جديد ثم اعادة تشغيله
و من اللغات الInterpreted الHTML و الVisual Basic و الJava Script و الPHP و الASP والpython و الPerl

الشكل العام للCompiler

او مايسمى Compiler Anatomy تشريح الCompiler
كيف تبني لغة برمجة(المرحلة الأولى) مقدمة في علم المترجمات  Compiler01
يتكون الCompiler من 4 أقسام أساسية
1- الLexical Analyzer
2- الSyntax & Semantic Analyzer
3- الCode Generator
4- الCode Optimzer
و يستخدم كلهم مايُسمى بالSymbol Table و سأحاول أن أصل الى هذه النقطة ان شاء الله
و سنتعرض لكل نقطة بالتفصيل قدر المستطاع

1- الLexical Analyzer

أو ما يُسمى أحياناً الSCANNER
الSCANNER كما هو واضح من الاسم يقوم بعمل scan أو مسح للSource Code و يقوم بعدة مهام أساسية
1- تجميع الجمل التي تتكون من عدة سطور في سطر واحد
2- ازالة كل ما ليس له علاقة بالبرنامج مثل الcomments و المسافات الزائدة
3- التعرف على المكونات الأساسية للغة Basic Entities مثل
- الثوابت Constants
- المُعرفات Identifiers مثل الVariables و الKeywords
- الOperators أو العوامل مثل ال+ و / و * أو < و > و هكذا
4- عمل التغييرات اللازمة في الSymbol Table عن المكونات التي تم التعرف عليها ليتم استخدامها في باقي المراحل

أما الOutput الصادر عن الScanner يكون في شكل Tokens كما ذكرنا من قبل و
كل Token يحتوي على نوع المُعرف و أحياناً عنوانه في الSymbol Table



مثال على الLexical Analyzer


تخيل أن الInput Code هو




plain text



IF A >= B + C THEN A = B
فسيصبح الoutput من الLexical Anaylizer مثلاً




plain text



14 99.8 61 99.9 51 99.12 15 99.8 57 99.9
بفرض أن
14 ====> هو الToken الخاص بكلمة IF
99.8 ===> هو الToken الخاص بالمتغير A حيث 99 تعني أنه متغير و 8 هي عنوانه في الSymbol Table
61 ===> هو الToken الخاص بالمعامل الثنائي >= و هكذا
و أيضاً يجب أن تعرف أن الLexical Analyzer
ليس له أي علاقة بالGrammar الخاص باللغة كل ما يقوم به هو التعرف على
الكلمات الأساسية و الRegular Expressions الدالة على المعرفات الأساسية
مثلاً
ال Regular Expression التالي [a-zA-Z][a-zA-Z0-9]* هو أسماء المتغيرات
و هو يعني أن يبدأ المتغير بحرف واحد على الأقل متبوعاً بأي عدد من الحروف و
الأرقام.. فعندما يجد الLexical Anaylzer هذا الPattern في الInput Code
فإنه يضيف Record جديد في الSymbol Table باسم الvariable و يصنع Token له.


2- الSyntax & Semantic Analyzer


الSynatx & Semantic Analyzer أو مايُعرف بالParser هو مايقوم بتطبيق
الSentactic Rules أو قواعد اللغة على الinput Code لفهم الغرض من
البرنامج..
مثال




plain text



IF A >= B + C THEN A = B
سيتم التعرف على الجملة السابقة على أنها جملة شرطية Conditional Statement حيث
B + C هو Expression يجب حسابه
A >= B + C هو شرط Condition
A = B هي جملة يجب تنفيذها في حالة أن الشرط صحيح

و يستطيع الParser أن يُنتج لغة وسيطة أو ماتُسمى علمياً الQuadruples أو الرُباعيات و تكون بالشكل التالي





plain text



Operation Operand1 Operand2 Result
و في الCode السابق سيكون الناتج




plain text



ADD C B T1
GTE T1 A T2
BNZ T2 L1
STO B A
LBL L1

في السطر الأول يجمع المتغيرين B و C و يضع الناتج في المتغير الإحتياطي T1
في السطر الثاني يقارن باستخدام Greater Than or Equal GTE أو أكبر من أو يساوي و يضع نتيجة المقارنة في متغير احتياطي T2
في السطر الثالث يستخدم Branch ifNot Zero BNZ للقفز الى نهاية الجملة في
حالة عدم حدوث الشرط (بفرض أن القيمة في T2 تكون صفراً اذا كان الشرط
صحيحاً)
في السطر الرابع يقوم بعمل Store STO أو حفظ لقيمة B في A

3- الCode Generator


الCode Generator هو الmodule الذي يأخذ الQuaruples كInput ليقوم بتحويلها
الى الMachine Code المناظر و هي تبدو للوهلة الأولى مهمة سهلة و لكنها
أيضاً مهمة معقدة حيث أن على الCode Generator التعامل مع عدد محدود من
الRegisters و التعامل معها بحرص حتى ينتج برنامج سريع و قوي كما أن هذا
يختلف من Hardware الى الآخر

4- الCode Optimizer


هي عملية ترتيب و تنظيم الكود الناتج من Code Generator و ازالة التكرار فيه و أيضاً الحصول على كود أسرع More Efficient...

انتهت بحمد الله المرحلة الأولى ...


في انتظار اسئلتكم و استفساراتكم حتى موعد المرحلة الثانية ان شاء الله و
سنتحدث فيها عن تعريف اللغات و تقسيماتها و كيفية كتابة الProduction Rules

المصادر
Computer Languages & Compilers, Prof. Dr. Ali Fahmy, Cairo, 1997
تقديم م/ محمد حســـام
الشفرة متاحة للعلم.

طريقة عمل ترجمة الجمل الرياضية: تجد هذه في الطريقة readOperation في الفئة SmartExpressionReader.
1- تقرأ الحزمة المدخل على شكل جملة String. ولتكن الجملة التالية:

إقتباسالوقود = إذا( مطلق (مسافة السفر - 1000 ) > 100 ، مسافة السفر * 2 ، 4000)
معناها: إلى كانت القيمة المطلقة ل(مسافة السفر -1000) أكبر من 100
إذن: قيمة الوقود = مسافة السفر *2
وإلا: الوقود = 4000




2-ندخل مرحلة التحليل أو Lexical Analyzer:
أولا getSubStringPositions: تأخذ هذه الطريقة الجملة الرياضية وتعطينا
مواقع المتغيرات، والدوال، والإشارات والأقواس وأي شيء آخر. فيصبح لدينا
مصفوفة تحمل مواقع الدوال، والمتغيرات، والأرقام، والإشارات وغيرها في
الجملة مثلا: {0،3،6،8،...}

ثانيا readSubStrings: نقرأ الناتج من العملية السابقة ليصبح لدينا مصفوفة بجميع الفواصل Tokens التي داخل الجملة. مثلا هكذا:
{إذا ، ( ، مطلق ، ( ، مسافة السفر ، - ، 1000 ، ) ، > ، 100، ، ، مسافة السفر ، .......}

ثالثا: readSubLists: وهذا يقرأ الناتج من الجملة السابقة ويقسم مجموعة
الكلمات إلى مجموعات داخل مجموعات، (يأخذ الأقواس ويجمع ما في دخلها في
مجموعة واحدة ويرفقها للمجموعة التي تحتويها!

رابعا: convertStringToOperations: نحول مجموعة الكلمات الناتجة من العملية
السابقة إلى عمليات يفهمها البرنامج. (Operation) هذه العمليات تستطيع
التعامل مع بعضها وأخذ النتائج منها في ما بعد. مثلا:
إذا: تصبح الدالة المعروفة إذا أو if!
مسافة السفر: تصبح متغير اسمه مسافة السفر.
مطلق: تصبح دالة معروفة ترجع القيمة المطلقة. Abs
(-) : إشارة سالب..
وهكذا.
وفي هذه المرحلة أيضا يتم بناء جدول الدوال والمتغيرات المستخدمة في الجملة. (SymbolTable) الجدول اسمه في البرنامج Operator Source!

3- مرحلة تحليل الجمل أو Semantic Analizer: وقد وصلت إلى ما أسميه الإصدار 5
الطريقة integrateOperations: في هذه المرحلة يتم تركيب وفهم الجمل مع بعضها. وعلى الترتيت تنقسم إلى:
أ- integrateFunctions: وهذه تقرأ الدوال وتحاول فهمها.
ب- integrateMarkOperator: وهذه تقرأ الإشارات الخاصة مثل (!) التي وظيفتها عكس جدول الصدق!
ج-integrateSigns: وهذه تقرأ الإشارات المضافة إلى رقم أو متغير أو دالة وتغير في إشارتها، وهي بالخصوص ( +، -)
د- integrateOperands: وهذه تقرأ باقي الإشارات، (*،^،&،<،=،+،- ....) مراعية بذلك أولويتها.

ناتج المرحلة 3 هو الحصول على Operation جاهز للتنفيذ!! فهو يعتبر الملف
المترجم أو Compiled! (بالمناسبة تستطيع حفظه كملف تنفيذي!!)


4- مرحلة التنفيذ
إذا أردت تنفيذ هذا (الملف) التنفيذي فعندك الأمر:




plain text

operation.result();
وستحصل على النتائج. طبعا ناتج العملية السابقة = 2000.. لاحظ أن قيمة المتغير (مسافة السفر) تساوي صفرا، مالم تغير قيمتها!
هنا في هذه المرحلة سيتم حساب الجملة الرياضية وإعطائنا النتائج!

طبعا لا يوجد والله أعلم منتج للشفرة Code Generator لكن ربما هي مدمجة في
منطق البرنامج، ولا أدري. ولو أردت الاجتهاد لقلت أنها موجودة في كلا
المرحلتين الثانية والثالثة!

أما عن الحلول المثلى Code Optimizer،، فلم أصنع هذا، لكنها مندرجة تحت المخططات الغير منفذة حاليا. ولشرح الخطة:
الشفرة التالية:
(5 +3 *8+س ) هذه الشفرة، إذا استبعدنا السلام عليكم ورحمة الله وبركاته لا
تحتوي على متغيرات! ولهذا نستطيع استبدالها (وقت الترجمة) بالعدد 29 تصبح
المعادلة( 29+ س)! بدلا من حسابها وقت التنفيذ!! وهذا سيسرع من عمل
البرنامج! والحصول على النتائج!

ملاحظات على الحزمة:
لاحظ أنك تستطيع كتابة:

إقتباسإذا( إذا > مطلق ، مطلق (-40) ، إذا +80 )


كما أشار المهندس محمد على بعض إمكانية بعض اللغات لمعرفة وقراءة هذه الجمل!!
لاحظ أن الحزمة تتعرف على المتغيرات الجديدة،والدوال الجديدة أيضا!
لاحظ أن الدوال تستعمل متغيرات وهي مختلفة عن المتغيرات التي تستخدمها
مباشرة، لكل دالة مجالها في التسمية! FunctionContext! أو Block Context!
لاحظ أن الحزمة تدعم التكرار For Loop مبسطة على شكل الدالة Sigma الجديدة المتوفرة في الإصدار 2.5!




plain text

Sigma(-2, 4 , Abs())
وهذه الدالة ستعطي ناتج مجموع القيم المطلقة من -2 إلى 4 يصبح الناتج 13!




mijbar
المدير العام للموقع
المدير العام للموقع

عدد المساهمات : 426
نقاط : 1092
السٌّمعَة : 14
تاريخ التسجيل : 18/03/2009

https://lmaryam.yoo7.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى