hotchpotch/wikipedia-multilingual-ir-pairs huggingface dataset:
برمجة عامة دعم لغات البرمجة للعمومية
يمكن النظر إلى أنواع المصفوفات والستروكت باعتبارها أنواعًا عمومية محددة مسبقًا. فكل استخدام لنوع مصفوفة أو ستروكت يؤدي إلى إنشاء نوع ملموس جديد، أو إعادة استخدام نوع منشأ سابقًا. تُعتبر أنواع عناصر المصفوفات وحقول ستروكت أنواعًا مُعلَّمة تُستخدم لإنشاء النوع العمومي المقابل. غالبًا ما تكون كل هذه الأمور مدمجة داخل المصرّف، وتختلف البُنى النحوية الخاصة بها عن تلك الخاصة بالبُنى العمومية الأخرى. تحاول بعض لغات برمجة قابلة للامتداد أن توحّد بين الأنواع العمومية المدمجة وتلك التي يعرّفها المستخدم.
فيما يلي استعراض واسع لآليات العمومية في لغات البرمجة. وللاطلاع على مقارنة متخصصة بشأن مدى ملاءمة هذه الآليات للبرمجة العمومية، انظر:
عند إنشاء أصناف حاوية في لغات ذات تصنيف ثابت، يكون من غير العملي كتابة تنفيذات خاصة بكل نوع بيانات يحتويه الصنف، خاصة إذا كانت الشيفرة لكل نوع متشابهة إلى حد كبير. على سبيل المثال، في لغة C++، يمكن تفادي تكرار الشيفرة بتعريف قالب صنف:
برمجة عامة دعم لغات البرمجة للعمومية
في المثال أعلاه، T هو عنصر نائب يُستبدل بالنوع الذي يُحدَّد عند إنشاء القائمة. هذه "الحاويات من نوع T"، والتي تُعرف عمومًا باسم القالب، تتيح إعادة استخدام الصنف مع أنواع بيانات مختلفة طالما تم احترام بعض العقود مثل الأنواع الفرعية وتوقيع النوع. لا ينبغي الخلط بين هذه الآلية العمومية وبين تعددية الأشكال، التي تشير إلى الاستخدام الخوارزمي للفئات القابلة للاستبدال: على سبيل المثال، قائمة من الكائنات من النوع Moving_Object تحتوي على كائنات من نوع Animal وCar. يمكن أيضًا استخدام القوالب لإنشاء دوال مستقلة عن النوع كما في مثال Swap أدناه:
يُعتبر بناء template في لغة C++ كما في المثال أعلاه، من أكثر آليات العمومية شهرةً وانتشارًا، وقد ساهم في ترسيخ مفهوم العمومية بين المبرمجين ومصممي لغات البرمجة. وتدعم لغة D أيضًا قوالب كاملة العمومية استنادًا إلى سابقات C++ ولكن ببنية أبسط. أما لغة جافا، فقد وفرت آليات للعمومية ببنية نحوية مستوحاة من C++ منذ إصدار منصة جافا 5.0.
برمجة عامة دعم لغات البرمجة للعمومية
وقدمت سي شارب 2.0، وأوكسجين 1.5 (سابقًا كروم)، وفيجوال بيسك دوت نت 2005 بناءات تستفيد من دعم العمومية المدمج في دوت نت فريموورك من الإصدار 2.0.
تمتاز أيدا بدعمها للقوالب منذ تصميمها الأول في الفترة بين 1977–1980. وتستخدم المكتبة المعيارية القوالب لتوفير العديد من الخدمات. وقد أضافت أيدا 2005 مكتبة حاويات عامة شاملة إلى المكتبة القياسية، مستوحاة من مكتبة القوالب المعيارية في ++C.
الوحدة القالبية هي حزمة أو برنامج فرعي يستقبل واحداً أو أكثر من "المعلمات الشكلية القالبية".
المعلمة الشكلية القالبية يمكن أن تكون قيمة أو متغيراً أو ثابتاً أو نوعاً أو برنامجاً فرعياً أو حتى مثيلاً لوحدة قالبية أخرى معرفة مسبقاً. وللمعلمات الشكلية القالبية من نوع "نوع"، تميز البنية اللغوية بين الأنواع المنفصلة وأنواع الفاصلة العائمة والثابتة والمؤشرات وغير ذلك. ويمكن أن تحتوي بعض المعلمات الشكلية على قيم افتراضية.
لـ"استنساخ" وحدة قالبية، يقوم المبرمج بتمرير "معلمات فعلية" لكل معلمة شكلية. ويتصرف النسخ القالبي حينها كوحدة عادية تماماً. ومن الممكن استنساخ وحدات قالبية أثناء وقت التشغيل، مثلاً داخل حلقة.
برمجة عامة دعم لغات البرمجة للعمومية
تتيح بنية اللغة تحديداً دقيقاً للقيود المفروضة على المعلمات الشكلية القالبية. فعلى سبيل المثال، يمكن تحديد أن نوعاً شكلياً قالبيّاً لن يقبل إلا نوعاً معيارياً. كما يمكن التعبير عن قيود بين المعلمات الشكلية القالبية، مثلاً:
في هذا المثال، يتم تقييد النوع Array_Type بالنوعين Index_Type وElement_Type. وعند استنساخ الوحدة، يجب على المبرمج تمرير نوع مصفوفة فعلي يحقق هذه القيود.
من عيوب هذا التحكم الدقيق هو التعقيد في البنية اللغوية، لكن، بما أن جميع المعلمات الشكلية القالبية معرفة بالكامل في المواصفة، فإن المُصرّف يمكنه استنساخ القوالب دون الحاجة إلى الاطلاع على جسم القالب.
وعلى عكس ++C، لا تسمح أيدا بإنشاء نسخ متخصصة للقوالب، وتتطلب أن يتم استنساخ كل قالب بشكل صريح. لهذه القواعد عدة نتائج:
برمجة عامة دعم لغات البرمجة للعمومية
تستخدم لغة C++ القوالب (بالإنجليزية: Templates) لتمكين تقنيات البرمجة العامة. تتضمن مكتبة C++ المعيارية مكتبة القوالب المعيارية أو STL التي توفر إطار عمل من القوالب لهياكل البيانات والخوارزميات الشائعة. يمكن أيضًا استخدام القوالب في سي++ لبرمجة القوالب الوصفية، وهي وسيلة لتقييم بعض أجزاء الشيفرة في وقت الترجمة بدلاً من زمن التشغيل. باستخدام تخصيص القوالب (بالإنجليزية: Template Specialization)، فإن قوالب سي++ كمال تورنغ.
توجد أنواع عديدة من القوالب، وأكثرها شيوعًا هي قوالب الدوال وقوالب الأصناف. قالب الدالة هو نمط لإنشاء دوال عادية استنادًا إلى أنواع المعاملات التي تُمرَّر عند الاستدعاء. على سبيل المثال، تحتوي مكتبة القوالب المعيارية على قالب دالة max(x, y) ينشئ دالة تُرجع إما "x" أو "y" أيهما أكبر. يمكن تعريف max() كما يلي:
يمكن استدعاء التخصيصات لهذه الدالة، أي النُسخ المنشأة بأنواع معينة، كما لو كانت دوال عادية:
يقوم المترجم بتحليل المعاملات المستخدمة لاستدعاء max ويحدد أن الاستدعاء هو max(int, int). ثم يُنشئ نسخة من الدالة حيث النوع T هو int، ويكافئ ذلك الدالة التالية:
برمجة عامة دعم لغات البرمجة للعمومية
يعمل هذا سواء كانت القيم x وy أعدادًا صحيحة أو سلاسل نصية أو أي نوع آخر يمكن تطبيق التعبير x < y عليه، أو بشكل أدق، لأي نوع تم تعريف العامل operator< له. لا يشترط وجود وراثة مشتركة بين الأنواع المستخدمة، لذا فهو مشابه لمفهوم تنويع البط. يمكن لأي برنامج يعرّف نوع بيانات مخصص أن يحدد معنى العامل < لهذا النوع باستخدام تحميل زائد للعملية، مما يسمح باستخدامه مع قالب الدالة max(). ورغم أن هذه الفائدة قد تبدو بسيطة في هذا المثال المحدود، إلا أنها توفر الكثير من الوظائف في سياق مكتبة شاملة مثل STL؛ إذ يكفي تعريف بعض المعاملات لنوع جديد من البيانات كي يصبح قابلًا للاستخدام مع خوارزميات قياسية مثل sort() وstable_sort() وbinary_search()، أو إدراجه ضمن هياكل بيانات مثل set وإدارة الذاكرة ومصفوفة ارتباطية.
برمجة عامة دعم لغات البرمجة للعمومية
تُعد قوالب C++ آمنة تمامًا من حيث سلامة الأنماط أثناء وقت الترجمة. كمثال توضيحي، فإن النوع القياسي complex لا يعرّف العامل <، لأنه لا توجد علاقة ترتيب صارمة على الأعداد المركبة. لذلك، فإن استدعاء max(x, y) سيفشل بخطأ في الترجمة إذا كانت x وy من نوع complex. وبالمثل، لا يمكن تطبيق قوالب أخرى تعتمد على < على بيانات complex ما لم يتم توفير دالة مقارنة (على شكل دالة أو كائن دالة). على سبيل المثال: لا يمكن استخدام complex كمفتاح في map ما لم تُوفر مقارنة. للأسف، غالبًا ما تُصدر المترجمات رسائل خطأ غامضة وغير مفيدة لهذا النوع من الأخطاء. ويمكن التخفيف من هذه المشكلة بضمان التزام الكائن ببروتوكول معين بروتوكول (اتصالات). كما أن اللغات التي تستخدم دالة compare بدلاً من العامل < يمكنها استخدام قيم complex كمفاتيح.
برمجة عامة دعم لغات البرمجة للعمومية
نوع آخر من القوالب هو "قالب الصنف" (Class Template)، والذي يمد نفس المفهوم ليشمل الأصناف. يُعد التخصيص (Specialization) لقالب صنف بمثابة صنف فعلي. وغالبًا ما تُستخدم قوالب الأصناف لإنشاء حاويات عامة. على سبيل المثال، توفر مكتبة STL قائمة متصلة. لإنشاء قائمة مرتبطة من أعداد صحيحة نكتب list<int>، ولإنشاء قائمة من سلاسل نصية نكتب list<string>. تحتوي list على مجموعة من الدوال القياسية التي تعمل مع أي نوع معامل مناسب.
تُعد "تخصيص القوالب" (بالإنجليزية: Template Specialization) من الميزات القوية في قوالب C++. تتيح هذه الميزة توفير تنفيذات بديلة اعتمادًا على خصائص معينة لنوع المعامل الذي يتم إنشاؤه (instantiated). يهدف تخصيص القوالب إلى أمرين: السماح ببعض أشكال التحسين (Optimization)، وتقليل تضخم الشيفرة (Code Bloat).
برمجة عامة دعم لغات البرمجة للعمومية
على سبيل المثال، لنفترض وجود دالة قالب sort(). من الأنشطة الأساسية التي تقوم بها هذه الدالة هو تبديل القيم أو استبدالها بين موقعين في الحاوية. إذا كانت القيم كبيرة (من حيث عدد البايتات اللازمة لتخزين كل منها)، فعادةً ما يكون من الأسرع بناء قائمة منفصلة من المؤشرات إلى الكائنات، ثم فرز تلك المؤشرات، وأخيرًا بناء التسلسل النهائي المرتب. أما إذا كانت القيم صغيرة جدًا، فغالبًا ما يكون من الأسرع مجرد تبديل القيم في أماكنها مباشرةً عند الحاجة. علاوة على ذلك، إذا كان النوع المعامل هو بالفعل نوع مؤشّر، فلا حاجة لبناء مصفوفة مؤشرات منفصلة. يتيح تخصيص القوالب لمنشئ القالب كتابة تنفيذات مختلفة وتحديد الخصائص التي يجب أن تتوفر في النوع المعامل ليُستخدم كل تنفيذ.
برمجة عامة دعم لغات البرمجة للعمومية
على عكس قوالب الدوال، يمكن لقوالب الأصناف أن تكون مخصصة جزئيًا. هذا يعني أنه يمكن توفير نسخة بديلة من كود قالب الصنف عندما تكون بعض معلمات القالب معروفة، مع ترك معلمات أخرى عامة. يمكن استخدام ذلك، على سبيل المثال، لإنشاء تنفيذ افتراضي (ويسمى "التخصيص الرئيسي") يفترض أن نسخ النوع المعامل مكلف، ثم إنشاء تخصيصات جزئية لأنواع يسهل نسخها، مما يزيد الكفاءة العامة. يمكن لمستخدمي هذا النوع من قوالب الأصناف استخدام التخصيصات دون الحاجة إلى معرفة ما إذا كان المترجم قد استخدم التخصيص الرئيسي أو تخصيصًا جزئيًا في كل حالة. كما يمكن لقوالب الأصناف أن تكون "مخصصة كليًا"، أي أنه يمكن توفير تنفيذ بديل عندما تكون جميع الأنواع المعلمة معروفة.
بعض استخدامات القوالب، مثل دالة max()، كانت تُنفّذ سابقًا باستخدام معالج مسبق وماكرو (علم الحاسوب) شبيه بالدالة (وهو من بقايا لغة سي). على سبيل المثال، إليك تنفيذ ممكن لماكرو مماثل:
برمجة عامة دعم لغات البرمجة للعمومية
يتم توسيع الماكرو (نسخه ولصقه) من قبل معالج مسبق قبل عملية الترجمة البرمجية، بينما القوالب عبارة عن دوال حقيقية فعلية. يتم دائمًا توسيع الماكرو داخل الكود، بينما يمكن أيضًا للقوالب أن تُستخدم كدالة مضمنة إذا رأى المترجم أن ذلك مناسب.
مع ذلك، تُعتبر القوالب عمومًا تحسينًا على الماكرو لأغراض كهذه. فالقوالب آمنة من حيث النوع، كما أنها تتجنب بعض الأخطاء الشائعة في الشيفرات التي تعتمد بشكل كبير على الماكرو، مثل تقييم المعاملات ذات التأثيرات الجانبية مرتين. وربما الأهم من ذلك، أن القوالب صُممت لتكون قابلة للتطبيق على مشكلات أكبر بكثير من تلك التي تُعالج بالماكرو.
لكن، هناك أربع سلبيات رئيسية لاستخدام القوالب:
تفتقر القوالب في C++ إلى العديد من الميزات، مما يجعل تنفيذها واستخدامها بطريقة مباشرة أمرًا مستحيلًا في كثير من الأحيان. وبدلًا من ذلك، يضطر المبرمجون للاعتماد على حيل معقدة تؤدي إلى شيفرة منتفخة وصعبة الفهم والصيانة. وتسهم التطورات الحالية في معايير C++ في تفاقم هذه المشكلة، لأنها تستخدم هذه الحيل بشكل كبير وتبني عليها العديد من الميزات الجديدة.
برمجة عامة دعم لغات البرمجة للعمومية
لطالما كان دعم القوالب ضعيفًا في العديد من المترجمات (compilers)، مما قد يجعل الشيفرة أقل قابلية للنقل بين الأنظمة. كما قد يكون الدعم ضعيفًا عندما يُستخدم مترجم C++ مع رابط لا يدعم C++، أو عند محاولة استخدام القوالب عبر حدود مكتبة برمجية.
قد تُنتج المترجمات رسائل خطأ طويلة ومربكة وغير مفيدة أحيانًا عند اكتشاف أخطاء في الشيفرات التي تستخدم مبدأ "الفشل في الاستبدال ليس خطأً" (SFINAE)، لا سيما في الإصدارات السابقة لـ C++20.، مما يصعب تطوير القوالب.
أخيرًا، يتطلب استخدام القوالب من المترجم إنشاء "نسخة" منفصلة من الصنف أو الدالة القالب لكل مجموعة من أنواع المعاملات المستخدمة. (وهذا ضروري لأن الأنواع في C++ ليست بنفس الحجم، وأحجام الحقول تُعدّ مهمة في كيفية عمل الأصناف). لذلك، فإن الاستخدام العشوائي للقوالب يمكن أن يؤدي إلى تضخم الشيفرة (بالإنجليزية: code bloat)، مما يؤدي إلى تنفيذ ملفات تنفيذية ضخمة جدًا. مع ذلك، فإن الاستخدام الحكيم لتخصيص القوالب والتوريث يمكن أن يقلل من هذا التضخم في بعض الحالات:
برمجة عامة دعم لغات البرمجة للعمومية
فهل يمكن استخدام التوريث لتقليل مشكلة تكرار الشيفرة الناتجة عن استخدام القوالب؟ يتضمن ذلك اشتقاق قالب من صنف عادي. وقد أثبتت هذه التقنية نجاحها في الحد من تضخم الشيفرة في الاستخدام الفعلي. أولئك الذين لم يستخدموا مثل هذه التقنية وجدوا أن الشيفرة المكررة قد تستهلك ميغابايتات من المساحة حتى في البرامج متوسطة الحجم.— بيارن ستروستروب، The Design and Evolution of C++, 1994
5. قد تتطلب الأصناف أو الدوال القالبية وجود "تخصيص صريح" (بالإنجليزية: explicit specialization) لصنف القالب، مما يستلزم إعادة كتابة الصنف بالكامل من أجل معاملات معينة مستخدمة معه.
وقد تسبب التكرارات الإضافية التي تُنتجها القوالب صعوبات لبعض أدوات التنقيح في التعامل معها. فعلى سبيل المثال، عند محاولة تعيين نقطة توقف داخل قالب من ملف المصدر، قد لا تُضبط النقطة في التخصيص الفعلي المطلوب، أو قد تُضبط في كل المواضع التي يتم فيها استخدام هذا القالب.
برمجة عامة دعم لغات البرمجة للعمومية
كذلك، يجب أن يكون كود تنفيذ القالب متاحًا بالكامل (مثلًا، مضمنًا في ملف رأس) لوحدة الترجمة (ملف المصدر) التي تستخدمه. فالقوالب، بما في ذلك جزء كبير من المكتبة القياسية، لا يمكن ترجمتها إذا لم تكن مضمنة في ملفات رأس. (ويُعد هذا على النقيض من الشيفرات غير القالبية، التي يمكن ترجمتها إلى ثنائيات مع توفير ملف رأس يحتوي على التصريحات فقط). وقد يُعدّ هذا عيبًا لأنه يكشف كود التنفيذ، مما يزيل بعض التجريدات، وقد يحد من استخدامه في المشاريع مغلقة المصدر.
يدعم لغة دي القوالب التي تعتمد في تصميمها على سي++. معظم أساليب قوالب سي++ تعمل في دي دون تعديل، ولكن دي تضيف بعض الوظائف:
معلمات القوالب في دي لا تقتصر فقط على الأنواع والقيم البدائية (كما كان الحال في C++ قبل C++20)، بل تسمح أيضًا بالقيم الزمنية التي تُحسب أثناء الترجمة (مثل السلاسل النصية والتمثيلات الهيكلية)، وأسماء مستعارة (aliases) لمعرفات عشوائية، بما في ذلك القوالب الأخرى أو التخصيصات القالبية.
برمجة عامة دعم لغات البرمجة للعمومية
تستخدم القوالب في دي بناء جملة مختلفًا عن C++: بينما يتم تضمين معلمات القوالب في C++ داخل أقواس زاوية (مثل Template<param1, param2>)، يستخدم دي علامة تعجب والأقواس: Template!(param1, param2).
هذا يتجنب قالب (سي++) بسبب التضارب مع عوامل المقارنة.
إذا كان هناك معلمة واحدة فقط، يمكن الاستغناء عن الأقواس.
تقليديًا، يجمع دي بين الميزات المذكورة أعلاه لتوفير وقت التصريف باستخدام البرمجة العامة المعتمدة على السمات.
على سبيل المثال، يتم تعريف النطاق كأي نوع يفي بالتحقق الذي يتم بواسطة isInputRange، والذي يتم تعريفه كما يلي:
دالة تقبل فقط النطاقات المدخلات يمكنها بعد ذلك استخدام القالب أعلاه في قيد القالب:
بالإضافة إلى البرمجة الميتاقالبية (بالإنجليزية: template metaprogramming)، تقدم دي عدة ميزات لتمكين توليد الشيفرة أثناء الترجمة:
الجمع بين الميزات السابقة يسمح بتوليد الشيفرة بناءً على التصريحات الموجودة.
على سبيل المثال، يمكن لإطارات تسلسل دي فحص أعضاء النوع وتوليد دوال مخصصة لكل نوع مسلسلة من أجل تنفيذ التسلسل وإعادة التسلسل.
يمكن أن تشير السمات التي يعرفها المستخدم أيضًا إلى قواعد التسلسل.
برمجة عامة دعم لغات البرمجة للعمومية
يسمح تعبير import وتنفيذ الدوال أثناء الترجمة أيضًا بتنفيذ لغات مخصصة النطاق بشكل فعال.
على سبيل المثال، نظرًا لدالة تأخذ سلسلة تحتوي على قالب HTML وتُرجع كود دي المعادل، يمكن استخدامها على النحو التالي:
تعد القوالب العامة جزءًا من لغة إيفل منذ التصميم الأولي للطريقة واللغة. استخدمت المنشورات الأساسية لإيفل، مصطلح العمومية لوصف إنشاء واستخدام القوالب العامة.
يتم الإعلان عن القوالب العامة باستخدام اسم الفئة وقائمة من "المعلمات العامة الرسمية". في الشيفرة التالية، تحتوي الفئة LIST على معلمة عامة رسمية واحدة G
المعلمات العامة الرسمية هي أماكن حجز لأسماء فئات عشوائية سيتم توفيرها عند إعلان القالب العام، كما هو موضح في اشتقاقي القوالب التاليين، حيث تكون ACCOUNT وDEPOSIT هما أسماء الفئات الأخرى. تُعتبر ACCOUNT وDEPOSIT "المعلمات العامة الفعلية" حيث توفر أسماء فئات حقيقية لتحل محل G في الاستخدام الفعلي.
ضمن نظام النوع في إيفل، على الرغم من أن الفئة LIST [G] تعتبر فئة، إلا أنها لا تُعتبر نوعًا. ومع ذلك، يتم اعتبار اشتقاق قالب LIST [G] مثل LIST [ACCOUNT] نوعًا.
برمجة عامة دعم لغات البرمجة للعمومية
بالنسبة للفئة القائمة التي تم عرضها أعلاه، يمكن أن تكون المعلمة العامة الفعلية التي تحل محل G أي فئة أخرى متاحة. لتقييد مجموعة الفئات التي يمكن اختيار معلمات عامة فعلية صالحة منها، يمكن تحديد "قيد عام". في إعلان الفئة SORTED_LIST أدناه، يحدد القيد العام أن أي معلمة عامة فعلية صالحة ستكون فئة ترث من الفئة COMPARABLE. يضمن القيد العام أن عناصر SORTED_LIST يمكن فرزها بالفعل.
تم إضافة دعم للقوالب العامة، أو "الحاويات من النوع T"، إلى جافا في عام 2004 كجزء من J2SE 5.0. في جافا، يتم التحقق من القوالب العامة فقط في وقت الترجمة للتأكد من صحة الأنواع. ثم يتم إزالة معلومات النوع عبر عملية تُسمى محو النوع، للحفاظ على التوافق مع الإصدارات القديمة من آلة جافا الافتراضية، مما يجعلها غير متاحة في وقت التشغيل. على سبيل المثال، يتم تحويل List<String> إلى النوع الخام List. يقوم المترجم بإدراج التحويل في c++ لتحويل العناصر إلى نوع String عندما يتم استرجاعها من القائمة، مما يقلل من الأداء مقارنة بالتنفيذات الأخرى مثل قوالب C++.
برمجة عامة دعم لغات البرمجة للعمومية
تمت إضافة دعم للقوالب العامة كجزء من دوت نت فريموورك في نوفمبر 2005، بناءً على نموذج بحثي من مايكروسوفت بدأ في عام 1999. على الرغم من تشابهها مع القوالب العامة في جافا، إلا أن قوالب .NET لا تستخدم محو النوع،:208–209 ولكنها تنفذ القوالب كآلية من الدرجة الأولى في وقت التشغيل باستخدام إعادة التعيين. يوفر هذا الاختيار في التصميم وظيفة إضافية، مثل السماح ببرمجة انعكاسية مع الحفاظ على أنواع القوالب، والتخفيف من بعض حدود المحو (مثل عدم القدرة على إنشاء مصفوفات قوالب). هذا يعني أيضًا أنه لا يوجد تأثير في الأداء من التحويل في c++ في وقت التشغيل أو من عمليات التعبئة التي تكون عادة باهظة التكلفة. عندما يتم استخدام الأنواع الأولية والقيمية كوسائط قوالب، فإنها تحصل على تطبيقات مخصصة، مما يسمح بتنفيذ قوالب حاويات وأساليب فعالة. كما هو الحال في C++ وJava، فإن الأنواع القوالب المتداخلة مثل Dictionary<string, List<int>> هي أنواع صالحة، ومع ذلك يُنصح بتجنبها في توقيعات الأعضاء وفقًا لقواعد تحليل التصميم للرمز.
برمجة عامة دعم لغات البرمجة للعمومية
يسمح .NET بستة أنواع من القيود على أنواع القوالب باستخدام الكلمة المفتاحية where، بما في ذلك تقييد القوالب لتكون من أنواع القيم، أو أن تكون من فئة معينة، أو أن يكون لها مُنشئ، أو أن تنفذ واجهات. فيما يلي مثال مع قيد الواجهة:
تسمح طريقة MakeAtLeast() بالتعامل مع المصفوفات، مع عناصر من النوع العام T. يحدد قيد النوع في الطريقة أن الطريقة قابلة للتطبيق على أي نوع T ينفذ واجهة IComparable<T> العامة. يضمن هذا حدوث خطأ في وقت التصريف إذا تم استدعاء الطريقة إذا كان النوع لا يدعم المقارنة. توفر الواجهة الطريقة العامة CompareTo(T).
برمجة عامة دعم لغات البرمجة للعمومية
يمكن أيضًا كتابة الطريقة أعلاه بدون القوالب العامة، باستخدام ببساطة النوع غير العام Array. ومع ذلك، بما أن المصفوفات هي لاتباين وتباين مرافق وتباين معاكس، فإن التحويل لن يكون سلامة الأنماط، ولن يتمكن المترجم من العثور على بعض الأخطاء المحتملة التي سيتم اكتشافها عند استخدام القوالب العامة. بالإضافة إلى ذلك، ستحتاج الطريقة إلى الوصول إلى عناصر المصفوفة كـ object بدلاً من ذلك، وستتطلب التحويل في c++ لمقارنة عنصرين. (بالنسبة لأنواع القيم مثل int، يتطلب هذا التعبئة، على الرغم من أنه يمكن التغلب على ذلك باستخدام فئة Comparer<T>، كما هو الحال في فئات التجميع القياسية).
سلوك ملحوظ للأعضاء الثابتين في فئة .NET العامة هو التخصيص الثابت للأعضاء لكل نوع في وقت التشغيل (انظر المثال أدناه).
بالنسبة لباسكال، تم تنفيذ القوالب العامة لأول مرة في عام 2006 في تنفيذ فري باسكال.
برمجة عامة قراءة إضافية
Gibbons، Jeremy (2007). "البرمجة العامة بواسطة الأنواع". في Backhouse، R.؛ Gibbons، J.؛ Hinze، R.؛ Jeuring، J. (المحررون). المدرسة الربيعية حول البرمجة العامة بواسطة الأنواع 2006. ملاحظات المحاضرات في علوم الكمبيوتر. Heidelberg: Springer. ج. 4719. ص. 1–71. CiteSeerX:10.1.1.159.1228.
Meyer، Bertrand (1986). "البرمجة العامة مقابل الوراثة". إجراءات مؤتمر أنظمة البرمجة الكائنية، اللغات والتطبيقات - OOPSLA '86. ص. 391–405. DOI:10.1145/28697.28738. ISBN:0897912047. S2CID:285030.
برمجة عامة الوصلات الخارجية
Ralf Lämmel وسيمون بيتن جونز، "تخلص من الرتابة: نمط تصميم عملي للبرمجة العامة"، في إجراءات ورشة العمل الدولية لـ جمعية آلات الحوسبة SIGPLAN حول الأنواع في تصميم وتنفيذ اللغات (TLDI'03)، 2003. (انظر أيضًا الموقع المخصص لهذا البحث)
محراك الفرثي
محراك هو شخصية من سلالة الفرثيين، كان حاكمًا لأبرساس وجهرم في أوائل القرن الثالث. كان ابنًا لأنوشاجزاتان، وينتمي إلى عائلة يعود نسبها إلى الكيانيين. هُزِم وقُتِل في حوالي عام 1500. 222 أثناء صدام مع الملك الساساني الأول أردشير الأول (حكم 224-242). كان لمحراك ابنة اسمها جورزاد (ربما خوارزمنا [الإنجليزية])، والتي تزوجت فيما بعد ابن أردشير شابور وأنجبت له هرمزد.
عبرقواد
عبرقواد كانت منطقة فرعية في مقاطعة ميشان [الإنجليزية] الساسانية، وقد ذُكرَت في المصادر العربية.
أثناء الفتح الإسلامي لبلاد فارس ، دافع عنها رجل يدعى فيلكان. في عام 635 (أو 637) غزا الضابط العسكري العربي عتبة بن غزوان.
عبروان
عبروان هي قرية من العصر الساساني تقع في منطقة دشت بارين الريفية في التقسيم الإداري لأردشير خوار، في جنوب غرب مقاطعة فارس[الإنجليزية]. قد يكون هذا مطابقًا تمامًا للمدينة الساحلية التي تحمل الاسم نفسه، عبروان، والتي عانت بشكل ملحوظ من الغارات العربية البدوية خلال فترة حكم شابور الثاني (حكم. 309–370 م). تشتهر عبروان بأنها مسقط رأس مهر نارسه، الوزير (وزورغ فرامادار[الإنجليزية]) الساساني ليزدجرد الأول (حكم 399–420 )، وبهرام الخامس (حكم. 420–438)، ويزدجرد الثاني (حكم. 438–457) وبيروز الأول (حكم. 457–484). وقد بُنيَت العديد من المباني هناك في مهر نارسه، بما في ذلك معابد النار. كان أحد معابد النار يسمى مهرنرسيان، وكان لا يزال مشتعلًا حتى القرن الحادي عشر. كما أسس أربع قرى في جوار عبروان، حيث بُنيَت معابد النار على طول كل حديقة من بساتين النخيل والزيتون والسرو. ظلت هذه الأساسات بمثابة ملكية وراثية لأحفاد مهر نارسي حتى القرن الحادي عشر.
موقع عبروان غير مؤكد، ومن المفترض أنه يقع بين فيروز آباد وتواج.
أمغشية
أمغشية كانت مدينة أو حصنًا ساسانيًا يقع بالقرب من العاصمة اللخمية (المناذرة) السابقة الحيرة. كانت تُعرف كمقر دفاعي رئيس. في عام 633، أثناء الفتح الإسلامي لبلاد فارس، وقعت معركة في إحدى المواقع العسكرية التابعة لها، في معركة أليس، حيث هزم العرب المسلمون جيشًا مشتركًا من القوات العربية الساسانية والمسيحية. وبعد الانتصار، غُزيَت أمغشية ونُهبَت، بينما فر الناجون من المكان إلى الريف؛ ودخلها خالد بن الوليد.
كرة الهدف في الألعاب البارالمبية الصيفية 2024 - قوائم فرق الرجال
ما يلي هو قائمة تشكيلة المنتخب لكل دولة تتنافس في كرة الهدف في الألعاب البارالمبية الصيفية 2024 – بطولة الرجال في باريس.
كرة الهدف في الألعاب البارالمبية الصيفية 2024 - قوائم فرق الرجال المجموعة أ
الفريق التالي هو فريق البرازيل في بطولة كرة الهدف في الألعاب البارالمبية الصيفية 2024. تم الإعلان عن القائمة في 25 يونيو 2024.
فيما يلي قائمة منتخب فرنسا في بطولة كرة الهدف لدورة الألعاب البارالمبية الصيفية 2024.
التالي هو فريق إيران في بطولة كرة الهدف في دورة الألعاب البارالمبية الصيفية 2024.
فيما يلي تشكيلة الولايات المتحدة في بطولة كرة الهدف في الألعاب البارالمبية الصيفية 2024.
كرة الهدف في الألعاب البارالمبية الصيفية 2024 - قوائم فرق الرجال المجموعة ب
التالي هو تشكيلة الصين في دورة كرة الهدف في الألعاب البارالمبية الصيفية 2024.
التالي هو تشكيل منتخب مصر في بطولة كرة الهدف في دورة الألعاب البارالمبية الصيفية 2024.
فيما يلي تشكيلة اليابان في بطولة كرة الهدف في دورة الألعاب البارالمبية الصيفية 2024.
فريق أوكرانيا في بطولة الجولبول في دورة الألعاب البارالمبية الصيفية 2024.
كتاب المزامير
كتاب المزامير (بالإنجليزية: Psalter) هو مجلد يحتوي على سفر المزامير، وغالبًا ما يحتوي أيضًا على مواد تعبدية أخرى مجلدة معه، مثل التقويم الطقسي وطلبة القديسين. حتى ظهور كتاب الساعات في أواخر العصور الوسطى، كانت كُتُب المزامير هي الكتب الأكثر انتشارًا التي يمتلكها الأثرياء من العلمانيين. كانت تُستخدم عادة لتعلم القراءة. العديد من كُتُب المزامير كانت مزخرفة بشكل غني، وتشمل بعضًا من أروع الأمثلة الباقية لفن الكتاب في العصور الوسطى.
كتاب المزامير
المصطلح الإنجليزي (في اللغة الإنجليزية القديمة قالب:لغ-أنج، قالب:لغ-أنج) مشتق من اللاتينية الكنسية. المصطلح المصدر هو (اللاتينية: psalterium)، وهو ببساطة اسم سفر المزامير (في اللاتينية العلمانية، هو مصطلح لآلة وترية، من (الإغريقية: ψαλτήριον) psalterion).
يحتوي سفر المزامير على الجزء الأكبر من الخدمة الإلهية لـالكنيسة الرومانية الكاثوليكية.
الكتب الأخرى المرتبطة به كانت كتاب القراءات الكنسية، وكتاب الأنتيفونات، وكتاب المجيبات (Responsoriale)، وكتاب التراتيل (Hymnary).
في اللغة الإنجليزية الحديثة المتأخرة، توقف استخدام مصطلح psalter إلى حد كبير للإشارة إلى سفر المزامير (كنص كتاب من الكتاب المقدس) ويشير في الغالب إلى المجلدات المادية المخصصة التي تحتوي على هذا النص.
كتاب المزامير المسيحية الغربية
كُتُب المزامير المخصصة، المتميزة عن نسخ المزامير في أشكال أخرى، مثل كونها جزءًا من نسخة كاملة من العهد القديم، تم تطويرها لأول مرة في الغرب اللاتيني في القرن السادس في أيرلندا ومن حوالي عام 700 في القارة.
سفر مزامير أوترخت المزخرف بشكل كبير هو أحد أهم المخطوطات الكارولنجية الباقية وكان له تأثير كبير على التطور اللاحق لـالفن الأنجلوساكسوني. في العصور الوسطى، كانت كُتُب المزامير من بين الأنواع الأكثر شعبية من المخطوطات المزخرفة، ولم ينافسها إلا كُتُب الأناجيل، التي حلت محلها تدريجياً كنوع المخطوطات المختار للزخرفة الفخمة. منذ أواخر القرن الحادي عشر فصاعدًا، أصبحت منتشرة بشكل خاص - كان رجال الدين يتلون المزامير في نقاط مختلفة من الطقوس، لذلك كانت كُتُب المزامير جزءًا رئيسيًا من المعدات الطقسية في الكنائس الكبرى.
كتاب المزامير المسيحية الغربية
وجدت خطط مختلفة لترتيب المزامير في مجموعات (انظر أسفار المزامير اللاتينية). بالإضافة إلى المزامير الـ 150، غالبًا ما تضمنت كُتُب المزامير في العصور الوسطى تقويمًا، وطلبة للقديسين، وأناشيد من العهد القديم والعهد الجديد، ونصوص تعبدية أخرى. اختلف اختيار القديسين المذكورين في التقويم والطلبة بشكل كبير وغالبًا ما يمكن أن يعطي أدلة على الملكية الأصلية للمخطوطة، حيث كانت الأديرة والرعاة الخاصون يختارون القديسين الذين لهم أهمية خاصة بالنسبة لهم.