نظام النوع البنيوي الفرعي
تُعدّ أنظمة الأنواع البنيوية الفرعية عائلة من أنظمة الأنواع تُشابه المنطق البنيوي الفرعي، حيث يغيب واحد أو أكثر من القواعد البنيوية أو يُسمح بها فقط في ظروف مُتحكّم بها. تستطيع هذه الأنظمة تقييد الوصول إلى موارد النظام ، مثل الملفات والأقفال والذاكرة، من خلال تتبّع تغييرات الحالة ومنع الحالات غير الصالحة. [ 1 ] : 4
أنظمة أنواع البنية الفرعية المختلفة
ظهرت العديد من أنظمة الأنواع من خلال التخلي عن بعض القواعد الهيكلية للتبادل والضعف والانكماش:
| أنظمة الكتابة | تبادل | الضعف | انقباض | يستخدم |
|---|---|---|---|---|
| تم الطلب | غير متوفر | غير متوفر | غير متوفر | مرة واحدة بالضبط، بالترتيب الذي تم تقديمه به |
| خطي | مسموح | غير متوفر | غير متوفر | مرة واحدة بالضبط |
| أفين | مسموح | مسموح | غير متوفر | مرة واحدة على الأكثر [ أ ] |
| مناسب | مسموح | غير متوفر | مسموح | مرة واحدة على الأقل |
| طبيعي | مسموح | مسموح | مسموح | بشكل تعسفي [ ب ] |
نظام الكتابة المرتب
تُقابل الأنواع المرتبة منطقًا غير تبادلي حيث يتم تجاهل التبادل والانكماش والتضعيف. يمكن استخدام هذا لنمذجة تخصيص الذاكرة القائم على المكدس (على عكس الأنواع الخطية التي يمكن استخدامها لنمذجة تخصيص الذاكرة القائم على الكومة ). [ 1 ] : 30-31 بدون خاصية التبادل، لا يمكن استخدام الكائن إلا عندما يكون في أعلى المكدس المُنمذج، وبعد ذلك يتم إزالته، مما يؤدي إلى استخدام كل متغير مرة واحدة فقط بالترتيب الذي تم إدخاله به.
أنظمة من النوع الخطي
تتوافق الأنواع الخطية مع المنطق الخطي وتضمن استخدام الكائنات مرة واحدة فقط. وهذا يسمح للنظام بإلغاء تخصيص الكائن بأمان بعد استخدامه، [ 1 ] : 6 أو تصميم واجهات برمجية تضمن عدم إمكانية استخدام مورد ما بمجرد إغلاقه أو نقله إلى حالة مختلفة. [ 2 ]
تستخدم لغة البرمجة Clean أنواع التفرد (وهي نوع من أنواع البيانات الخطية) لدعم التزامن، والإدخال/الإخراج ، والتحديث الموضعي للمصفوفات . [ 1 ] : 43
تسمح أنظمة الأنواع الخطية بالمراجع، لكنها لا تسمح بالأسماء المستعارة . ولفرض ذلك، يخرج المرجع من نطاق التعريف بعد ظهوره على الجانب الأيمن من عملية الإسناد ، مما يضمن وجود مرجع واحد فقط لأي كائن في الوقت نفسه. تجدر الإشارة إلى أن تمرير مرجع كوسيط إلى دالة يُعدّ شكلاً من أشكال الإسناد، حيث سيتم إسناد القيمة داخل الدالة إلى وسيط الدالة، وبالتالي فإن استخدام المرجع بهذه الطريقة يؤدي أيضًا إلى خروجه من نطاق التعريف.
تُتيح خاصية المرجع الواحد لأنظمة الأنواع الخطية أن تكون لغات برمجة مناسبة للحوسبة الكمومية ، إذ تعكس نظرية عدم الاستنساخ للحالات الكمومية. من منظور نظرية الفئات ، تعني نظرية عدم الاستنساخ عدم وجود دالة قطرية قادرة على تكرار الحالات؛ وبالمثل، من منظور المنطق التوافقي ، لا يوجد مُركِّب K قادر على تدمير الحالات. من منظور حساب لامداx ، يمكن أن يظهر المتغير مرة واحدة فقط في الحد. [ 3 ]
تُعدّ أنظمة الأنواع الخطية اللغة الداخلية للفئات الأحادية المتناظرة المغلقة ، تمامًا كما يُعدّ حساب لامدا ذو الأنواع البسيطة لغةً للفئات الديكارتية المغلقة . وبشكل أدق، يمكن إنشاء دوال بين فئة أنظمة الأنواع الخطية وفئة الفئات الأحادية المتناظرة المغلقة. [ 4 ]
أنظمة النوع الأفيني
تُعدّ الأنواع الخطية نوعًا من الأنواع الخطية التي تسمح بتجاهل مورد ما (أي عدم استخدامه )، وهو ما يتوافق مع المنطق الخطي . يمكن استخدام المورد الخطي مرة واحدة على الأكثر ، بينما يجب استخدام المورد الخطي مرة واحدة فقط .
أنظمة الأنواع ذات الصلة
تتوافق الأنواع ذات الصلة مع المنطق ذي الصلة الذي يسمح بالتبادل والانكماش، ولكن ليس الإضعاف، وهو ما يترجم إلى استخدام كل متغير مرة واحدة على الأقل.
تفسير الموارد
تُعدّ المصطلحات التي توفرها أنظمة الأنواع الفرعية مفيدةً لتوصيف جوانب إدارة الموارد في اللغة. إدارة الموارد هي جانب من جوانب أمان اللغة، وهي تُعنى بضمان تحرير كل مورد مُخصّص مرة واحدة فقط. وبالتالي، يقتصر تفسير الموارد على الاستخدامات التي تنقل الملكية - أي نقلها - حيث تُمثّل الملكية مسؤولية تحرير المورد.
الاستخدامات التي لا تنقل الملكية - الاقتراض - ليست ضمن نطاق هذا التفسير، ولكن دلالات العمر الافتراضي تقيد هذه الاستخدامات بشكل أكبر لتكون بين التخصيص وإلغاء التخصيص.
| يكتب | خطوة التبرؤ | خطوة إلزامية | تحديد كمية الحركة | آلة حالة استدعاء الدالة القابلة للتنفيذ |
|---|---|---|---|---|
| طبيعي | لا | لا | أي عدد من المرات | الترتيب الطوبولوجي |
| أفين | نعم | لا | مرة واحدة على الأكثر | الطلب |
| خطي | نعم | نعم | مرة واحدة بالضبط | الطلب والإنجاز |
أنواع ذات صلة بالموارد
وفقًا لتفسير الموارد، لا يمكن إنفاق نوع affine أكثر من مرة.
على سبيل المثال، يمكن التعبير عن نفس صيغة آلة البيع الخاصة بهوار باللغة الإنجليزية والمنطق ولغة رست :
| إنجليزي | منطق | الصدأ |
|---|---|---|
| يمكنك شراء قطعة حلوى أو مشروب بعملة معدنية، أو قد تخرج عن نطاق البحث. | عملة معدنية ⊸ عملة حلوى ⊸ عملة مشروب ⊸ ⊤ | دالة شراء الحلوى ( _ : عملة ) -> حلوى { حلوى {} } دالة شراء الشراب ( _ : عملة ) -> شراب { شراب {} } |
ما يعنيه أن يكون نوع Coin نوعاً خطياً في هذا المثال (وهو كذلك ما لم يطبق سمة Copy ) هو أن محاولة إنفاق نفس العملة مرتين هو برنامج غير صالح يحق للمترجم رفضه:
let coin = Coin {}; let candy = buy_candy ( coin ); // ينتهي عمر متغير coin هنا. let drink = buy_drink ( coin ); // خطأ في الترجمة: استخدام متغير منقول لا يمتلك خاصية النسخ.بمعنى آخر، يمكن لنظام الأنواع الخطي التعبير عن نمط حالة النوع : إذ يمكن للدوال استهلاك كائن وإرجاعه مُغلّفًا بأنواع مختلفة، ما يُشبه انتقالات الحالة في آلة حالة تُخزّن حالتها كنوع في سياق المُستدعي - حالة النوع . ويمكن لواجهة برمجة التطبيقات استغلال ذلك لفرض استدعاء دوالها بالترتيب الصحيح بشكل ثابت.
لكن هذا لا يعني أنه لا يمكن استخدام متغير دون استهلاكه بالكامل:
// هذه الدالة تستعير عملة معدنية فقط: علامة العطف (&) تعني الاستعارة. fn validate ( _ : & Coin ) -> Result < (), () > { Ok (()) }// يمكن استخدام متغير العملة نفسه عددًا لا نهائيًا من المرات // طالما لم يتم نقله. let coin = Coin {}; loop { validate ( & coin ) ? ; }ما لا يستطيع Rust التعبير عنه هو نوع عملة لا يمكن أن يخرج عن النطاق - وهذا يتطلب نوعًا خطيًا.
أنواع الموارد الخطية
في إطار تفسير الموارد، لا يمكن نقل النوع الخطي فحسب ، مثل النوع الأفيني، بل يجب نقله - الخروج عن النطاق هو برنامج غير صالح.
{ // يجب تمريرها، لا حذفها. let token = HotPotato {};// لنفترض أن بعض الفروع لا تتخلص منه: إذا لم تكن قائمة الانتظار ممتلئة ، فأضف الرمز المميز إليها .// خطأ في الترجمة: الاحتفاظ بكائن غير قابل للإسقاط عند انتهاء النطاق. }من مزايا الأنواع الخطية أن الدوال المدمرة تصبح دوالًا عادية يمكنها استقبال وسائط، ويمكن أن تفشل، وما إلى ذلك. [ 5 ] وهذا قد يُغني، على سبيل المثال، عن الحاجة إلى الاحتفاظ بحالة تُستخدم فقط للتدمير. ومن المزايا العامة لتمرير تبعيات الدوال بشكل صريح أن ترتيب استدعاء الدوال - أي ترتيب التدمير - يصبح قابلاً للتحقق بشكل ثابت من خلال دورات حياة الوسائط. وبالمقارنة مع المراجع الداخلية، لا يتطلب هذا تحديد دورات الحياة كما هو الحال في لغة Rust.
كما هو الحال مع إدارة الموارد اليدوية، تكمن إحدى المشكلات العملية في أن أي عملية إرجاع مبكرة ، كما هو معتاد في معالجة الأخطاء، يجب أن تحقق نفس عملية التنظيف. يصبح هذا الأمر دقيقًا للغاية في اللغات التي تدعم فكّ تكديس الذاكرة، حيث يُمثّل كل استدعاء دالة إرجاعًا مبكرًا محتملاً. مع ذلك، وعلى سبيل المثال، يمكن استعادة دلالة استدعاءات المُدمِّر المُدرجة ضمنيًا باستخدام استدعاءات الدوال المؤجلة. [ 6 ]
أنواع الموارد العادية
وفقًا لتفسير الموارد، لا يقيّد النوع العادي عدد مرات نقل المتغير. وتندرج لغة C++ (وتحديدًا دلالات النقل غير المتلف) ضمن هذه الفئة.
auto coin = std :: unique_ptr <Coin> ( ); auto candy = buy_candy ( std :: move ( coin )); auto drink = buy_drink ( std :: move ( coin )); // هذا صحيح في لغة C++ .لغات البرمجة
تدعم لغات البرمجة التالية الأنواع الخطية أو الأفينية :
انظر أيضاً
ملحوظات
مراجع
- 1 2 3 4 ووكر، ديفيد (2002). "أنظمة الأنواع الفرعية". في بيرس، بنجامين سي. (محرر). مواضيع متقدمة في الأنواع ولغات البرمجة (ملف PDF) . مطبعة معهد ماساتشوستس للتكنولوجيا. الصفحات 3-43 . ISBN 0-262-16228-8.
- ↑ برناردي، جان فيليب؛ بوسبفلوغ، ماثيو؛ نيوتن، رايان ر؛ بيتون جونز، سيمون ؛ سبيواك، أرنو (2017). "هاسكل الخطية: الخطية العملية في لغة متعددة الأشكال من الرتبة العليا" . وقائع مؤتمر ACM للغات البرمجة . 2 : 1-29 . arXiv : 1710.09756 . doi : 10.1145/3158093 . S2CID 9019395 .
- ↑ بايز، جون سي؛ ستاي، مايك (2010). "الفيزياء، والطوبولوجيا، والمنطق، والحوسبة: حجر رشيد". في سبرينغر (محرر). هياكل جديدة للفيزياء (ملف PDF) . الصفحات 95-174 .
- ↑ أمبلر، س. (1991). منطق الرتبة الأولى في الفئات المغلقة المونيدية المتناظرة (أطروحة دكتوراه). جامعة إدنبرة.
- ↑ "رؤية فال" . تم الاطلاع عليه في 6 ديسمبر 2023.
RAII الأعلى، وهو شكل من أشكال الكتابة الخطية التي تُمكّن من استخدام المُدمِّرات ذات المعاملات والقيم المُعادة
. - ↑ "الاستعانة بالمثال: التأجيل" . تم الاطلاع عليه بتاريخ 5 ديسمبر 2023.
يُستخدم التأجيل لضمان تنفيذ استدعاء دالة ما في وقت لاحق من تنفيذ البرنامج، عادةً لأغراض التنظيف. غالبًا ما يُستخدم التأجيل في مواضع
تُستخدم فيها عبارات مثل `
ensure`
و`
finally` في لغات برمجة أخرى.
- ↑ "6.4.19. الأنواع الخطية - دليل مستخدم مُصرّف غلاسكو هاسكل 9.7.20230513" . ghc.gitlab.haskell.org . تاريخ الاسترجاع: 14-05-2023 .
- ↑ هدسون @twostraws، بول. "الهياكل والقيم غير القابلة للنسخ - متوفرة من Swift 5.9" . البرمجة باستخدام Swift .
- نظرية الأنواع
