الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدرس الأول في هندسة المترجمات / Ala2 Vb

بدأه Delphawi في 12 يناير 2008 · 19 رد · 9,157 مشاهدة · في قسم التقنيات الجديدة (لإفتتاح أقسام خاصة بها لاحقا)
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم إخواني ...

الفصل الأول في هندسة المترجمات :

مقدمة

القسم الأول

إندكس :

1/ ما هو المترجم ؟

2/ ما وظيفة المترجمات ؟ وما هي لغات البرمجة ؟

3/ ما هي أنواع المترجمات ؟

4/ قواعد بناء المترجمات (هما اتنين بس)

5/ تقسيم المترجم

*-----------------------------------------------------------------------------------------*

*-----------------------------------------------------------------*

*--------------------------------------------------*

*-----------*

*----*

*

1/ ما هو المترجم ؟

المترجم أو Compiler كلمة نستخدمها كل يوم في حياتنا البرمجية , لكن القليل من يعرف معناها الصحيح ,

إن سألت مبرمج ما هو المترجم ؟ هيقول : "برنامج يحول من لغة برمجة إلى لغة الآلة" , أو ممكن :"برنامج يحول من الإنجليزي للعربي" !!!

لذا يمكن تعريف المترجم على أنه :"برنامج يأخذ كمدخل له شيفرة مصدرية , أو وصف لبرنامج تنفيذي , وينتج كمخرجات وصف برنامج تنفيذي مكافئ له , وإذا وجد أي خطأ فإنه يعطي مجموعة ملائمة من الأخطاء"

ويعود تاريخ المترجمات إلى عام 1955 م

مثل إيه المترجم ؟

Microsoft Visual Basic , Borland Delphi , Visual C++ ... الخ

لاحظ أنها مترجمات لغات برمجة , لأنه توجد أنواع أخرى سأشرحها لاحقا إن شاء الله

إن المترجم برنامج كبيييييير و معقد , يحتوي على آلاف إن لم يكن ملايين من الشيفرة وتمتلك أجزاؤه عملاً مشتركا حيث يكون لقرار ما تأثير متشعب متعلق بالأجزاء الأخرى , وبناء مترجم هو تمرين أساسي في بناء المترجمات .

طيب , هيا بنا نقسم ما سبق:

"إن المترجم برنامج كبيييييير و معقد , يحتوي على آلاف إن لم يكن ملايين من الشيفرة"

لأن المترجم يحتوي على تطبيقات لحجز السجلات , جدولة القوائم , حذف الشيفرة الميتة , البرمجة الديناميكية , الأوتومات المنتهي , المسح والتحليل , تحليل تدفق البيانات والعديد من العمليات الأخرى التي يتعامل معها المترجم .

ملحوظة مهمة : لا تأخذ التعريف السابق على محمل الإحباط ,

" وتمتلك أجزاؤه عملاً مشتركا"

المقصد العام هو الترجمة إلى لغة الآلة طبعا

" حيث يكون لقرار ما تأثير متشعب متعلق بالأجزاء الأخرى"

آآآآه , ما معني هذا , سأعطيك مثال :

نحن نعمل برنامج يتلقى مدخلات المستخدم من خلال مربع نص (Text1) مثلا , هل يمكن لأمر أن يؤثر على أمر آخر , أكيد

مثلا لو كان الكود الطبيعي لاستقبال المدخلات :

If Text1.Text = "Ala2 VB" Then

	 Msgbox "VB Programmer"

	   End if

عند إضافة الجملة التالية :

Private Sub TimerX_Timer()

	 If Text1.Text = "Ala2 VB" Then

	 Msgbox "From Arab Team"

	 End if

بدون الكود الثاني , عند كتابة Ala2 VB في مربع النص تظهر رسالة , بعد إضافة الكود التاني تظهر رسالتين عند كتابة نفس الكلمة .

ده كان مثال بسيط , لكنه مش دقيق 100%

2/ ما وظيفة المترجمات ؟ وما هي لغات البرمجة ؟

الوظيفة الأساسية للمترجم : تحويل البرنامج الدخل , إلى خرج , وليس شرطا على لغات البرمجة

ما هي لغة البرمجة ؟

"لغة صورية , لها خصائص رياضية ومعانٍ معرفة بشكل جيد , وذلك بخلاف اللغة الطبيعية , ذات الخصائص المتغيرة والغامضة , ويتم تصميم لغات البرمجة لتحقق التعبير والإيجاز والوضوح , ولتحديد الحسابات –أي تسجيل تسلسل من الأعمال التي تحقق عملية حسابية ما أو تعطي نتيجة حسابية معينة"

ويمكن ببساطة شديييييييدة تصوير المترجم كـ :

1ss1_yB8RF2OmxR.JPG

3/ ما هي أنواع المترجمات

المترجمات تنقسم إلى عدة أقسام , بإيجاز :

مترجم : مصدر إلى ملف تنفيذي (Visual Basic)

فائدته معروفة

مترجم : مصدر إلى مصدر

يحول مثلا من كود A إلى B بعد القيام بعمليات تحسين على A ليتم تحويله إلى ملف تنفيذي لاحقا

4/ قواعد بناء المترجمات

الاولى :

"يجب أن يحافظ المترجم على معنى البرنامج الذي تتم ترجمته"

فلا يغير فيه شيء على مزاجه , وهذا من أسباب نجاحه إن شاء الله

الثانية :

"يجب أن يقو المترجم بتحسين برنامج الدخل بطريقة ذكية"

ولكن ألم نقل أننا لا يجب أن نعدل ؟

نعم , ولكن القاعدة الأولى تعني تغيير بطريقة تغير المعنى

مثلا المستخدم كتب :

Print "A" + "B" + "C"

نحولها إلى :

Print "ABC"

ولا نحولها إلى

Print "CB" + "A"

مثلا

5/ تقسيم المترجم :

ينقسم إلى :

نهاية أمامية ونهاية خلفية

النهاية الأمامية :

تركز على فهم برنامج المصدر (تحليل الشيفرة واستخراج الأخطاء ومعرفة هل الكلمات متطابقة أم لا)

النهاية الخلفية :

تركز على تحويل البرنامج إلى الهدف

من فوائد هذا الفصل بين أقسام المترجم إلى تسريع أدائه وكلما قسمت النهايات إلى أجزاء أصغر , مثلا تقسيم النهاية الأمامية إلى الأقسام التالية :

قسم للتحقق هل الكلمات المستخدمة موجودة في اللغة (مثل If , Else , Len)

قسم للتحقق هل توجد أخطاء نحوية (السلاسل النصية ليست بين علامات تنصيص , أو بارامترات الدوال ليست بين أقواس...)

قسم للتحسين وينقسم إلى :

تحسين الدوال

تحسين الأكواد

...الخ من أفكارك النيرة

يصبح المترجم بعد ذلك شبيها بالصورة التالية :

1ss1_ZMzqnmecy.JPG

ملحوظة هامة : لا تخف ولا تهلع من المصطلحات أعلاه , سندرسها إن شاء الله تعالى لاحقا

هذا و جزاكم الله خيرا , وأي استفسار أو سؤال أنا جاهز

تم تعديل هذه المشاركة بواسطة Ala2 VB في 7 فبراير 2008 في 08:38

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#2

ربنا يوفقك و لكن الشرح صعب شوية .....

ارجو منك توضيح النص و كتابته بالعناوين و الالوان للتوضيح

اتمنى ان اكون افدتك

الموضوع اكثر من رائع و باذن الله تكمله على خير

#3
اقتباس
ارجو منك توضيح النص و كتابته بالعناوين و الالوان للتوضيح

شكرا أخي , لكن زر التحرير مش راضي يظهر تحت الموضوع

تم تعديل هذه المشاركة بواسطة Ala2 VB في 15 يناير 2008 في 09:30

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#4

وضح ما تريد تحريره يا علاء و سأقوم بذلك.

It's hard to stay in such ridiculous situation

#5
اقتباس
المترجم أو Compiler
يقال ايضا: مصنف Compiler
d4baa0.gif
#6

الأخ علاء , تم تحويلك لمجموعة أعضاء بصلاحيات إضافية لتستطيع أن تتحكم في تحرير المشاركات كما تريد ..

وفقكم الله ....

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7

لدي ملحوظة علي شرحك اخي الكريم

1- يوجد تقسيمات اخري للمترجم مثل Analysis and synthesis

2- لا يمكن شرح ال Compiler بالغة العربية لوجود مصطلحات لا يمكن ترجمتها.

3- Front End and Back End

frontbackhy0.gif

اخيرا الف شكر لك اخي

تم تعديل هذه المشاركة بواسطة Ahmed18 في 25 يناير 2008 في 03:45

#8

شكرا لك موضوع قيم وكبير ولك كل التقدير

استمر , الى هنا كلامك واضح في انتظار الدروس القادمة ان شاء الله

بالتوفيق..

tvquran_6.gif

#9

درس جميل وبسيط وفي انتظار المزيد

:)

اللهم طهر أرض فلسطين من العملاء والخونة

#10

السلام عليكم

الاخ علاء جزاك الله خيراً على الموضوع و لكن لربما احببت ان تلقى نظرة على هذا الموضوع ايضاً

الدرس الاول فى بناء لغة برمجة

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#11
اقتباس
وضح ما تريد تحريره يا علاء و سأقوم بذلك.

خدمة أشكرك عليها أخي الكريم

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

جعلها الله في ميزان حسناتكم (الإدارة)

ألف شكر إخواني على الردود المشجعة جدا

بالنسبة لحضرتك أخي أحمد , فانا لسه في البداية , دي عبارة عن مقدمة مبسطة جدا

ما أدرسه صعب جدا وأكبر من ده لأن الكاتب يخاطب شخصا شبه خبير

أنا أحاول أبسطه , أدعولي وجزاكم الله كل خير

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#13

بسم الله الرحمن الرحيم

الدرس الثاني في بناء المترجمات

Index : :

1/ نظرة عالية المستوى على الترجمة

2/ إنشاء ومتابعة بيئة زمن التنفيذ

3/ تحسين الشيفرة

1/ نظرة عالية المستوى على الترجمة :

للحصول على فهم أفضل للمهام التي تظهر أثناء عملية الترجمة , سنقوم باعتبار ما الذي يجب فعله لتوليد شيفرة تنفيذية للبرنامج التالي :

z * x * y * 2 * w = W

أ‌) فهم الدخل :

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

ب‌) اختبار الصيغة القواعدية :

على المترجم أن يقوم بمقارنة بنية البرنامج مع تعريف اللغة وذلك من أجل اختبار الصيغة القواعدية لبرنامج الدخل .

يمكن رياضيا أن نعتبر أن اللغة المصدر هي :

مجموعة غير منتهية من السلاسل الحرفية معرفة بمجموعة منتهية من القواعد .

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

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

مثال :

لكي نفهم فيما إذا كانت الجملة "Compilers are engineered objects." هي جملة صحيحة في اللغة الإنجليزية , سنقوم أولاً بالتأكد أن كل كلمة من الجملة موجودة في اللغة الإنكليزية بعلمية بحث معجمي , ثم نقوم باستبدال كل كلمة بالصنف التركيبي لإنشاء تمثيل أكثر تجريدا لتلك الجملة , حسب القاعدة التالية :

Noun verb adjective noun endmark

وسنحاول إن شاء الله أن نطبق هذه السلسلة من الكلمات المجردة مع قواعد الجمل للغة الإنجليزية

1 Sentence = Subject verb Object endmark

2 Subject = noun

3 Subject = Modifier noun

4 Object = noun

5 Object = Modifier noun

6 Modifier = adjective

…

من خلال التدقيق , وباستخدام القواعد أعلاه , تصبح الجملة السابقة كالتالي :

__ Sentence

1 Subject verb Object endmark

2 noun verb Object endmark

3 noun verb Modifier noun endmark

4 noun verb adjective noun endmark

تدعى عملية اكتشاف الكلمات ضمن سلسلة حرفية وتصنيفها وفقا لأجزاء من الكلام بالمسح (Scanning) أما عملية اكتشاف فيما إذا كانت مجموعة من الكلمات المتتابعة تملك اشتقاقاً في مجموعة ما من القواعد فتدعى تحليلا (Parsing) . حيث يمثل المسح والتحليل أول خطوتين في ترجمة برنامج.

يمكن أن يكتشف الماسح والمحلل أن الدخل ليس جملة صالحة , لذا يجب أن يقوم المترجم بإعلام المستخدم عن الخطأ من خلال مجموعة ملائمة وواضحة من رسائل الخطأ (والتي طبعا تحوي زر إظهار التعليمات ) مما يسمح للمستخدم بتحديد الخطأ بسرعة , وإصلاحه بكفاءة

ج) اختبار المعنى :

تعتمد صحة الصيغة القواعدية بشكل خالص على أجزاء الكلام ومطابقة كل كلمة مع الجزء الذب تتبع له من الكلام , لكنها تتجاهل أي معنى للكلمات حيث لا تميز المبادئ القواعدية بين أي اسمين مثل "Compilers" و"rule" .لذلك لا تميز الجملة "Compilers are engineered objects" و "Rocks are engineered objects" (لا تتميزان قواعديا –أي أنهما متشابهان في القاعدة , راجع التحليل في النقطة ب-) مع أنهما يحملان معنيين مختلفين.

للتفريق بين الجملتين علينا معرفة كل من الأنظمة البرمجية والكائنات الجيولوجية

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

على فكرة , يمكن أن يكون التعبير z * x * y * 2 * w = W (لسه فاكرينه ؟) على عدة نواحي غلط , هي :

1/ يمكن ان يكون أحد المتغيرات غير مصرحا عنه , بدلا من

Dim x , y , z as integer
	   W = z * x * y * 2 * w

يصبح :

'مفيش Dim
	   W = z * x * y * 2 * w

2/ يمكن أن يكون (z As String) أو (x As Boolean) !!!

المترجم بسلامته لازم يكشف مثل هذه أخطاء تافهة بواسطة التحليل الدلالي (Symantic analysis) , أو التحليل الحساس للسياق (Context sensitive analysis) ويركز الأخ الأخير ده على أن معنى بعض أجزاء الدخل يمكن أن يعتمد على السياق الذي يسبقها أو يتبعها أو كليهما , مثلاً :

"ArabTeam"

هو إيه العرب تيم ده ؟

"ArabTeam is a Forum"

آآآآآآآآه , فهمت

يمكن أن تحتوي النهاية الأمامية للمترجم على مرور خاص يقوم بعملية التحليل الدلالي , أو يمكن أن تدمج هذه العملية ضمن وظائف المحلل (Parser) .

2/ إنشاء ومتابعة بيئة زمن التنفيذ :

كما يعرف الكثيرون , يتم تنظيم الذاكرة في الحواسب الحديثة بعناوين رقمية وليس أسماء نصية , حيث تشير تلك العناوين إلى مواقع تحزين ضمن فضاء العناوين لبرنامج يتم تنفيذه .

فاكر المثال بتاع z * x * y * 2 * w = W ؟

يمكن للمترجم حفظ القيم في الذاكرة بربط كل اسم مع عنوان , مثلاً (w,0) , (x,4) , (y,8) , (z,12) -لاحظا إن احنا بنزود 4 كل مرة-

3/ تحسين الشيفرة :

من أهم النقاط التي سندرسها إن شاء الله وهي التحسين , كثير من المترجمات لا تحتوي على مثل هذه نقطة , إليك مثال بسيط عنها :

قبل التحســــــــــــــــــــــين :

If x = "a" then
	   Call A()
	   Else if x = "b" then
	   Call B()
	   Else if x = "c" then
	  Call C()
	   Else if x = "b" then
	   Call d()
	 ...
	   End if

بعد التحســــــــــــــــــــــــــــين :

Select case x
	  Case "a" : call A()
	   Case "b" : call B()
	   Case "c" : call C()
	  Case "d" : call D()
	 ...
	 

	   End select

ويا حلاوته بقى لو أضاف تعليقات توضح هو حسَن إزاي بحيث يبقى :

'Remove IF , Because it is Booooring
	   Select case x
	   Case "a" : call A()
	   Case "b" : call B()
	   Case "c" : call C()
	   Case "d" : call D()
	   End select

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

x = …
	  y = …
	   w = 1
	 For i = 1 to n
	  Read z
	   W  = w * 2 * x * y * z
	   End

'--------------------------------------------------------------------'

x = …
	  y = …
	   w =  1
	   T = 2 * x * y
	   For i = 1 to n
	   Read z
	   W =  w * z * t
	   End

يتألف التحسين بشكل عام من عمليتين متميزتين . تحليل الشيفرة لفهم سلوك زمن التنفيذ , وتحويل الشيفرة للتركيز على المعرفة المشتقة أثناء التحليل

أ‌) التحليل :

تستخدم المترجمات عدة أنواع من التحليل للقيام بتحويلات ويعتمد تحليل تدفق البيانات أثناء زمن الترجمة على التفكير في تدفق القيم في زمن التنفيذ , حيث تقوم محللات تدفق البيانات عادة بحل نظام من مجموعة معادلات مترافقة مشتقة من بنية الشيفرة التي تتم ترجمتها .

ب‌) التحويل :

تسعى العديد من التحويلات التي تم ابتكارها إلى : تحسين الزمن , أو المساحة اللازمة , أو الشيفرة التنفيذية , حيث يقوم بعضها بتحسين زمن تنفيذ البرنامج مثل تلك التي تكتشف الحسابات التي لا تتغير داخل حلقة ما وتنقلها إلى مواقع تنفيذ أقل تكراراً , بينما يقوم البعض الآخر يجعل الشيفرة أقل حجماً .

تختلف التحويلات في تأثيرها والمدى التي تعمل عليه , والتحليلات التي تحتاجها , حيث يتم عادة وضع التحويل والتحليل الذي يحتاجه سوية لتحديد أين يمكن تطبيقه بشكل آمن ومفيد ونشير إلى هذه الحكاية والترافق باسم : "التحسين"

إلى هنا انتهى الدرس إخواني الكرام , أرجو إنه يكون واضح , وينال إعجابكم وتتمكنوا من استيعابه

وانا اعتقد إنه أسهل من سابقه

وإن شاء الله يزيد سهولة درسا بعد درس

أستودعكم الله تعالى الذي لا تضيع ودائعه , على أمل أن ألقاكم في دروس قادمة إن شاء الله , ولكن ليس هنا

بل في منتدى المترجمات بإذن الله تعالى

(متنسوش زر الشكر , هههههههه)

تم تعديل هذه المشاركة بواسطة Ala2 VB في 7 فبراير 2008 في 08:27

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#15

كده فعلا احسن بكتير يا علاء

انا فى اول درس لما شوفت كلمة (نهاية امامية و نهاية خلفية) جاتلى الحالة :mellow: :nose_pick: :wacko: :blink:

ملاحظة : كل ما سبق يعبر عن حالتى اثناء و بعد قراءة الدرس

لكن الحمد لله بعد الدرس ده بقيت احسن بكتيـــــــر (ادعيلى :))

#16
اقتباس
ادعيلى

بالتوفيق لك وللجميع أخي الكريم

اقتباس
كده فعلا احسن بكتير يا علاء

هههههههههههه , وإن شاء الله تتحسن حالتك أكتر , درسا بعد درس :lol:

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#17

بسم الله الرحمن الرحيم

السلام عليكم إخواني مع درس جديد من دروس بناء وهندسة المترجمات

الجزء الثالث والأخير من الدرس الأول

فهرس :

1/ إنشاء برنامج الخرج

2/ خصائص مرغوبة في المترجم

3/ الخلاصة

4/ الخاتمة

1/ إنشاء برنامج الخرج :

وهي المرحلة الأخيرة من الترجمة وهي توليد الشيفرة النهائية , يقوم البرنامج أثناء توليد الشيفرة بعبور نموذج التمثيل الوسيط (IR) للشيفرة وإصدار الشيفرة المكافئة من أجل الجهاز الهدف.

ويقوم المترجم في هذه العملية بالآتي :

أ‌) اختيار التعليمات :-

اختيار التعليمة يعتبر المرحلة الأولى من توليد الشيفرة حيث يقوم مولد الشيفرة باختيار تتابع من تعليمات الجهاز لتحقيق الشيفرة التي تتم ترجمتها

ب‌) تخصيص السجلات :-

دي نقطة صعبة وطويلة , لكنني سأعطي مثالا عليها ببساطة :

تخصيص السجل , هو تقريبا حجز مكان في الذاكرة , كحجز مكان بمساحة S لمتغير X من نوع T

ودي عملية مهمة , لأنها تزيد من سرعة المترجم , وكفاءته من حيث استهلاك موارد الجهاز بالذات إن كان جهاز "كحيان" (جهاز تعبان يعني)

وهذا مثلا لا يعني أنه يجب استعمال سجلات اقل أو أكثر , فأحيانا قد تحتاج سجلات أكثر (لتوفير المرونة) ولكن الثمن سيكون الذاكرة

أو تستخدم متغيرات قليلة , نعم ستستهلك ذاكرة أقل , ولكن حضرتك ستكون مقيدا بشكل أكبر

الذكاء هنا , هو :

بما أن الهدف من حجز السجلات بطريقة جيدة هو التوافق مع إمكانات الجهاز الذي سيعمل عليه البرنامج التنفيذي . لذا لديك حل من اثنان /

1- تخبر المستخدم عن مساحة الذاكرة المطلوبة لتشغيل البرنامج

2- تستخدم طرق ذكية لحجز السجلات حسب طاقة الذاكرة ,

مثلا إن كانت الذاكرة 32 (العصر الحجري) تحجز مثلا 50 سجل من أصل 100

وإن كانت 256 تحجز 80 من أصل 100

ج) جدولة التعليمات :-

قد يحتاج مولد الشيفرة لإعادة ترتيب العمليات للتوافق مع قيود الأداء الخاصة بالجهاز الهدف (من حيث الأداء والسرعة والمساحة...) وذلك لإنتاج شيفرة يتم تنفيذها بسرعة , ويمكن أن يختلف زمن تنفيذ التعليمات المعدلة بشكل كبير . فيمكن أن تأخذ عمليات الوصول إلى الذاكرة عشرات أو مئات من دورات الساعة (لا نقصد هنا الساعات أو الدقائق , بل أجزاء الثانية ,,, هل تعتقد إن فيه متغير نحتاج للوصول إليه إلى 3 ساعات مثلاً !!!) بينما لا تحتاج بعض العمليات الحسابية مثل الضرب سوى بضع دورات من الساعة . وبالتالي يمكن أن يكون تأثير تلك التعليمات البطيئة كبيرا على أداء الشيفرة المترجمة .

تمتلك العديد من المعالجات الحديثة إمكانية بدء عمليات جديدة بينما يتم تنفيذ عملية تحتاج إلى زمن طويل , وطالما أنه لم تظهر الحاجة إلى القيم الناتجة عن العملية ذات الزمن الطويل سيستمر التنفيذ بشكل عااااااااادي , ولكن إذا حاولت إحدى العمليات قراءة نتيجة تلك العملية الطويلة قبل انتهائها فستضطر للتوقف والانتظار حتى انتهاء تنفيذ العملية الطويلة . لا يمكن أن تبدأ العملية قبل أن تكون معاملاتها جاهزة ولن تكون نتيجتها جاهزة حتى ينتهي تنفيذها طبعاً .

د) التأثيرات المتبادلة :-

تظهر العديد من المشاكل الصعبة فعلا الموجودة في عملية الترجمة أثناء توليد الشيفرة والأمر الذي يجعل المسألة أكثر تعقيدا هو التأثير المتبادل لتلك المشاكل .

2/ الخصائص المرغوبة في المترجم :

يمكننا أن نتوجه في الحكم على المترجمات اعتمادا على أدائها في فايف (خمس) نقاط :

أ/ السرعة (Speed) :::

تحتاج بعض التطبيقات أحيانا وقتا أكبر في المعالجة من التطبيقات الأخرى , والمترجم الناصح هو الذي يستطيع إعطاء الأولويات للتطبيقات التي تحتاج الزمن والسرعة الأكثر

ب/ الحجم (Size) :::

وهنا يقصد بالحجم عاملان , حجم المترجم نفسه , وحجم ما يترجمه (من خلال التحسين طبعاً , راجع القسم الثاني من الدرس الأول)

ج/ التغذية العكسية (معرفش معناها بالإنجليزي !) :::

يجب على المترجم عندما يواجه برنامجا خاطئا أن يعرض ذلك للمستخدم

فقد كانت مثلا مترجمات UNIX الأولى تعرض الرسالة التالية الموحدة عند حدوث خطأ :

Msgbox "Syntax Error"

بينما على الطرف الآخر , نجد أنظمة Cornell PL/C و UW-Pascal التي صممت كمترجمات "طلابية" ولذلك فهي تعرض رسائل أكثر وضوحا , مع بذل جهد لإصلاح الخطأ إن أمكن

(متنساش قواعد بناء المترجمات في القسم الأول :

" لا يجب على المترجم تغيير الشيفرة بشكل لا يحسنها أو بشكل يؤدي إلى بطئها")

د/ التنقيح (Debugging) :::

لا تعمل جميع البرامج بشكل 100% عند تنفيذها للمرة الأولى (لسوء الحظ) لذلك يهتم المبرمجون بشكل كبير بإمكانية استخدام منقح على مستوى المصدر مع الشيفرة البرمجية

هـ/ فعالية زمن الترجمة :::

يتم استخدام المترجمات بشكل كبير ويقوم مستخدم المترجم في العديد من الحالات بانتظار النتائج ولذلك يمكن أن تكون سرعة الترجمة أمراً هاماً .

قبل إكمال الدروس أخي الكريم , يجب أن تقوم بكتابة قائمة بالمواصفات التي تريدها في مترجمك (بناء على هدف المترجم طبعا) مرتبة بحسب أولويتها .

بإمكانك تطبيق المعايير التقليدية في هندسة المترجمات , قم بتقييم المزايا كما لو كنت ستدفع قيمتها من فلوسك الخاصة !!!

سوف يدلك اختبار تلك القائمة إلى حد كبير على كيفية اتخاذ القرارات أثناء بناء المترجم الخاص بك .

3/ الخلاصة :

/ النقطة الأولى /

إن بناء مترجم هو عملية معقدة (إحباط مدمر)

لكن لااااااااااااالا

مش مع المعلم علاء

شعارنا : لا للصعوبة , لا للتعقيد , لا للـ........... نسيت :lol:

يجمع المترجم الجيد أفكارا من الآتي :

1- نظرية اللغة الصورية

2- دراسة الخوارزميات

3- الذكاء الصناعي

4- تصميم الأنظمة

5- بنية الحاسبات

6- نظرية لغات البرمجة

يالهوي ! أنا هادرس كل ده ؟!

متخفش هتيجي بالتدريج إن شاء الله

وأنا أريدك أن تركز على النقطة 2 , 3 , 5 لأنها الأهم

/ النقطة الثانية /

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

/ النقطة الثالثة /

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

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

النهاية الأمامية

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

وتركز هذه المرحلة على ترجمة الشيفرة المصدر إلى تمثيل وسيط (IR) أي شيفرة خالية من الأخطاء وغير محسنة بعد

*** المرحلة الثانية ***

المحسن (سأحاول أن أرمز له باسم عمو حسن , حتى يتم استيعابه بشكل طريف يسهل فهمه وتذكره بإذن الله تعالى )

ويقوم بتحويل الشيفرة من تمثيل وسيط (IR) إلى تمثيل وسيط (IR) آخر بهدف إنتاج شيفرة محسنة تستهلك قدرا أقل من الذاكرة , وتعمل بسرعة وكفاءة أكبر

*** المرحلة الثالثة ***

وهي التي سنختم معها , وتسمى النهاية الخلفية

وتقوم بتحويل برنامج التمثيل الوسيط إلى مجموعة من التعليمات لمعالج معين . وتقوم بمقارنة الإجابات للمشكلات الصعبة في التخصيص والجدولة , ويكون لتلك المقاربات أثر مباشر على حجم وسرعة الشيفرة البرمجية .

الخاتمة

يتم اليوم تطبيق تقنية المترجم بإعدادات مختلفة عديدة , حيث يجب على المترجمات أن تستطيع التعامل مع التحديات المختلفة بسبب تواجد التطبيقات في أماكن متعددة . ولم تعد السرعة هي المعيار الوحيد للحكم على الشيفرة المترجمة , حيث يتم الحكم اليوم على الشيفرة من حيث :

1- صغرها

2- مقدار استطاعة المعالجة التي تتطلبها

3- كيفية ضغطها

4- كمية أخطاء صفحات الذاكرة التي تولدها

وجزاكم الله خيرا

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#18
اقتباس
التغذية العكسية (معرفش معناها بالإنجليزي !)

Reverse feedback

-

شكرا اخي علاء انا متابع لدروسك ان شاء الله.

#19
اقتباس
Reverse feedback

Thanks alot you saved my live Man

اقتباس
انا متابع لدروسك ان شاء الله

شكرا لك

وأرجو من الجميع المرور على موضوعي بتاع التطبيق العملي (الرابط في توقيعي)

تم تعديل هذه المشاركة بواسطة Ala2 VB في 10 فبراير 2008 في 08:32

اقتباس
If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut

Albert Einstein

مدخل إلى برمجة وتصميم الألعاب : كيف أبدأ ؟

#20

جزاك الله خيراً أخي على هذا الجهد وجعله في ميزان حسناتك

مواضيع مشابهة