البرمجة المعيارية
تحتاج هذه المقالة إلى مصادر إضافية للتحقق . ( يونيو 2022 ) |
البرمجة المعيارية هي تقنية تصميم برمجية تؤكد على فصل وظائف البرنامج إلى وحدات مستقلة قابلة للتبديل ، بحيث تحتوي كل منها على كل ما هو ضروري لتنفيذ جانب واحد فقط أو "اهتمام" بالوظيفة المطلوبة.
تعبر واجهة الوحدة النمطية عن العناصر التي توفرها الوحدة النمطية وتتطلبها. يمكن اكتشاف العناصر المحددة في الواجهة بواسطة وحدات نمطية أخرى. يحتوي التنفيذ على الكود العامل الذي يتوافق مع العناصر المعلنة في الواجهة. ترتبط البرمجة النمطية ارتباطًا وثيقًا بالبرمجة المنظمة والبرمجة الموجهة للكائنات ، وكلها لها نفس الهدف المتمثل في تسهيل إنشاء برامج وأنظمة برمجية كبيرة عن طريق التحلل إلى أجزاء أصغر، وكلها نشأت في حوالي ستينيات القرن العشرين. في حين كان الاستخدام التاريخي لهذه المصطلحات غير متسق، فإن "البرمجة النمطية" تشير الآن إلى التحلل عالي المستوى لكود برنامج كامل إلى أجزاء: البرمجة المنظمة لاستخدام الكود منخفض المستوى لتدفق التحكم المنظم ، والبرمجة الموجهة للكائنات لاستخدام البيانات للكائنات ، وهو نوع من بنية البيانات .
في البرمجة الموجهة للكائنات، يُعرف استخدام الواجهات كنمط معماري لبناء الوحدات النمطية بالبرمجة القائمة على الواجهة . [ بحاجة لمصدر ]
تاريخ
يعود تاريخ البرمجة المعيارية، في شكل أنظمة فرعية (خاصة للإدخال والإخراج) ومكتبات البرامج، إلى أنظمة البرامج المبكرة، حيث تم استخدامها لإعادة استخدام التعليمات البرمجية . تم تطوير البرمجة المعيارية في حد ذاتها، بهدف تحقيق الوحدات النمطية، في أواخر الستينيات والسبعينيات، كنظير أوسع نطاقًا لمفهوم البرمجة المنظمة (ستينيات القرن العشرين). يعود مصطلح "البرمجة المعيارية" على الأقل إلى الندوة الوطنية حول البرمجة المعيارية، التي نظمها لاري كونستانتين في معهد المعلومات والأنظمة في يوليو 1968 ؛ وكانت المفاهيم الرئيسية الأخرى هي إخفاء المعلومات (1972) وفصل الاهتمامات (SoC، 1974).
لم يتم تضمين الوحدات النمطية في المواصفات الأصلية لـ ALGOL 68 (1968)، ولكن تم تضمينها كملحقات في التنفيذات المبكرة، ALGOL 68-R (1970) و ALGOL 68C (1970)، وتم إضفاء الطابع الرسمي عليها لاحقًا. [1] كانت إحدى اللغات الأولى المصممة منذ البداية للبرمجة المعيارية هي Modula (1975) قصيرة العمر ، بواسطة Niklaus Wirth . كانت لغة Mesa (سبعينيات القرن العشرين) من قبل Xerox PARC لغة معيارية أخرى مبكرة ، واستفاد Wirth من Mesa بالإضافة إلى Modula الأصلية في خليفتها، Modula-2 (1978)، والتي أثرت على اللغات اللاحقة، وخاصة من خلال خليفتها، Modula-3 (ثمانينيات القرن العشرين). يتزامن استخدام Modula للأسماء المؤهلة بنقطة ، مثل M.aالإشارة إلى كائن aمن وحدة نمطية M، مع التدوين للوصول إلى حقل سجل (وبالمثل بالنسبة للسمات أو طرق الكائنات)، وهو الآن منتشر على نطاق واسع، حيث يُرى في C++ و C# و Dart و Go و Java و OCaml و Python وغيرها. أصبحت البرمجة المعيارية منتشرة على نطاق واسع منذ الثمانينيات: لم تتضمن لغة باسكال الأصلية (1970) وحدات نمطية، ولكن الإصدارات اللاحقة، ولا سيما UCSD Pascal (1978) و Turbo Pascal (1983) تضمنتها في شكل "وحدات"، كما فعلت Ada المتأثرة بباسكال (1980). ظل معيار Extended Pascal ISO 10206:1990 أقرب إلى Modula2 في دعمه المعياري. يحتوي Standard ML (1984) [2] على أحد أكثر أنظمة الوحدات النمطية اكتمالاً، بما في ذلك المتغير (الوحدات النمطية ذات المعلمات) للتعيين بين الوحدات النمطية.
في الثمانينيات والتسعينيات، طغت البرمجة المعيارية على البرمجة الموجهة للكائنات ، وغالبًا ما تم الخلط بينها وبينها ، وخاصةً بسبب شعبية لغتي C++ وJava. على سبيل المثال، كانت عائلة لغات C تدعم الكائنات والفئات في لغة C++ (في الأصل لغة C مع Classes ، عام 1980) ولغة Objective-C (عام 1983)، ولم تدعم الوحدات النمطية إلا بعد 30 عامًا أو أكثر. تدعم لغة Java (عام 1995) الوحدات النمطية في شكل حزم، على الرغم من أن الوحدة الأساسية لتنظيم التعليمات البرمجية هي الفئة. ومع ذلك، استخدمت لغة Python (عام 1991) كلًا من الوحدات النمطية والكائنات بشكل بارز منذ البداية، باستخدام الوحدات النمطية كوحدة أساسية لتنظيم التعليمات البرمجية و"الحزم" كوحدة أكبر نطاقًا؛ وتتضمن لغة Perl 5 (عام 1994) دعمًا لكل من الوحدات النمطية والكائنات، مع توفر مجموعة كبيرة من الوحدات النمطية من CPAN (عام 1993). وتبعت لغة OCaml (عام 1996) التعلم الآلي من خلال دعم الوحدات النمطية والمتراكبات.
أصبحت البرمجة المعيارية منتشرة على نطاق واسع الآن، وتوجد في كل اللغات الرئيسية تقريبًا التي تم تطويرها منذ تسعينيات القرن العشرين. وتختلف الأهمية النسبية للوحدات النمطية بين اللغات، وفي اللغات الموجهة للكائنات القائمة على الفئات لا يزال هناك تداخل وارتباك مع الفئات كوحدة تنظيم وتغليف، ولكن كلاهما راسخان كمفهومين متميزين.
مصطلحات
يُستخدم مصطلح التجميع (كما في لغات .NET مثل C# أو F# أو Visual Basic .NET ) أو الحزمة (كما في Dart أو Go أو Java ) أحيانًا بدلاً من الوحدة النمطية . في تطبيقات أخرى، تكون هذه مفاهيم مميزة؛ في Python، الحزمة عبارة عن مجموعة من الوحدات النمطية، بينما في Java 9 تم تنفيذ مفهوم الوحدة النمطية الجديد (مجموعة من الحزم ذات التحكم المحسن في الوصول).
علاوة على ذلك، فإن مصطلح "الحزمة" له استخدامات أخرى في البرمجيات (على سبيل المثال حزم .NET NuGet ). المكون هو مفهوم مشابه، لكنه يشير عادةً إلى مستوى أعلى؛ المكون هو جزء من نظام كامل ، بينما الوحدة هي جزء من برنامج فردي. يختلف مقياس مصطلح "الوحدة" بشكل كبير بين اللغات؛ في بايثون يكون صغير الحجم للغاية وكل ملف هو وحدة، بينما في جافا 9 من المخطط أن يكون واسع النطاق، حيث الوحدة هي مجموعة من الحزم، والتي هي بدورها مجموعات من الملفات.
تشمل المصطلحات الأخرى للوحدات النمطية الوحدة ، والتي تستخدم في لهجات باسكال .
دعم اللغة
اللغات التي تدعم مفهوم الوحدة رسميًا تشمل Ada و ALGOL و BlitzMax و C++ و C# و Clojure و COBOL و Common Lisp و D و Dart وeC و Erlang و Elixir و Elm و F و F# و Fortran و Go و Haskell و IBM/360 Assembler و Control Language (CL) و IBM RPG و Java و [a] Julia و MATLAB و ML و Modula و Modula-2 و Modula-3 وMorpho و NEOP و Oberon و Oberon-2 و Objective-C و OCaml والعديد من مشتقات باسكال ( Component Pascal و Object Pascal و Turbo Pascal و UCSD Pascal ) و Perl و PHP و PL/I و PureBasic و Python و R و Ruby و [4] Rust ، JavaScript ، [5] Visual Basic (.NET) و WebDNA .
من الأمثلة البارزة للغات التي تفتقر إلى دعم الوحدات النمطية هي C وكانت C++ وPascal في شكلهما الأصلي، ومع ذلك، تسمح C و C++ بتحديد واجهات تجميع وإعلان منفصلة باستخدام ملفات الرأس . تمت إضافة الوحدات النمطية إلى Objective-C في iOS 7 (2013)؛ إلى C++ مع C++20 ، [6] وتم استبدال Pascal بـ Modula و Oberon ، والتي تضمنت وحدات نمطية منذ البداية، ومشتقات مختلفة تضمنت وحدات نمطية. تحتوي JavaScript على وحدات نمطية أصلية منذ ECMAScript 2015.
يمكن تنفيذ البرمجة المعيارية حتى في الحالات التي تفتقر فيها لغة البرمجة إلى ميزات نحوية صريحة لدعم الوحدات النمطية المسماة، كما هو الحال في لغة C على سبيل المثال. ويتم ذلك باستخدام ميزات اللغة الموجودة، جنبًا إلى جنب مع، على سبيل المثال، اتفاقيات الترميز ، وعبارات البرمجة ، وبنية الكود المادية. يستخدم IBM i أيضًا الوحدات النمطية عند البرمجة في بيئة اللغة المتكاملة (ILE).
الجوانب الرئيسية
في البرمجة المعيارية، يتم فصل الاهتمامات بحيث تؤدي الوحدات وظائف منفصلة منطقيًا، وتتفاعل من خلال واجهات محددة جيدًا. غالبًا ما تشكل الوحدات رسمًا بيانيًا غير دوري موجه (DAG)؛ في هذه الحالة، يُنظر إلى التبعية الدورية بين الوحدات على أنها تشير إلى أن هذه يجب أن تكون وحدة واحدة. في حالة تشكيل الوحدات رسمًا بيانيًا غير دوري موجه، يمكن ترتيبها كتسلسل هرمي، حيث تكون الوحدات ذات المستوى الأدنى مستقلة، ولا تعتمد على أي وحدات أخرى، وتعتمد الوحدات ذات المستوى الأعلى على الوحدات ذات المستوى الأدنى. يعد البرنامج أو المكتبة المعينة وحدة ذات مستوى أعلى من التسلسل الهرمي الخاص بها، ولكن يمكن اعتبارها بدورها وحدة ذات مستوى أدنى لبرنامج أو مكتبة أو نظام أعلى مستوى.
عند إنشاء نظام معياري، بدلاً من إنشاء تطبيق مترابط (حيث يكون أصغر مكون هو الكل)، تتم كتابة عدة وحدات أصغر بشكل منفصل بحيث عندما يتم تأليفها معًا، فإنها تقوم بإنشاء برنامج التطبيق القابل للتنفيذ. عادةً، يتم تجميعها أيضًا بشكل منفصل، عبر تجميع منفصل، ثم ربطها بواسطة رابط . قد يقوم المترجم الفوري ببعض هذا البناء "أثناء التشغيل" في وقت التشغيل .
تُصنف هذه الوظائف المستقلة عادةً على أنها إما وظائف تحكم في البرنامج أو وظائف مهام محددة. صُممت وظائف التحكم في البرنامج للعمل في برنامج واحد. يتم إعداد وظائف المهام المحددة بشكل وثيق لتكون قابلة للتطبيق في برامج مختلفة.
وهذا يجعل الأنظمة المصممة على شكل وحدات، إذا تم بناؤها بشكل صحيح، أكثر قابلية لإعادة الاستخدام من التصميم المتجانس التقليدي، حيث يمكن إعادة استخدام كل (أو العديد من) هذه الوحدات (دون تغيير) في مشاريع أخرى. وهذا يسهل أيضًا "تقسيم" المشاريع إلى عدة مشاريع أصغر. من الناحية النظرية، سيكون من الأسهل تجميع مشروع برمجي على شكل وحدات بواسطة فرق كبيرة، حيث لا يقوم أي من أعضاء الفريق بإنشاء النظام بأكمله، أو حتى يحتاجون إلى معرفة النظام ككل. يمكنهم التركيز فقط على المهمة الأصغر المخصصة.
انظر أيضا
- لغة وصف العمارة – لغة رسمية لوصف العمارة وتمثيلها
- التماسك (علوم الكمبيوتر) - الدرجة التي تنتمي بها العناصر داخل الوحدة إلى بعضها البعض
- هندسة البرمجيات القائمة على المكونات – هندسة تركز على بناء البرمجيات من مكونات قابلة لإعادة الاستخدام
- قانون كونواي – حكمة تربط بين التنظيم وبنية النظام
- الاقتران (علوم الكمبيوتر) - درجة الترابط بين وحدات البرمجيات
- ديفيد بارناس – مهندس برمجيات كندي
- إخفاء المعلومات – مبدأ تصميم برامج الكمبيوتر (التغليف)
- المكتبة (الحوسبة) - مجموعة من الموارد المستخدمة لتطوير برنامج كمبيوتر
- قائمة سمات جودة النظام - المتطلبات غير الوظيفية لتقييم النظام
- التصميم المعياري – نهج التصميم
- المكون الإضافي (الحوسبة) - مكون برمجي يضيف ميزة معينة إلى تطبيق برمجي موجود
- المقطع (البرمجة) - منطقة صغيرة من الكود المصدري القابل لإعادة الاستخدام أو الكود الآلي أو النص
- التحليل المنظم – طريقة لتحليل وتحويل متطلبات العمل الخاصة بمشروع ما إلى مواصفات وظيفية لتصوره وتنفيذه ومراقبته
- البرمجة المنظمة – نموذج البرمجة المبني على تدفق التحكم
ملحوظات
- ^ يُستخدم مصطلح "الحزمة" للإشارة إلى نظير الوحدات النمطية في JLS؛ [3] — انظر حزمة Java . " الوحدات النمطية "، وهي نوع من مجموعة الحزم، مخطط لها في Java 9 كجزء من Project Jigsaw؛ كانت تسمى في وقت سابق "الحزم الفائقة" ومخطط لها في Java 7.
مراجع
- ^ ليندسي، تشارلز هـ. (فبراير 1976). "اقتراح لإنشاء مرفق وحدات في ALGOL 68" (PDF) . نشرة ALGOL (39): 20–29. مؤرشف من الأصل (PDF) في 2016-03-03 . تم الاسترجاع في 2014-12-01 .
- ^ ديفيد ماكوين (أغسطس 1984). "وحدات التعلم الآلي القياسية". وقائع ندوة رابطة آلات الحوسبة الأمريكية لعام 1984 حول لغة LISP والبرمجة الوظيفية . ص 198-207. doi :10.1145/800055.802036.
- ^ جيمس جوسلينج، بيل جوي، جاي ستيل، جيلاد براشا، مواصفات لغة جافا، الطبعة الثالثة ، رقم ISBN 0-321-24678-0 ، 2005. في المقدمة، ورد "يصف الفصل 7 بنية البرنامج، والتي يتم تنظيمها في حزم مماثلة لوحدات Modula". كلمة "module" ليس لها معنى خاص في Java.
- ^ "الفئة: الوحدة النمطية (Ruby 2.0.0)".
- ^ مواصفات لغة ECMAScript® 2015، 15.2 وحدة
- ^ "N4720: مسودة عمل، ملحقات C++ للوحدات النمطية" (PDF) .
روابط خارجية
- كيفية تحليل النظام إلى وحدات
- منصة SMC
