tantie L

تطور البرامج

13 ردود في هذا الموضوع

السلام عليكم و رحمة الله و بركاته 

هذا اول موضوع لي هنا و ارجو ان يكون مفيد و لو قليلا 

هذا الموضوع يتحدث عن خطوات تنفيذ البرنامج من بداية كتابة الكود الى ان يصير برنامجا قابلا للتنفيذ يعني processus  ^_^

في البداية هذا مخطط توضيحي لتلك المراحل ثم ساحاول ان اوضح المرحلة تلو الاخرى ما استطعت

cu39H.png

لتنفيذ برنامج قمنا بكتابة الكود الخاص به فهذا يتطلب عدة مراحل قبل التنفيذ و هذه المراحل تتم بشكل آلي تماما و الموقع الذي تدور فيه هذه المراحل هو القرص الصلب disque dure و هي تنفذ بالوسائل التالية :

1- محرر النصوص

2- المترجم

3- editeur de lien ( اظن مهناها الرابط او محرر الروابط )

4- chargeur ( معناها اللغوي هو الشاحن لكن الاصطلاحي لا اعرفه  :blush: )

5- débogueur ( مصحح الاخطاء)

و الان ساباشر شرح دور كل وسيلة من الوسائل السابقة  ^_^ :

1- محرر النصوص أو (éditeur de textes ( text editor :

 

ان الهدف من محرر النصوص هو تمكين المبرمج من كتابة الكود الخاص به بلغة متطورة قريبة من لغة البشر اي لغة من مستوى عالي ( haut niveau ) كلغة السي او سي ++  او لغة قريبة من لغة الالة اي لغة من مستوى منخفض ( bas niveau ) كلغة الاسامبلي، و ايضا فان محرر النصوص يمكن المبرمج من التغيير في برنامجه باظافة تعليمات او حذف تعليمات كما يمكنه من طباعته 

 

2- المترجم :

 

هو عبارة عن خادم او برنامج خدمة يملك دور ترجمة او تحويل برنامج مكتوب بلغة متطورة الى برنامج مكتوب بلغة الالة و هو نتيجة الترجمة (programme objet)

و هناك نوعين من المترجم :

 

1-2- مترجم سطر بسطر ( interpréteur ) :

هو برنامج يقوم بالتنفيذ للكود سطر بسطر  و هو يعمل بهذه الطريقة :

- قراءة التعليمة من الكود سورس

- ترجمة التعليمة النقروؤة لنا الى تعليمة مقروؤة للألة و هذه الخطوة عندها حالتين كنتيجة :

--> ترجمة بنجاح : هنا المترجم يقوم بارسال نتيجة الترجمة حتى يتم تنفيذها و ينتقل الى السطر او التعليمة التالية

--> ترجمة فاشلة : المترجم هنا لن يوافق على ارسال التعليمة و يقوم باظهار رسالة بان هناك خطأ في السطر او التعليمة التي توقف عندها فهذا المترجم لا ينتقل الى السطر التالي و التعليمة التالية ان كان هناك خطأ في اي تعليمة

* و هذا النوع من الترجمة يتطلب تكرار الترجمة في كل مرة نقوم فيها بتنفيذ البرنامج

 

2-2- مترجم جامع ( compilateur ) :

و هو ايضا برنامج يقوم بترجمة الكود من لغة متدورة الى لغة الالة و نتيجته نفسها ايضا لكن بهذه الوسائل :

- محلل الصحة اللغوية (analyseur lexical ) :

و هو من يقوم بتحليل الكود من الناحية اللغوية و عمله يكون كالاتي

ايجاد جدول الرموز :

 

 و هو يحوي اسماء المتغيرات المستعملة او الثوابت المرفقة الى رموزها و الكلمات المفتاحية  و الارقام و توابع الدوال و يصنفها حسب نوعها مستعملا رموزا خاصة به يفهمها، مثلاهذا الكود  :

#include <stdio.h>main(){int x;const y=5;// عدد ثابت قيمته 5x=y+2;} 

لنرى بعض الامثلة الصغيرة من هذا الكود كيف ستكون حالتها في جدول الرموز و هي لن تكون كاملة  :

# : symbol -> sym include : كلمة مفتاحية -> mcx  : متغير من نوع اعداد صحيحة : idconst  : كلمة مفتاحية -> mcy    : عدد ثابت قيمته 5 : const+  :  عملية : op2  : رقم صحيح موجب : nbr 

بالاظافة الى انواعها فهناك ايضا مكانها في الذاكرة و احداثيتها في الكود

و المحلل اللغوي للقيام بعمله فانه يقوم بحذف الفراغات و التعليقات  و كمثال لنرة الكود السابق كيف سيكون 

#include<stdio.h>main(){intx;consty=5x=y+2;} 

اذن فالمسافة و التعليق قد اختفوا

و من الاخطاء التي يعالجها المحلل الغوي اسماء المتغيرات الطويلة جدا و الرموز المجهولة عنده 

لنرى ذلك كمثال

##include <stdio.h>

هنا ستكون رسالة الخطأ كالاتي

D:\exp.c|1|error: stray '##' in program|

تحليل من الناحية القاعدية :

 

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

مثلا لناخذ هذه العبارات

x=y+z;x=+z; 

شجرة العبارة الاولى  كالاتي

vUyyh.png

 

و هي تماما صحيحة  ^_^

 

اما الثانية فشجرتها هكذا

 

SSOWE.png

 

و هي بالتاكيد خاطئة  -_-

لنحلل الخطأ معا رغم انه واضح  ;)

اولا = عملية اسناد موجودة في جدول الرموز

ثم x القيمة المسند اليها موجود في جدول الرمز بكامل متطلباته

exp العبارة المسندة يجب ان نرى مما تتكون

op العملية الحسابية + هنا هنا هنا الخطأ فالقاعدة المخزنة عند المترجم هي ان عملية + بها حدين ( حد اول + حد ثاني ) لكن انتظر لحظة الحد الاول مفقود  :excl:  اذن هذا خطأ كسر القاعدة المعتمدة 

; انتهاء التعليمة

هنا المترجم يسجل خطأ كسر قاعدة عملية الجمع 

 و ايضا من الاخطاء التي يعالجها محلل القاعدة لدينا الاتي 

- غياب الاقواس 

x=(a+b*c; 

هنا المترجم يقول لك اين القوس الثاني لقد نسيته 

- خطأ في بنية هيكلة معينة

- و غياب التحديد بالحواضن { }

و غيرها الكثير من الاخطاء التي يعالجها

* هنا يجدر بنا الاشارة الى كيفية التحليل فالمحلل يستخدم شجرة التعليمة و لا يبدؤها من الاعلى الى الاسفل و انما من الاسفل الى الاعلى

 

محلل دلالات الالفاظ (anlyseur sémantique):

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

و من الاخطاء التي يعالجها نذكر 3 :

- استعمال متغير لم يتم تعريفه 

int x;p=x;

رسالة الخطأ هكذا

D:\exp.c|147|error: 'p' undeclared (first use in this function)| 

- تعريف مضاعف لمتغير واحد 

int j,j;

الرسالة هكذا

D:\exp.c|135|error: redeclaration of 'j' with no linkage| 

- عدم التوافق بين الانماط

int x;char y;x=y; 

انشاء التعليمات البرمجية :

هذه اخر مرحلة من عملية الترجمة الكلية و فيها يتم تحويل الكود سورس من لغة برمجية متطورة الى لغة الالة فينتج عن ذلك ما نسميه ب code objet فيتم انشاء ملف جديد كهذا exp.o

و هو الملف الذي سيصبح برنامج متربص بعد 3 مراحل قادمة

 

و هذا مخطط صغير للخطوات السابقة

 

yFnxk.png

 

3- انشاء الروابط (édition de liens / linker) :

 

هذه المرحلة مهمة جدا حيث تعتبر نوع من نظام التشغيل ففيها يتم اكمال عمل المترجم

- باظافة العناوين ( @ adresse ) 

- نقل اوامر المصادر الداخلية 

- دمج الدوال المستعملة من المكاتب التي تم استدعاؤها

- الترجمة من لغة الى اخرى ( تعدد اللغات التي تعالجها البيئة البرمجية المستعملة )

 

4- نقل البرنامج الى الذاكرة المركزية :

 

هنا في هذه المرحلة يتم تحميل البرنامج الى الذاكرة المركزية حتى يتم تشغيله و تنفيذه لان كل ما حدث سابقا كان في القرص الصلب و لا يمكن تنفيذ البرامج هناك لان سرعته لا تتماشى مع سرعة المعالج processeur و الذاكرة المركزية اسرع من القرص الصلب بكثير 

 

5- المصحح (debogueur / debogger) :

 

و مهمته مساعدة المبرمج على تطوير برنامجه و وظائفه كالاتي

- تمكين المبرمج من تصور محتوى الذاكرة

- تمكين المبرمج من تصور محتويات السجلات المختلفة

- تطبيق البرنامج خطوة بخطوة

 

و بهذا و بعد هذه المراحل فاننا حصلنا على برنامح متربص تم ارساله الى الذاكرة المركزية و وضع في طابور الانتظار لانتظار دوره فيتم تشغيله و هذا الامر فيه عدة مراحل اخرى ممتعة فقد انتقلنا الى مدير الذاكرة المركزية و ما الاستراتيجيات الو التكتيكات التي يستعملها في تسيير الذاكرة  ^_^

 

بالتوفيق للجميع و ارجو ان تصححوا لي اخطائي و تفيدوني بما تعرفون

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الف  شكر   على  الشرح  المنظم  و  الجميل  ^_^

لكن  كان  عندي  سؤال  :  لو  كانت  لغة  البرمجة  مبنية  على  السي  مثلا  فاذا  تمت  ترجمتها  تكون  للسي  ثم  للغة  الالة   ام  انها  تترجم  للغة   الالة  مباشرة  ؟؟ :excl:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الحمد لله انني استطعت افادتك و لو قليلا  ^_^

بل يتم ترجمتها الى لغة الالة مباشرة حتى و ان كانت مثلا مبنية على لغة السي و لنأخذ مثالا على ذلك لغة السي ++ من المعلوم ان لغة السي++ هي ابنة لغة السي لكن لا يجب تحويل كود مكتوب بلغة السي++ الى لغة السي ثم الى لغة الالة لان لكل لغة عمليات ترجمتها لكن انا عندما كتبت هذه العبارة    

- الترجمة من لغة الى اخرى ( تعدد اللغات التي تعالجها البيئة البرمجية المستعملة )

قصدت ان هناك بيئات تطويرية يمكنها ان تقوم بالترجمة من عدة لغات بفضل مترجمها فمثلا لدينا البيئة التطويرة code::blocks فهي تترجم من لغة السي ان قمت بحفظ برنامجك بهذه الطريقة exp.c ; و المترجم هنا اسمه gcc و من لغة السي++ ان قمت بحفظ برنامجك بهذه الطريقة exp.cpp و المترجم المستعمل اسمه gpc و طبعا لكل لغة دوالها و قواعدها التي يجب احترامها 

هذا ما اسعفتني به معرفتي و الله أعلم 

بالتوفيق  ^_^

تم تعديل بواسطه tantie L
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

دا  ممكن  الواحد  يصنع  لنفسه  لغة  برمجة   بسهولة  :P  

 

كل  ما  احتاجه  برنامج  يتاكد  من  القواعد  اللغوية  و  برنامج  يحول  للغة  الالة  و في  الاخير  برنامج  ربط B)

 

كده انا  فهمت    شكرا  جزيلا  و جزاكي  الله  كل  خير    :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

دا  ممكن  الواحد  يصنع  لنفسه  لغة  برمجة   بسهولة  :P  

 

كل  ما  احتاجه  برنامج  يتاكد  من  القواعد  اللغوية  و  برنامج  يحول  للغة  الالة  و في  الاخير  برنامج  ربط B)

 

 

 الامر ليس بتلك السهولة ابدا 

 

 http://stackoverflow.com/questions/3810119/how-to-go-about-making-your-own-programming-language

 

http://stackoverflow.com/questions/1669/learning-to-write-a-compiler

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله تعالى وبركاته :P

 

 

2- المترجم :

 

هو عبارة عن خادم او برنامج خدمة يملك دور ترجمة او تحويل برنامج مكتوب بلغة متطورة الى برنامج مكتوب بلغة الالة و هو نتيجة الترجمة (programme objet)

 

لا أتفق معك هنا :D ، فدور المترجم ليس هذا فالمترجم (Compiler) يقوم أولا بترجمة الكود المصدري (Source Code) إلى لغة الأسمبلي ثم بعدها إلى لغة الآلة، لينتج في الأخير الملف التنفيذي :) ...

 

هناك فرق بين المترجم (Compiler) والمجمع (Assembler) الذي يحول الكود المصدري مباشرة إلى لغة الآلة ...

 

هذا الشرح الذي وضعته ينطبق على المجمع وليس على المترجم ;) ...

 

تقبلي مروري ...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 

هناك فرق بين المترجم (Compiler) والمجمع (Assembler) الذي يحول الكود المصدري مباشرة إلى لغة الآلة ...

 

هذا الشرح الذي وضعته ينطبق على المجمع وليس على المترجم ;) ...

 

و عليكم السلام و رحمة اللهو بركاته اخي الكريم

شكرا لتصحيح هذا الخطأ لي و بارك الله فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

عليك أن تعلمي أن هذه الزلة لا تنقص من فحوى الموضوع شيئا :P .

 

فالموضوع جميل والشرح أجمل ;)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 و أنا  كنت  خلاص  بدأت  اضع  القواعد  اللغوية  للغتي :spitcoffee:

 

 

الامر ليس بتلك السهولة ابدا 

 

 http://stackoverflow...amming-language

 

http://stackoverflow...rite-a-compiler

 

 

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

يبدو  ان   صناعة  لغات  البرمجة  موضوع  يحتاج  لخبرة  كبيرة  جدا  و سنوات  من العمل  الله   يكون  في  عون  المبرمجين :rolleyes:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 و أنا  كنت  خلاص  بدأت  اضع  القواعد  اللغوية  للغتي :spitcoffee:

 

 

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

يبدو  ان   صناعة  لغات  البرمجة  موضوع  يحتاج  لخبرة  كبيرة  جدا  و سنوات  من العمل  الله   يكون  في  عون  المبرمجين :rolleyes:

الموضوع يعتمد علي مدي المامك بمواضيع اخري مثل Data Structure غير ان تكون لديك خبرة فى التعامل مع لغات البرمجة 

Compilers هو احد اهم الBranches فى الComputer Science 

كذلك بعض الالمام بالمواضيع مثل Turing machines و Type Theory و lambda calculus مطلوبة جدا 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الف  شكر   على  الشرح  المنظم  و  الجميل  ^_^

لكن  كان  عندي  سؤال  :  لو  كانت  لغة  البرمجة  مبنية  على  السي  مثلا  فاذا  تمت  ترجمتها  تكون  للسي  ثم  للغة  الالة   ام  انها  تترجم  للغة   الالة  مباشرة  ؟؟ :excl:

لم أفهم جيداٌ مقصدك والاخت اجابتك اذا كان مقصدك هو انك تسأل عن ميكانيكية الترجمة نفسها اذا كتبت مثلا compiler للغة قمت بصنعها او compiler لpascal باستخدام لغة الC وهذا امر ليس له علاقة بعملية الcompiling نفسها 

اما اذا كنت تقصد مفهوم Bootstrapping فهذا شئ أخر ظ

 

واقتبس هنا شرح كنت وضعته لتبسيط الفكرة 

هل هناك طريقة عملية وحقيقية لكتابة المترجم باستخدام اللغة التي يقوم أصلا هو بترجمتها ؟

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

"Gaza" فأنت بحاجة الى كتابة المترجم باستخدام لغة موجودة مسبقا اولا وعموما هذه ستكون لغة برمجة اخري ولا يفترض ان تكون كذلك فقد تكون لغة الاسمبلي وهذا فى الغالب او احيانا لغة الالة مباشرة 

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

الخلاصة 

  • 1- قم بكتابة المترجم (G) للغة (f) باستخدام اللغة (Z)
  • 2- استخدام المترجم (G) لكتابة مترجم للغة  (f) باستخدام لغة  (f)
  • 3- الان المترجم (G) هو كامل ومتكامل وبيئة استضافة كاملة 
تم تعديل بواسطه MohamedIBrahim
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أولا  اشكرك  عن  الاجابات  الجميلة  و  المنظمة   :)

 

ثانيا   بالنسبة   لسؤالي   :  كان  عن  لغات  البرمجة  التي  تبنا  على  لغات  اخرى  يعني  مثلا  :  PHP   لغة   مبنية  على  C++   فاعتقدت  ان   اكواد  PHP  تحول  ل 

 

C++   و  نفس  الشيء  مع  اي  لغة   مبنية  على  اساس  لغة   اخرى  .  لكن  بعد  هذه  الاجابات  وضح  الموضوع  بالنسبة  لي  .

 

فجزاكم  الله  كل  خير  :)  

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .