تم النشر منذ 28 Feb 2014 السلام عليكم و رحمة الله و بركاته هذا اول موضوع لي هنا و ارجو ان يكون مفيد و لو قليلا هذا الموضوع يتحدث عن خطوات تنفيذ البرنامج من بداية كتابة الكود الى ان يصير برنامجا قابلا للتنفيذ يعني processus ^_^في البداية هذا مخطط توضيحي لتلك المراحل ثم ساحاول ان اوضح المرحلة تلو الاخرى ما استطعتلتنفيذ برنامج قمنا بكتابة الكود الخاص به فهذا يتطلب عدة مراحل قبل التنفيذ و هذه المراحل تتم بشكل آلي تماما و الموقع الذي تدور فيه هذه المراحل هو القرص الصلب 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; شجرة العبارة الاولى كالاتي و هي تماما صحيحة ^_^ اما الثانية فشجرتها هكذا و هي بالتاكيد خاطئة -_-لنحلل الخطأ معا رغم انه واضح ;)اولا = عملية اسناد موجودة في جدول الرموزثم 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 مراحل قادمة و هذا مخطط صغير للخطوات السابقة 3- انشاء الروابط (édition de liens / linker) : هذه المرحلة مهمة جدا حيث تعتبر نوع من نظام التشغيل ففيها يتم اكمال عمل المترجم- باظافة العناوين ( @ adresse ) - نقل اوامر المصادر الداخلية - دمج الدوال المستعملة من المكاتب التي تم استدعاؤها- الترجمة من لغة الى اخرى ( تعدد اللغات التي تعالجها البيئة البرمجية المستعملة ) 4- نقل البرنامج الى الذاكرة المركزية : هنا في هذه المرحلة يتم تحميل البرنامج الى الذاكرة المركزية حتى يتم تشغيله و تنفيذه لان كل ما حدث سابقا كان في القرص الصلب و لا يمكن تنفيذ البرامج هناك لان سرعته لا تتماشى مع سرعة المعالج processeur و الذاكرة المركزية اسرع من القرص الصلب بكثير 5- المصحح (debogueur / debogger) : و مهمته مساعدة المبرمج على تطوير برنامجه و وظائفه كالاتي- تمكين المبرمج من تصور محتوى الذاكرة- تمكين المبرمج من تصور محتويات السجلات المختلفة- تطبيق البرنامج خطوة بخطوة و بهذا و بعد هذه المراحل فاننا حصلنا على برنامح متربص تم ارساله الى الذاكرة المركزية و وضع في طابور الانتظار لانتظار دوره فيتم تشغيله و هذا الامر فيه عدة مراحل اخرى ممتعة فقد انتقلنا الى مدير الذاكرة المركزية و ما الاستراتيجيات الو التكتيكات التي يستعملها في تسيير الذاكرة ^_^ بالتوفيق للجميع و ارجو ان تصححوا لي اخطائي و تفيدوني بما تعرفون 3 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 1 Mar 2014 الف شكر على الشرح المنظم و الجميل ^_^لكن كان عندي سؤال : لو كانت لغة البرمجة مبنية على السي مثلا فاذا تمت ترجمتها تكون للسي ثم للغة الالة ام انها تترجم للغة الالة مباشرة ؟؟ :excl: 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 1 Mar 2014 (معدل) الحمد لله انني استطعت افادتك و لو قليلا ^_^بل يتم ترجمتها الى لغة الالة مباشرة حتى و ان كانت مثلا مبنية على لغة السي و لنأخذ مثالا على ذلك لغة السي ++ من المعلوم ان لغة السي++ هي ابنة لغة السي لكن لا يجب تحويل كود مكتوب بلغة السي++ الى لغة السي ثم الى لغة الالة لان لكل لغة عمليات ترجمتها لكن انا عندما كتبت هذه العبارة - الترجمة من لغة الى اخرى ( تعدد اللغات التي تعالجها البيئة البرمجية المستعملة )قصدت ان هناك بيئات تطويرية يمكنها ان تقوم بالترجمة من عدة لغات بفضل مترجمها فمثلا لدينا البيئة التطويرة code::blocks فهي تترجم من لغة السي ان قمت بحفظ برنامجك بهذه الطريقة exp.c ; و المترجم هنا اسمه gcc و من لغة السي++ ان قمت بحفظ برنامجك بهذه الطريقة exp.cpp و المترجم المستعمل اسمه gpc و طبعا لكل لغة دوالها و قواعدها التي يجب احترامها هذا ما اسعفتني به معرفتي و الله أعلم بالتوفيق ^_^ تم تعديل 1 Mar 2014 بواسطه tantie L 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 1 Mar 2014 دا ممكن الواحد يصنع لنفسه لغة برمجة بسهولة :P كل ما احتاجه برنامج يتاكد من القواعد اللغوية و برنامج يحول للغة الالة و في الاخير برنامج ربط B) كده انا فهمت شكرا جزيلا و جزاكي الله كل خير :) 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 3 Mar 2014 دا ممكن الواحد يصنع لنفسه لغة برمجة بسهولة :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 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 3 Mar 2014 السلام عليكم ورحمة الله تعالى وبركاته :P 2- المترجم : هو عبارة عن خادم او برنامج خدمة يملك دور ترجمة او تحويل برنامج مكتوب بلغة متطورة الى برنامج مكتوب بلغة الالة و هو نتيجة الترجمة (programme objet) لا أتفق معك هنا :D ، فدور المترجم ليس هذا فالمترجم (Compiler) يقوم أولا بترجمة الكود المصدري (Source Code) إلى لغة الأسمبلي ثم بعدها إلى لغة الآلة، لينتج في الأخير الملف التنفيذي :) ... هناك فرق بين المترجم (Compiler) والمجمع (Assembler) الذي يحول الكود المصدري مباشرة إلى لغة الآلة ... هذا الشرح الذي وضعته ينطبق على المجمع وليس على المترجم ;) ... تقبلي مروري ... 1 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 3 Mar 2014 الامر ليس بتلك السهولة ابدا http://stackoverflow.com/questions/3810119/how-to-go-about-making-your-own-programming-language http://stackoverflow.com/questions/1669/learning-to-write-a-compiler + 1 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 3 Mar 2014 هناك فرق بين المترجم (Compiler) والمجمع (Assembler) الذي يحول الكود المصدري مباشرة إلى لغة الآلة ... هذا الشرح الذي وضعته ينطبق على المجمع وليس على المترجم ;) ... و عليكم السلام و رحمة اللهو بركاته اخي الكريمشكرا لتصحيح هذا الخطأ لي و بارك الله فيك 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 3 Mar 2014 عليك أن تعلمي أن هذه الزلة لا تنقص من فحوى الموضوع شيئا :P . فالموضوع جميل والشرح أجمل ;) 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 3 Mar 2014 و أنا كنت خلاص بدأت اضع القواعد اللغوية للغتي :spitcoffee: الامر ليس بتلك السهولة ابدا http://stackoverflow...amming-language http://stackoverflow...rite-a-compiler مشكور جدا على هذه الروابط بها الكثير من الكتب المفيدة في موضوع المترجمات فعلا تستحق التقييم :)يبدو ان صناعة لغات البرمجة موضوع يحتاج لخبرة كبيرة جدا و سنوات من العمل الله يكون في عون المبرمجين :rolleyes: 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 4 Mar 2014 و أنا كنت خلاص بدأت اضع القواعد اللغوية للغتي :spitcoffee: مشكور جدا على هذه الروابط بها الكثير من الكتب المفيدة في موضوع المترجمات فعلا تستحق التقييم :)يبدو ان صناعة لغات البرمجة موضوع يحتاج لخبرة كبيرة جدا و سنوات من العمل الله يكون في عون المبرمجين :rolleyes:الموضوع يعتمد علي مدي المامك بمواضيع اخري مثل Data Structure غير ان تكون لديك خبرة فى التعامل مع لغات البرمجة Compilers هو احد اهم الBranches فى الComputer Science كذلك بعض الالمام بالمواضيع مثل Turing machines و Type Theory و lambda calculus مطلوبة جدا 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 4 Mar 2014 (معدل) الف شكر على الشرح المنظم و الجميل ^_^لكن كان عندي سؤال : لو كانت لغة البرمجة مبنية على السي مثلا فاذا تمت ترجمتها تكون للسي ثم للغة الالة ام انها تترجم للغة الالة مباشرة ؟؟ :excl:لم أفهم جيداٌ مقصدك والاخت اجابتك اذا كان مقصدك هو انك تسأل عن ميكانيكية الترجمة نفسها اذا كتبت مثلا compiler للغة قمت بصنعها او compiler لpascal باستخدام لغة الC وهذا امر ليس له علاقة بعملية الcompiling نفسها اما اذا كنت تقصد مفهوم Bootstrapping فهذا شئ أخر ظ واقتبس هنا شرح كنت وضعته لتبسيط الفكرة هل هناك طريقة عملية وحقيقية لكتابة المترجم باستخدام اللغة التي يقوم أصلا هو بترجمتها ؟نعم فأنت فى هذه الحالة عليك ان يكون لديك بعض العبارات والدوال التي ستقوم بكتابة المترجم الخاص الجديد وان كنت تقوم بكتابة المترجم من جديد فمثلا لنقل مترجم للغة ++C سوف تقوم فقط بكتابة المترجم بلغة السي بلس ومن ثم اولا ستقوم بترجمته باستخدام مترجم متواجد اساسا (مترجم موجود مسبقا) ومن ناحية أخري اذا كنت تقوم بكتابة مترجم للغة برمجة جديدة ودعنا مثلا نطلق عليها اسم "Gaza" فأنت بحاجة الى كتابة المترجم باستخدام لغة موجودة مسبقا اولا وعموما هذه ستكون لغة برمجة اخري ولا يفترض ان تكون كذلك فقد تكون لغة الاسمبلي وهذا فى الغالب او احيانا لغة الالة مباشرة اذا كنت تريد عمل bootstrap للغة "Gaza" فانك فى البداية لا تقوم بعمل مترجم لكل اللغة وبدلا من ذلك فانك تقوم بكتابة المترجم لبعض مفردات وقواعد اللغة وستقوم بكتابة اجزاء على هيئة مجموعات فرعية ومن ثم عن الاكتمال وانشاء مترجم لهذه الاجزاء فانك تستطيع كتابة مترجم للغة كاملة ومن الواضح أن هذا يمكن أن يحدث تكرارا في نقطة واحدة بدلا من القفز وترك اشياء مهمة وذلك لان الجزء الصغير من "Gaza" هو مجموعة من اللغة الكاملة نفسها والان فأنت تمتلك مترجم مبني على نفسه وتستطيع ترجمته باستخدام نفسه الخلاصة 1- قم بكتابة المترجم (G) للغة (f) باستخدام اللغة (Z)2- استخدام المترجم (G) لكتابة مترجم للغة (f) باستخدام لغة (f)3- الان المترجم (G) هو كامل ومتكامل وبيئة استضافة كاملة تم تعديل 4 Mar 2014 بواسطه MohamedIBrahim 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه
قام بالرد منذ 4 Mar 2014 أولا اشكرك عن الاجابات الجميلة و المنظمة :) ثانيا بالنسبة لسؤالي : كان عن لغات البرمجة التي تبنا على لغات اخرى يعني مثلا : PHP لغة مبنية على C++ فاعتقدت ان اكواد PHP تحول ل C++ و نفس الشيء مع اي لغة مبنية على اساس لغة اخرى . لكن بعد هذه الاجابات وضح الموضوع بالنسبة لي . فجزاكم الله كل خير :) 0 شارك هذا الرد رابط المشاركة شارك الرد من خلال المواقع ادناه