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

انماط لغات البرمجة paradigms

بدأه wazzz في 20 سبتمبر 2010 · 3 رد · 3,605 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

موضوع نادراً ما نرى احد يتكلم عنه بشكل مفصل , فالتفكير في انماط البرمجة هو التفكير بمستوى اعلى من مستوى التفكير على مستوى لغة برمجة وهذا برأيي قمة التجريد (:

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

فقد تعرفنا على العديد من انماط البرمجة فوجدنا النمط الشهير oop واللغات المنطقية والتابعية functional و الهيكلية ..... الخ

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

ارجو ان تشاركونا بمعلوماتكم عن هذا الموضوع

There's no place like 127.0.0.1

#2

السلام عليكم ...

اقتباس
ولكن هناك العديد من انماط البرمجة الاخرى التي لم نسمع عنها فهل تملك معلومات عن انماط جديدة او لم يسمع بها ؟

هناك أساليب كثيرة جداً للبرمجة. الأساليب الأكثر شهرة و تأثيراً في البرمجيات هي Structured و Procedural و Abstract Data Types و OOP و Functional و Generic-Programming و Meta-Programming و هناك العديد أيضاً كالـ Constrained و Logic و Event-Based و هناك Paradigms تتعلق بالـ Concurrent Programming و أساليب يصعب حصرها في مكان واحد. أولاً و أخيراً, كل واحد من هذه الأساليب لايوجد تعريف جامع مانع يفصله عن الآخر. و إنما هناك مفاهيم شائعة تتبع كل أسلوب. و كل أسلوب له عدة flavors و كل flavor يتوفر بأشكال متعددة في لغات برمجة مختلفة أو في لغة برمجة واحدة. و ليس هذا فحسب, فمعظم لغات البرمجة تخلط بين الأساليب, فلايوجد لغة برمجة نقية إلا ما ندر و هذا يعني أن بعض لغات البرمجة تخلط بين الـ Structured و الـ Procedural و تضع فوقهم ADT و فوقها OOP على طريقة Simula كما هو الحال في JAVA. و لغات أخرى كـ #C أضافت الـ Functional إلى ماوجد في JAVA مثلاً.

بالنسبة لما أشاهده, الكثيرون يخلطون بين مفاهيم مختلفة و لكنها توجد مجتمعة في لغات البرمجة. فمثلاً يتم الخلط دائماً بين الـ Structured و الـ Procedural و على الطرف الآخر, يتم الخلط بين OOP و بين ADT.

الأساليب التي يتم التجربة و الكلام فيها كثيراً حالياً هي الـ Generic Programming و الـ Meta Programming و الـ Concurrent Programming و الذي يتوقع أن يشهد تطوراً كبيراً في السنين القادمة. خصوصاً عندما نخلطه مع الـ Functional الذي يعتبر بطبعه قابل لتوزيع الحسابات على مسارات متعددة دون حصول أي خلل بمنطق البرنامج.

إذا كنت تريد المتعة, فالـ Meta Programming هي برأيي الطريق :)

الـ Hackers يفضلون Common Lisp و الـ Macros الشهيرة الموجودة بها, و أنا أفضل الـ Templates في ++C. يمكنك تعلم الموضوع عن طريق Python أيضاً, فهي جميلة من هذه الناحية.

لو كان لديك اهتمام في الموضوع, فأنا أرحب بتوسيع النقاش, و لكن في نقاط محددة لأن الكلام العام لا يفيد كثيراً. اهتمامي يتعلق بخمس أساليب بشكل رئيسي, ADT + OOP + Generic + Meta + Functional.

تحياتي...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 21 سبتمبر 2010 في 15:17

1
#3

اشكر ردك Khaled.Alshaya اتمنى لو تستيغ بشرح بعض الانماط على سبيل المثل لا الحصر :

ADT + OOP + Generic + Meta + Functional.

واريد ان استفسر عن فكرة اختلاف Structured عن Procedural .

ولك كامل امتنناي على ردك القيم

There's no place like 127.0.0.1

#4

بالنسبة للاختلاف بين الـ Structured Paradigm و الـ Procedural, هو أن الـ Structured هي تطويرات في الـ Constructs الخاصة بأي لغة برمجة. و هنا نعني أدوات التعبير عن الحسابات على أدنى مستوى. مثلاً, في اللغات الـ Imperative هل تعتقد أنها خلقت و الـ While loops و الـ For loops موجودة بهذا الشكل؟! هناك الكثير من أشكال الحلقات التي ظهرت بمميزات عديدة, هناك مثلاً الـ Construct الذي اخترعه Dijkstra و المسمى Weakest Precondition, و الذي كان حلاً لمشكلة إثبات صحة البرامج, و لكن أذواق المبرمجين لم تتقبله و اندثر. باختصار, الـ Structured Programming تهتم بكيفية التعبير عن الجمل البرمجية, و البحوث الأكثر أهمية و التجارب التي حصلت على مر الزمان تتعلق بالجمل الشرطية و التي أشهر مثال لها الـ if statements و عمليات التكرار. عمليات التكرار تتمثل في الحلقات في اللغات الـ Imperative, و الـ Recursive Functions في اللغات الـ Functional و غيرها. هناك تطورات حاصلة و لكنها بطيئة جداً في هذا المجال, مثال حديث نسبياً الـ for each loops. بالنسبة للـ Procedural Paradigm, فإنه يهتم بكيفية عمل Modularization للحسابات. هنا الكلام يحصل في كيف تقسيم الكود إلى وحدات كالصناديق السوداء التي تقوم بحساب أمر, و إعادة ناتج و مثاله الدوال و الـ Lambda Functions و خلافه الكثير و عمليات الـ Binding و الـ Closures و هذا مجال بحث كبير جداً. هذا الأسلوب لا تعتقد أنه بسيط, فهو أساس ما تراه من Paradigms مبنية فوقه في معظم لغات البرمجة الحديثة. الحديث عن الدوال هنا لا يتعلق بالـ Recursive Functions كآلة لحساب التكرارات, و إنما كصناديق سوداء تستقبل مواداً خام و تقوم بإخراج ناتج الحساب. هذا الأسلوب يشجع بكل شبه مطلق على ناحية الـ Black Box Concept. مثلاً, لو أنك قمت بكتابة دوال على الشكل التالي:

int x;
void fun1()
{
    x++;
	printf("%d", x);
}
fun2()
{
    x--;
	printf("%d", x);
}
int main()
{
    fun1();
	fun2();
}

هذا يمكن أن يطلق عليه Quasi Procedural Oriented, أو بترجمة مبسطة اتباع كاذب لمفهوم الـ Procedural Paradigm, لأننا لا نتعامل مع الدوال على أنها black boxes, فلا تستطيع أخذ الدالة و استخدامها في مكان آخر, دون تعديل الكود الذي لديك و إضافة أمور أخرى ليست هي الدالة نفسها. عموماً, أتمنى أن يكون الفرق واضح :) لو أردت الاستزادة هناك العديد من الأوراق العلمية الشهيرة في هذا المجال, فمثلاً بالنسبة للـ Structured Programming يمكنك البحث عن ورقة Dijkstra و التي ماتت goto بعدها في صناعة البرمجيات!

الفرق بين ADT و OOP لم يشرحه حسب علمي أفضل من ناشر OOP في أوساط البرمجة, و ناقلها من الأكاديميات إلى صناعة البرمجة! حاول قراءة هذه الورقة من الدكتور الهاكر Stroustrup و استمتع: What is ‘‘ObjectOriented Programming’’

الـ Functional من أقوى الـ Paradigms و أي مبرمج يجب أن يكون لديه إلمام بالأساسيات و يعرف كيف يستعمل أدواتها الموجودة في لغات البرمجة. بالنسبة لي ++C و النسخة الجديدة منها توفر الكثير لي, ولكني أعرف القليل من Scheme و التي تعملت منها الكثير و الكثير بصراحة. نصيحتي أن لا تقرأ موضوعي و تتجه إلى قراءة هذا الموضوع مع كوب من القهوة بجانبك: Functional Programming For The Rest of Us. بصراحة هذا الرجل هاكر أيضاً :lol: و يشرح الموضوع بطريقة مبسطة جداً, و هذا الموضوع مميز لأني في بادئ الأمر تخوفت كثيراً بعد قراءة بعض الأوراق العلمية, و ظهرت لي بعض المصطلحات التي لم أستطع تهجئة بعضها! حتى وجدت هذا الموضوع و بدأت الرحلة.

الـ Generic Paradigm, في الحقيقة عبارة عن مفهوم يمكن تطبيقه في أي من الـ Paradigms الأخرى. فليس له أدوات لها قواسم مشتركة مع الأدوات الأخرى فيه. فيمكن تطبيقه بواسطة OOP إضافة إلى ADT إضافة إلى أدوات أخرى كالـ Templates في ++C أو الـ Generics في Java و #C, أو يمكن أن تكون اللغة تكون اللغة توفر الـ Type Inferences و تسمح بالكثير من الـ Generic Programming. عموماً, لدي بعض الخربشات حول الموضوع إن كنت مهتماً: Professional Data Structure Libraries In Cpp

إن كنت مهتماً بهذا الـ Paradigm فيجب أن تحدد الأداة التي تستخدمها و الـ Paradigm الذي تتبعه هذه الأداة.

الـ Meta Programming هذه متقدمة قليلاً. الفكرة ببساطة أننا نقوم بكتابة كود يقوم المترجم بأخذه و إنتاج كود آخر. قد تبدو هذه الفكرة سخيفة قليلاً, و لكنها تحل مشاكل عديدة في نواح من الصعب جداً إيجاد حل عملي لها. لن أقول لك اذهب إلى Boost و انظر كيف يقومون بكتابة Libraries تضيف ميزات إلى اللغة. هذه ميزات رهيبة جداً, تصور أنك في ++C يمكنك كتابة قواعد EBNF مباشرة و ليس كنص, أو كتابة مكتبة تسمح لك بكتابة SQL مباشرة في كود ++C. المهم في هذه العملية ليس تخلصنا من علامات التنصيص لو أننا كتبناها كنصوص, و لكن قيام المترجم بأخذ القواعد التي أخذناها و ترجمتها داخلياً إلى Parser و تصور أن ملفك التنفيذي يحمل هذا الـ Parser فقط و ليس القواعد نفسها و الأمر الذي يقوم بتحويل القواعد إلى كائنات للتعامل معها في البرنامج! و في الحالة الثانية يمكن تحويل SQL إلى دوال يتم مناداتها ضمن البرنامج بدلاً من إرسال Query إلى الـ Query Compiler في قاعدة البيانات. تصور ماذا سيقدم هذا الأمر لنا؟ تحقق من جمل SQL و قواعد EBNF بواسطة المترجم مباشرة بدلاً من تجربة جمل SQL أو القواعد في مكان آخر! عموماً أنا مبتدئ في هذا الموضوع بصراحة, و لكن أحاول تطبيق فكرة من هذا النوع في المكتبة التي أقوم بكتابتها في هذه الفترة. لم أقم بهذا الأمر حتى الآن, و لكني أحاول حل المشكلة التالية . مكتبتي تستقبل حجم معين من الـ Bits و لنفرض 40 bits, و أريد أن أعرف ماهو أكبر متغير يمكن أن يحمل تلك الـ 40 bits دون زيادة أو نقصان؟ المشكلة في الـ Meta Programming أنها عبارة عن حسابات لإنتاج أنواع و ليس لإنتاج أعداد في الغالب. و هذا هو الجزء الذي لا يدخل عقلي و لا عقل الآخرين بسهولة, و لكن المتمكنين من هذا الأمر يقومون بكتابة أمور elegant حتى النخاع! عموماً, الحسابات على الأعداد تدخل في الـ Meta Programming و أستخدمها في معظم الحسابات داخل المكتبة uint و لكنها أسهل من العمليات على الأنواع. عموماً, الكلام عن الـ Meta Programming كان مركزاً حول ++C و هناك flavors أسهل بكثير في لغات برمجة أخرى. عموماً لا أنصحك بـ ++C في هذا الأمر, و اتجه إلى Python أو غيرها من اللغات الحديثة لكي تأخذ فكرة مبسطة, و لكن الذي يجذب المبرمجين إلى ++C في هذه الناحية هو أن المترجم يقوم بالعمل كله و يبقى لديك slim exe! بينما في اللغات الأخرى, يتم الاعتماد على فكرة توفر المفسر أو frame-work يقوم بترجمة الكود لحظة التشغيل.

اعذرنا إن وجدت أخطاء, كتبته على عجالة.

تحياتي...

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 23 سبتمبر 2010 في 01:48

4

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