أي نوع
في نظرية الأنواع وعلوم الحاسوب ، تتضمن أنظمة الأنواع نوعًا رئيسيًا ، أو نوعًا شاملًا ، أو أي نوع (يُرمز له غالبًا برمز الخط السفلي ( ⊤ ))، والذي يشمل جميع الأنواع الأخرى كأنواع فرعية. يُطلق على النوع الرئيسي أحيانًا اسم النوع الشامل ، أو النوع الفائق الشامل، لأن جميع الأنواع الأخرى في نظام الأنواع محل الاهتمام هي أنواع فرعية منه. في لغات البرمجة كائنية التوجه ، يُطلق عليه غالبًا اسم الكائن ، لأنه يُمثل جميع الكائنات الممكنة.
يتناقض النوع العلوي مع النوع السفلي ، أو النوع الفرعي الشامل ، الذي يُعد كل نوع آخر نوعًا رئيسيًا له. النوع السفلي هو نوع لا يحتوي على أي أنواع فرعية على الإطلاق.
الدعم في لغات البرمجة
توفر العديد من لغات البرمجة ذات الأنواع المحددة دعمًا صريحًا للنوع الأعلى.
في اللغات ذات الكتابة الثابتة ، هناك مفهومان مختلفان، غالباً ما يتم الخلط بينهما، عند مناقشة النوع الأعلى.
- فئة أساسية عامة أو عنصر آخر في أعلى تسلسل هرمي لفئات وقت التشغيل (غالبًا ما يكون ذا صلة في البرمجة كائنية التوجه ) أو تسلسل هرمي للأنواع ؛ غالبًا ما يكون من الممكن إنشاء كائنات بهذا النوع (وقت التشغيل)، أو يمكن العثور عليه عند فحص التسلسل الهرمي للأنواع برمجيًا، في اللغات التي تدعمه.
- نوع ثابت ( في وقت الترجمة ) في الكود يمكن إسناد أي قيمة (أو مجموعة فرعية منها، مثل أي قيمة مؤشر كائن) إلى متغيراته، على غرار الكتابة الديناميكية.
غالبًا ما يستلزم المفهوم الأول المفهوم الثاني، أي أنه إذا وُجدت فئة أساسية شاملة، فإن المتغير الذي يُشير إلى كائن من هذه الفئة يُمكنه أيضًا الإشارة إلى كائن من أي فئة. مع ذلك، تحتوي العديد من اللغات على أنواع في هذا السياق (مثل لغة void*C ، ولغة idObjective -C ، interface {}ولغة Go )، وهي أنواع ثابتة تقبل متغيراتها أي قيمة كائن، لكنها لا تُمثل أنواع وقت التشغيل الحقيقية التي يُمكن أن يمتلكها الكائن في نظام الأنواع، لذا فهي ليست أنواعًا عليا في السياق الأول.
في اللغات ذات الكتابة الديناميكية، لا وجود للمفهوم الثاني (إذ يمكن إسناد أي قيمة لأي متغير)، لذا يُناقش المفهوم الأول فقط (تسلسل الفئات). تحاول هذه المقالة التركيز على المفهوم الأول عند مناقشة الأنواع العليا، مع الإشارة إلى المفهوم الثاني في اللغات التي يكون فيها ذا أهمية.
| اسم | اللغات |
|---|---|
Object | Smalltalk و JavaScript وبعض اللغات الأخرى. |
java.lang.Object | جافا . غالبًا ما تُكتب بدون بادئة الحزمة، كما هو موضح Object(لأنها java.langتُستورد ضمنيًا). كما أنها ليست نوعًا فائقًا للأنواع الأولية؛ ومع ذلك، منذ جافا 1.5، يسمح التحويل التلقائي للأنواع بتحويل نوع القيمة الأولية ضمنيًا أو صراحةً إلى Object، على سبيل المثال،((Object)42).toString() |
System.Object[ 1 ] | لغة C# ، و Visual Basic (.NET) ، ولغات إطار عمل .NET الأخرى |
std::any | لغة C++ منذ الإصدار C++17 |
object.Object | د |
std::any::Any | الصدأ |
object | منذ توحيد لغة بايثونtype وفي classالإصدار 2.2 [ 2 ] (الكائنات ذات النمط الجديد فقط؛ تفتقر الكائنات ذات النمط القديم في الإصدار 2.x إلى هذا كفئة أساسية). تُقدّم وحدة الكتابة الجديدة نوعًا Anyمتوافقًا مع أي نوع والعكس صحيح. |
TObject | أوبجكت باسكال |
t | لغة ليسب ، والعديد من اللهجات مثل لغة ليسب الشائعة |
kotlin.Any? | كوتلين [ 3 ] |
scala.Any | Scala ، [ 4 ] Swift ، [ 5 ] Julia ، [ 6 ] Python [ 7 ] |
ANY | إيفل [ 8 ] |
UNIVERSAL | بيرل 5 |
Variant | Visual Basic حتى الإصدار 6، D [ 9 ] |
interface{}أوany | يذهب |
BasicObject | روبي [ 10 ] |
anyو unknown[ 11 ] | TypeScript (بعد أن unknownتم تقديمه في الإصدار 3.0 [ 12 ] ) |
mixed | PHP (اعتبارًا من الإصدار 8.0) |
اللغات البرمجية التالية الموجهة للكائنات لا تحتوي على فئة أساسية شاملة:
- لا يوجد في لغتي C++ و Rust فئة عامة مثل
Object. - في لغة Objective-C ، يُمكن إنشاء فئة أساسية جديدة دون تحديد فئة أصلية لها، على الرغم من أن هذا نادر الحدوث.
Objectتُستخدم الفئة `<object>` عادةً كفئة أساسية في بيئات تشغيل Objective-C الأصلية. في مكتبات OpenStep و Cocoa Objective-C ، تُعتبر الفئة `<object>` الفئة الأساسية العامة. النوع الأعلى للمؤشرات إلى الكائنات هو `<object>` .NSObjectid - في لغة Swift ، يُمكن إنشاء فئة أساسية جديدة دون تحديد فئة أصلية لها.
Anyويمكن للبروتوكول قبول أي نوع.
لغات أخرى
اللغات التي لا تعتمد على البرمجة الكائنية عادةً لا تدعم تعدد الأشكال في الأنواع الفائقة أو الأنواع الفرعية .
على الرغم من أن لغة هاسكل تفتقر عمدًا إلى التنميط الفرعي، إلا أنها تتضمن عدة أشكال أخرى من تعدد الأشكال، بما في ذلك تعدد الأشكال البارامتري . يُعدّ مُعامل فئة النوع الأكثر عمومية مُعاملًا غير مُقيّد a(بدون قيد فئة نوع ). في لغة رست ، يُعتبر المُعامل الأكثر عمومية ( ليس كذلك، لأنه يُشير إلى السمة افتراضيًا).<T:?Sized><T>Sized
std::any(في C++) و std::any::Any(في Rust) ليست في الواقع أنواعًا عليا في نظام الأنواع، بل هي حاويات تم مسح أنواعها، والتي يتم الحصول على البيانات منها من خلال التحويل التنازلي (أو تحسين النوع ).
std.variant.Variantفي اللغة D يتصرف مثل أي نوع، ولكن بدلاً من أن يكون جذرًا لشجرة الوراثة، فهو اتحاد موسوم لجميع الأنواع.
يُستخدم النوع الأعلى كنوع عام ، لا سيما في اللغات التي لا تدعم تعدد الأشكال البارامتري . على سبيل المثال، قبل إدخال الأنواع العامة إلى جافا في الإصدار 5، كانت فئات المجموعات في مكتبة جافا القياسية (باستثناء مصفوفات جافا) تحتوي على مراجع من النوع ` java.lang.Object<T>`. وبهذه الطريقة، كان من الممكن إدراج أي نوع غير جوهري في مجموعة. كما يُستخدم النوع الأعلى غالبًا لحفظ كائنات من أنواع غير معروفة. تدعم جافا " معاملات النوع العامة "، والتي يُرمز لها بـ ` <T> ?`. على سبيل المثال، ` List<?><T>` تُشير إلى قائمة يمكنها استيعاب أي نوع (باستثناء ` null` ). يمكن تحديد حدود للمعاملات العامة، وتُشير إلى قائمة يمكنها استيعاب أي نوع يرث من/يُعد فئة أصلية للنوع `<T>` (بما في ذلك نفسه). مع ذلك، لا يمكن أن تحتوي المعاملات العامة على حدود عليا وسفلى في الوقت نفسه.List<?extendsT>List<?superT>TT
يمكن اعتبار النوع الأعلى أيضًا النوع الضمني للغات غير ذات الكتابة الثابتة. غالبًا ما توفر اللغات التي تعتمد على الكتابة أثناء التشغيل خاصية التحويل التنازلي للسماح باكتشاف نوع أكثر تحديدًا للكائن أثناء التشغيل.
في لغتي C و C++ ، يمكن لنوع المؤشر voidvoid* قبول أي مؤشر غير دالة، على الرغم من أن نوع void ليس النوع العام بل نوع الوحدة . في C++، void*لا يمكن إجراء التحويل من نوع void إلى نوع آخر بطريقة آمنة ، حيث يكتشف وقت تشغيل اللغة حالات فشل التحويل.
في اللغات ذات نظام الأنواع البنيوي ، يُعتبر الهيكل الفارغ النوع الأعلى. على سبيل المثال، الكائنات في لغة OCaml ذات أنواع بنيوية؛ نوع الكائن الفارغ (نوع الكائنات التي لا تحتوي على توابع) < >هو النوع الأعلى بين أنواع الكائنات. يمكن تحويل أي كائن OCaml صراحةً إلى هذا النوع، مع أن النتيجة لن تكون ذات فائدة. تستخدم لغة Go أيضًا نظام الأنواع البنيوي؛ وتُطبّق جميع أنواعها الواجهة الفارغة، interface {}التي لا تحتوي على توابع، ولكن يمكن تحويلها إلى نوع أكثر تحديدًا.
في لغة Kotlin ، النوع الأعلى هو kotlin.Any?، وهو شكل قابل للتصفير من kotlin.Any(النوع الأعلى الذي يمنع null). على الرغم من أن kotlin.Anyيتم تعيينه إلى java.lang.Objectفي JVM ، إلا أن Kotlin تفرض قابلية التصفير بينما لا تفرضها Java.
في المنطق
يُستخدم مفهوم " الأعلى" أيضًا في حساب القضايا ، حيث يُشير إلى صيغة صحيحة في جميع التفسيرات الممكنة. وله معنى مشابه في حساب المسندات . في منطق الوصف ، يُستخدم "الأعلى" للإشارة إلى مجموعة جميع المفاهيم. وهذا يُشبه استخدام نوع "الأعلى" في لغات البرمجة. على سبيل المثال، في لغة أنطولوجيا الويب (OWL)، التي تدعم العديد من منطق الوصف، يُقابل "الأعلى" الفئة owl:Thing، حيث جميع الفئات هي فئات فرعية من owl:Thing. (يُقابل نوع "الأسفل" أو المجموعة الفارغة owl:Nothing).
انظر أيضاً
ملحوظات
- ↑ System.Object
- ↑ توحيد أنواع/فئات بايثون
- ↑ ماتيلا، هوغو (27 فبراير 2019). "أساسيات لغة كوتلين: الأنواع. أي، وحدة، ولا شيء" . ميديوم . تم الاطلاع عليه في 16 سبتمبر 2019 .
- ↑ "نظرة عامة على لغة برمجة سكالا" (ملف PDF) . 2006. تم الاطلاع عليه في 7 أبريل 2014 .
- ↑ "الأنواع - لغة برمجة سويفت (سويفت 5.3)" . docs.swift.org . تم الاطلاع عليه في 2 نوفمبر 2020 .
- ↑ "الأنواع · لغة جوليا" . تم الاطلاع عليه في 15 مايو 2021 .
- ↑ "النوع أي" . 2022. تم الاسترجاع في 26 أكتوبر 2022 .
- ↑ "المعيار ECMA-367. إيفل: لغة التحليل والتصميم والبرمجة" (ملف PDF) . 2006. مؤرشف من الأصل (ملف PDF) بتاريخ 10 فبراير 2012. تم الاطلاع عليه بتاريخ 10 مارس 2016 .
- ↑ "std.variant - لغة برمجة D" . dlang.org . تم الاطلاع عليه بتاريخ 29-10-2022 .
- ↑ "class BasicObject - Documentation for Ruby 3.5" .
- ↑ "الأنواع العليا 'any' و 'unknown' في TypeScript" .
- ↑ "النوع المجهول في TypeScript" . 15 مايو 2019.
مراجع
- بيرس، بنجامين سي. (2002). أنواع لغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا . ISBN 0-262-16209-1.
روابط خارجية
- أنواع البيانات
- نظرية الأنواع
