كيف تبني لغة برمجة(المرحلة الأولى)
الخميس أكتوبر 27, 2022 7:18 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
يتكون ال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 هو
[ltr]IF A >= B + C THEN A = B[/ltr]
فسيصبح الoutput من الLexical Anaylizer مثلاً
[ltr]14 99.8 61 99.9 51 99.12 15 99.8 57 99.9[/ltr]
بفرض أن
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 لفهم الغرض من البرنامج..
مثال
[ltr]IF A >= B + C THEN A = B[/ltr]
سيتم التعرف على الجملة السابقة على أنها جملة شرطية Conditional Statement حيث
B + C هو Expression يجب حسابه
A >= B + C هو شرط Condition
A = B هي جملة يجب تنفيذها في حالة أن الشرط صحيح
و يستطيع الParser أن يُنتج لغة وسيطة أو ماتُسمى علمياً الQuadruples أو الرُباعيات و تكون بالشكل التالي
[ltr]Operation Operand1 Operand2 Result[/ltr]
و في الCode السابق سيكون الناتج
[ltr]ADD C B T1
GTE T1 A T2
BNZ T2 L1
STO B A
LBL L1[/ltr]
في السطر الأول يجمع المتغيرين 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
تقديم م/ محمد حســـام
تم تعديل 13 Sep 2005 بواسطه bashmohandes
اليوم ان شاء الله سأحاول أن أبدأ معكم المرحلة الأولى في علوم اللغات و المترجمات و ندعو الله أن يوفقنا حتى نصل الى مرحلة معقولة من الدروس ان شاء الله
المرحلة الأولى
ماهي لغات الحاسب؟؟
لغة الحاسب الأساسية هي ال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
يتكون ال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 هو
[ltr]IF A >= B + C THEN A = B[/ltr]
فسيصبح الoutput من الLexical Anaylizer مثلاً
[ltr]14 99.8 61 99.9 51 99.12 15 99.8 57 99.9[/ltr]
بفرض أن
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 لفهم الغرض من البرنامج..
مثال
[ltr]IF A >= B + C THEN A = B[/ltr]
سيتم التعرف على الجملة السابقة على أنها جملة شرطية Conditional Statement حيث
B + C هو Expression يجب حسابه
A >= B + C هو شرط Condition
A = B هي جملة يجب تنفيذها في حالة أن الشرط صحيح
و يستطيع الParser أن يُنتج لغة وسيطة أو ماتُسمى علمياً الQuadruples أو الرُباعيات و تكون بالشكل التالي
[ltr]Operation Operand1 Operand2 Result[/ltr]
و في الCode السابق سيكون الناتج
[ltr]ADD C B T1
GTE T1 A T2
BNZ T2 L1
STO B A
LBL L1[/ltr]
في السطر الأول يجمع المتغيرين 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
تقديم م/ محمد حســـام
تم تعديل 13 Sep 2005 بواسطه bashmohandes
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى