البرمجة المعيارية

البرمجة المعيارية هي نموذج برمجة يركز على تنظيم وظائف قاعدة التعليمات البرمجية في وحدات مستقلة ، حيث توفر كل وحدة جانبًا من برنامج الكمبيوتر بالكامل دون توفير جوانب أخرى.

تُعبّر واجهة الوحدة عن العناصر التي توفرها الوحدة وتتطلبها. ويمكن للوحدات الأخرى اكتشاف هذه العناصر المُعرّفة في الواجهة. ويحتوي التنفيذ على الشيفرة البرمجية التي تُطابق العناصر المُعلنة في الواجهة.

تاريخ

يعود مفهوم البرمجة المعيارية، في شكل أنظمة فرعية (خاصةً للإدخال والإخراج) ومكتبات برمجية، إلى بدايات أنظمة البرمجيات، حيث استُخدم لإعادة استخدام الشيفرة . أما البرمجة المعيارية بحد ذاتها، بهدف تحقيق المعيارية، فقد طُوّرت في أواخر الستينيات والسبعينيات، كنموذج أوسع نطاقًا لمفهوم البرمجة الهيكلية (الستينيات). ويعود مصطلح "البرمجة المعيارية" على الأقل إلى الندوة الوطنية حول البرمجة المعيارية، التي نظّمها لاري كونستانتين في معهد المعلومات والأنظمة في يوليو 1968 ؛ ومن المفاهيم الأساسية الأخرى إخفاء المعلومات (1972) وفصل الاهتمامات (SoC، 1974).

لم تُدرج الوحدات النمطية في المواصفات الأصلية للغة ALGOL 68 (1968)، ولكنها أُضيفت كامتدادات في الإصدارات المبكرة، ALGOL 68-R (1970) و ALGOL 68C (1970)، ثم جرى توثيقها لاحقًا. [ 1 ] كانت لغة Modula (1975)، التي طورها نيكلاوس ويرث ، من أوائل اللغات المصممة خصيصًا للبرمجة النمطية . ومن اللغات النمطية المبكرة الأخرى لغة Mesa (السبعينيات)، التي طورتها شركة Xerox PARC ، وقد استعان ويرث بلغة 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++ وجافا. فعلى سبيل المثال، دعمت لغات عائلة C الكائنات والفئات في C++ (التي كانت تُعرف سابقًا باسم C with Classes ، عام 1980) وObjective-C (عام 1983)، ولم تدعم الوحدات النمطية إلا بعد مرور ثلاثين عامًا أو أكثر. تدعم جافا (عام 1995) الوحدات النمطية على شكل حزم ، مع أن الوحدة الأساسية لتنظيم الشيفرة هي الفئة. أما بايثون (عام 1991) فقد استخدمت الوحدات النمطية والكائنات معًا منذ البداية، حيث اعتمدت الوحدات النمطية كوحدة أساسية لتنظيم الشيفرة، والحزم كوحدة أوسع نطاقًا. كما يدعم بيرل 5 (عام 1994) كلاً من الوحدات النمطية والكائنات، مع توفر مجموعة واسعة من الوحدات النمطية من CPAN (عام 1993). وتبعت OCaml (عام 1996) لغة ML بدعمها للوحدات النمطية والدوال.

أصبحت البرمجة المعيارية منتشرة على نطاق واسع، وتوجد في جميع اللغات الرئيسية تقريبًا التي تم تطويرها منذ التسعينيات. تختلف الأهمية النسبية للوحدات بين اللغات، وفي لغات البرمجة الكائنية الموجهة القائمة على الفئات، لا يزال هناك تداخل والتباس مع الفئات كوحدة تنظيم وتغليف، لكن كليهما راسخ كمفهومين متميزين.

مصطلحات

يُستخدم مصطلح " التجميع" (كما في لغات .NET مثل C# و F# و Visual Basic ) أو "الحزمة" (كما في Dart و Go و Java ) أحيانًا بدلًا من "الوحدة" . في تطبيقات أخرى، تُعتبر هذه مفاهيم متميزة؛ ففي بايثون، الحزمة عبارة عن مجموعة من الوحدات، بينما في Java 9 ، مع تقديم نظام وحدات منصة Java ، تم تطبيق مفهوم جديد للوحدات، يتضمن مجموعة من الحزم ذات تحكم مُحسّن في الوصول. (هذه الحزم تختلف عن أنواع الحزم الأخرى في البرمجيات، مثل حزم إدارة الحزم ).

في لغة جافا ، يُستخدم مصطلح " الحزمة" للإشارة إلى مفهوم "الوحدة" في مواصفات لغة جافا. [ 3 ] وقد تم تقديم الوحدة ، وهي نوع من أنواع مجموعات الحزم، في جافا 9 .

في بعض لهجات لغة باسكال ، يُستخدم مصطلح الوحدة للدلالة على مفهوم الوحدة النمطية.

المكون مفهوم مشابه، لكنه يشير عادةً إلى مستوى أعلى؛ فالمكون جزء من نظام كامل ، بينما الوحدة جزء من برنامج فردي. يختلف نطاق مصطلح "الوحدة" اختلافًا كبيرًا بين اللغات؛ ففي بايثون يكون النطاق صغيرًا جدًا، وكل ملف وحدة، بينما في جافا 9 يكون النطاق واسعًا، حيث الوحدة عبارة عن مجموعة من الحزم، والتي بدورها عبارة عن مجموعات من الملفات.

الدعم اللغوي

تشمل اللغات التي تدعم مفهوم الوحدة النمطية رسميًا: Ada ، ALGOL ، BlitzMax ، C++ ، C# ، Clojure ، COBOL ، Common Lisp ، D ، Dart ، eC، Erlang ، Elixir ، Elm ، F ، F# ، Fortran ، Go ، Haskell ، IBM/360 Assembler ، IBM System/38 و AS/400 Control Language (CL)، IBM RPG ، Java ، Julia ، MATLAB ، ML ، Modula ، Modula-2 ، Modula-3 ، Morpho، NEWP ، Oberon ، Oberon-2 ، Objective-C ، OCaml ، والعديد من مشتقات Pascal ( Component Pascal ، Object Pascal ، Turbo Pascal ، UCSD PascalPerl ، PHP ، PL/I ، PureBasic ، Python ، R ، روبي ، [ 4 ] رست ، جافا سكريبت ، [ 5 ] فيجوال بيسك (.NET) و WebDNA.

من الأمثلة البارزة على اللغات التي تفتقر إلى دعم الوحدات النمطية لغة C ، ولغتي C++ وباسكال في صيغتيهما الأصليتين. مع ذلك، تسمح لغتا C وC++ بتحديد واجهات تجميع وتصريح منفصلة باستخدام ملفات الرأس ، وهو ما يُعرف عادةً بالنمذجة النمطية. أُضيفت الوحدات النمطية إلى لغة Objective-C في نظام iOS 7 (2013)، وإلى لغة C++ مع إصدار C++20 . [ 6 ] حلت لغتا Modula و Oberon محل لغة باسكال ، حيث تضمنت الوحدات النمطية منذ البداية، بالإضافة إلى العديد من المشتقات التي تضمنت الوحدات النمطية. تدعم لغة JavaScript الوحدات النمطية الأصلية منذ إصدار ECMAScript 2015. سمحت وحدات C++ بالتوافق مع الإصدارات السابقة من ملفات الرأس (باستخدام "وحدات الرأس"). تسمح لهجات لغة C بالوحدات النمطية، فعلى سبيل المثال، يدعم Clang الوحدات النمطية للغة C ، [ 7 ] على الرغم من اختلاف بناء الجملة ودلالات وحدات Clang C عن وحدات C++.

يمكن تنفيذ البرمجة المعيارية حتى في حال افتقار لغة البرمجة إلى ميزات نحوية صريحة لدعم الوحدات المسماة، كما هو الحال في لغة C على سبيل المثال. ويتم ذلك باستخدام ميزات اللغة الموجودة، بالإضافة إلى، على سبيل المثال، اصطلاحات الترميز ، وأساليب البرمجة ، وبنية الكود الفيزيائية. كما يستخدم نظام IBM i الوحدات عند البرمجة في بيئة اللغة المتكاملة (ILE).

الجوانب الرئيسية

في البرمجة المعيارية، تُفصل الوظائف بحيث تؤدي الوحدات وظائف منفصلة منطقيًا، وتتفاعل فيما بينها عبر واجهات محددة جيدًا. غالبًا ما تُشكل الوحدات رسمًا بيانيًا موجهًا غير دوري (DAG)؛ وفي هذه الحالة، يُنظر إلى التبعية الدورية بين الوحدات على أنها مؤشر على أنها يجب أن تكون وحدة واحدة. في حالة تشكيل الوحدات لرسم بياني موجه غير دوري، يمكن ترتيبها على شكل تسلسل هرمي، حيث تكون الوحدات ذات المستوى الأدنى مستقلة، ولا تعتمد على أي وحدات أخرى، بينما تعتمد الوحدات ذات المستوى الأعلى على الوحدات ذات المستوى الأدنى. يُعد برنامج أو مكتبة معينة وحدةً من المستوى الأعلى في تسلسلها الهرمي الخاص، ولكن يمكن بدورها اعتبارها وحدةً من المستوى الأدنى لبرنامج أو مكتبة أو نظام ذي مستوى أعلى.

عند إنشاء نظام معياري، بدلاً من إنشاء تطبيق متجانس (حيث يكون أصغر مكون هو النظام بأكمله)، تُكتب عدة وحدات أصغر بشكل منفصل، بحيث تُشكّل عند تجميعها معًا برنامج التطبيق القابل للتنفيذ. عادةً، تُجمّع هذه الوحدات بشكل منفصل، عبر عملية تجميع منفصلة ، ​​ثم تُربط بواسطة رابط . قد يُنفّذ مُجمّع فوري بعضًا من هذا البناء "أثناء التشغيل " .

تُصنّف هذه الوظائف المستقلة عادةً إلى نوعين: وظائف التحكم بالبرنامج ووظائف المهام المحددة. صُممت وظائف التحكم بالبرنامج للعمل مع برنامج واحد، بينما صُممت وظائف المهام المحددة لتكون قابلة للتطبيق على برامج متعددة.

يجعل هذا التصميم المعياري الأنظمة، إذا تم بناؤها بشكل صحيح، قابلة لإعادة الاستخدام بشكل أكبر بكثير من التصميم المتجانس التقليدي، حيث يمكن إعادة استخدام جميع هذه الوحدات (أو معظمها) (دون تغيير) في مشاريع أخرى. كما يُسهّل هذا تقسيم المشاريع إلى عدة مشاريع أصغر. نظريًا، سيكون تجميع مشروع برمجي معياري أسهل بكثير من قِبل فرق كبيرة، حيث لا يقوم أي من أعضاء الفريق بإنشاء النظام بأكمله، أو حتى يحتاج إلى معرفة النظام ككل. يمكنهم التركيز فقط على المهمة الأصغر الموكلة إليهم.

انظر أيضاً

مراجع

  1. ليندسي، تشارلز هـ. (فبراير 1976). "مقترح لإنشاء وحدة وحدات في لغة ALGOL 68" (ملف PDF) . نشرة ALGOL (39): 20-29 . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 3 مارس 2016. تم الاطلاع عليه بتاريخ 1 ديسمبر 2014 .
  2. ديفيد ماكوين (أغسطس 1984). "وحدات نمطية للغة ML القياسية" . وقائع ندوة ACM لعام 1984 حول لغة LISP والبرمجة الوظيفية . الصفحات 198-207 . doi : 10.1145/800055.802036 . 
  3. جيمس جوسلينج ؛ بيل جوي ؛ جاي ستيل ؛ جلعاد براخا (2005). مواصفات لغة جافا، الطبعة الثالثة . ISBN 0-321-24678-0.في المقدمة، ورد أن "الفصل السابع يصف بنية البرنامج، والتي يتم تنظيمها في حزم مشابهة لوحدات Modula." كلمة " وحدة " ليس لها معنى خاص في لغة جافا.
  4. "class Module - Documentation for Ruby 3.5" .
  5. مواصفات لغة ECMAScript® 2015، 15.2 الوحدات
  6. "N4720: مسودة عمل، امتدادات إلى C++ للوحدات النمطية" (PDF) .
  7. "الوحدات" . clang.llvm.org .