التصنيف الفرعي

في نظرية لغة البرمجة ، يعتبر التصنيف الفرعي (يُسمى أيضًا تعدد أشكال النوع الفرعي أو تعدد أشكال التضمين ) شكلًا من أشكال تعدد أشكال النوع . النوع الفرعي هو نوع بيانات مرتبط بنوع بيانات آخر (النوع الفائق ) من خلال بعض مفاهيم الاستبدال ، مما يعني أن عناصر البرنامج (عادةً البرامج الفرعية أو الوظائف)، المكتوبة للعمل على عناصر النوع الفائق، يمكنها أيضًا العمل على عناصر النوع الفرعي.

إذا كان S نوعًا فرعيًا من T، فإن علاقة التصنيف الفرعي (المكتوبة على هيئة S <: T ،   ST ، [1] أو   S ≤: T ) تعني أنه يمكن استخدام  أي مصطلح من النوع S بأمان في أي سياق حيث يُتوقع وجود مصطلح من النوع T. تعتمد الدلالات الدقيقة للتصنيف الفرعي هنا بشكل حاسم على تفاصيل كيفية تعريف "الاستخدام الآمن" و "أي سياق" بواسطة صيغة نوع معينة أو لغة برمجة . يحدد نظام النوع في لغة البرمجة بشكل أساسي علاقة التصنيف الفرعي الخاصة به، والتي قد تكون تافهة ، إذا كانت اللغة لا تدعم آليات التحويل (أو تدعم القليل جدًا منها).

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

غالبًا ما تسمح لغات البرمجة الوظيفية بتصنيف السجلات إلى فئات فرعية. وبالتالي، فإن حساب لامدا المكتوب ببساطة والممتد بأنواع السجلات ربما يكون أبسط إطار نظري يمكن من خلاله تعريف ودراسة مفهوم مفيد للتصنيف الفرعي. [2] نظرًا لأن الحساب الناتج يسمح للمصطلحات بأن يكون لها أكثر من نوع واحد، فإنه لم يعد نظرية نوع "بسيطة" . نظرًا لأن لغات البرمجة الوظيفية، بحكم التعريف، تدعم أحرف الدالة ، والتي يمكن أيضًا تخزينها في السجلات، فإن أنواع السجلات مع التصنيف الفرعي توفر بعض ميزات البرمجة الموجهة للكائنات. عادةً، توفر لغات البرمجة الوظيفية أيضًا بعض أشكال تعدد الأشكال البارامترية المقيدة عادةً. في إطار نظري، من المستحسن دراسة تفاعل الميزتين؛ أحد الإعدادات النظرية الشائعة هو النظام F <:. يمكن اشتقاق العديد من الحسابات التي تحاول التقاط الخصائص النظرية للبرمجة الموجهة للكائنات من النظام F < :.

يرتبط مفهوم التصنيف الفرعي بالمفاهيم اللغوية لـ hyponymy و holonymy . كما أنه مرتبط بمفهوم الكم المحدود في المنطق الرياضي (انظر المنطق المرتب حسب الترتيب ). لا ينبغي الخلط بين التصنيف الفرعي ومفهوم الميراث (الفئة أو الكائن) من اللغات الموجهة للكائنات؛ [3] التصنيف الفرعي هو علاقة بين الأنواع (الواجهات في لغة الكائنات الموجهة) بينما الميراث هو علاقة بين التنفيذات الناتجة عن ميزة لغوية تسمح بإنشاء كائنات جديدة من كائنات موجودة. في عدد من اللغات الموجهة للكائنات، يسمى التصنيف الفرعي وراثة الواجهة ، مع الإشارة إلى الميراث باسم وراثة التنفيذ .

الأصول

يعود مفهوم التصنيف الفرعي في لغات البرمجة إلى ستينيات القرن العشرين؛ حيث تم تقديمه في مشتقات Simula . وقد قدم جون سي رينولدز أول معالجات رسمية للتصنيف الفرعي في عام 1980، حيث استخدم نظرية الفئات لإضفاء الطابع الرسمي على التحويلات الضمنية ، ولوكا كارديلي (1985). [4]

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

أمثلة

مثال على الأنواع الفرعية: حيث أن الطائر هو النوع الأعلى وجميع الأنواع الأخرى هي أنواع فرعية كما هو موضح بالسهم في تدوين UML

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

كمثال أكثر عملية، قد تسمح اللغة باستخدام قيم الأعداد الصحيحة حيثما تكون قيم الفاصلة العائمة متوقعة ( Integer<: Float)، أو قد تحدد نوعًا عامًارقمكنوع فرعي مشترك من الأعداد الصحيحة والأعداد الحقيقية. في هذه الحالة الثانية، لدينا فقط Integer<: Numberو Float<: Number، لكن Integerو Floatليست أنواعًا فرعية لبعضها البعض.

قد يستفيد المبرمجون من التصنيف الفرعي لكتابة التعليمات البرمجية بطريقة أكثر تجريدًا مما قد يكون ممكنًا بدونه. فكر في المثال التالي:

الدالة max ( x كرقم ، y كرقم ) هي إذا كان x < y ثم ارجع y وإلا ارجع x النهاية        
        
         
    
         

إذا كان كل من الأعداد الصحيحة والحقيقية نوعين فرعيين من Number، وتم تعريف عامل مقارنة بعدد عشوائي لكلا النوعين، فيمكن تمرير قيم أي من النوعين إلى هذه الدالة. ومع ذلك، فإن إمكانية تنفيذ مثل هذا العامل تقيد نوع العدد بشكل كبير (على سبيل المثال، لا يمكن مقارنة عدد صحيح بعدد مركب)، وفي الواقع، فإن مقارنة الأعداد الصحيحة بالأعداد الصحيحة فقط، والأعداد الحقيقية بالأعداد الحقيقية، أمر منطقي. تتطلب إعادة كتابة هذه الدالة بحيث تقبل فقط "x" و"y" من نفس النوع تعدد الأشكال المحدود .

الإستيلاء

في نظرية النوع ، يتم استخدام مفهوم الخضوع [5] لتحديد أو تقييم ما إذا كان النوع S هو نوع فرعي من النوع T.

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

عند مناقشة مفهوم الضم، يتم الإشارة إلى مجموعة قيم نوع ما من خلال كتابة اسمها بخط مائل رياضيًا: T. يتم الإشارة إلى النوع، الذي يُنظر إليه باعتباره مسندًا لمجال ما، من خلال كتابة اسمه بخط غامق: T. الرمز التقليدي <: يعني "هو نوع فرعي من"، و :> يعني "هو نوع فائق من". [ بحاجة لمصدر ]

  • يشتمل النوع T على S إذا كانت مجموعة القيم T التي يعرفها هي مجموعة فرعية للمجموعة S ، بحيث يكون كل عنصر من S هو أيضًا عنصر من T.
  • يمكن أن يندرج النوع تحت أكثر من نوع: تتقاطع الأنواع الفرعية لـ S عند S.
  • إذا كانت S <: T (وبالتالي ST )، فيجب أن يكون T ، المسند الذي يحدد المجموعة T ، جزءًا من المسند S (على نفس المجال) الذي يحدد S.
  • إذا كان S يشمل T ، و T يشمل S ، فإن النوعين متساويان (على الرغم من أنهما قد لا يكونان نفس النوع إذا كان نظام النوع يميز الأنواع بالاسم).

من حيث خصوصية المعلومات، يعتبر النوع الفرعي أكثر خصوصية من أي من أنواعه الفرعية، لأنه يحتوي على قدر من المعلومات لا يقل عن كل منها. وقد يؤدي هذا إلى زيادة قابلية تطبيق النوع الفرعي أو أهميته (عدد المواقف التي يمكن فيها قبوله أو تقديمه)، مقارنة بأنواعه الفرعية "الأكثر عمومية". والعيب في وجود هذه المعلومات الأكثر تفصيلاً هو أنها تمثل خيارات مدمجة تقلل من انتشار النوع الفرعي (عدد المواقف القادرة على توليده أو إنتاجه).

في سياق الضم، يمكن التعبير عن تعريفات النوع باستخدام تدوين Set-builder ، والذي يستخدم مسندًا لتحديد مجموعة. يمكن تعريف المسندات على نطاق (مجموعة من القيم المحتملة) D. المسندات هي وظائف جزئية تقارن القيم بمعايير الاختيار. على سبيل المثال: "هل قيمة عدد صحيح أكبر من أو تساوي 100 وأقل من 200؟". إذا كانت القيمة تطابق المعايير، فإن الوظيفة تعيد القيمة. إذا لم يكن الأمر كذلك، فلن يتم تحديد القيمة، ولا يتم إرجاع أي شيء. (تعتبر فهم القائمة شكلاً من أشكال هذا النمط المستخدم في العديد من لغات البرمجة.)

إذا كان هناك مسندان، أحدهما ينطبق على معايير الاختيار للنوع T ، والآخر ينطبق على معايير إضافية للنوع S ، فيمكن تعريف مجموعات للنوعين:

يتم تطبيق المسند جنبًا إلى جنب كجزء من المسند المركب S الذي يحدد S. المسندان متصلان ، لذا يجب أن يكون كلاهما صحيحًا لتحديد قيمة. يستوعب المسند المسند T ، لذا S <: T.

على سبيل المثال: هناك فصيلة فرعية من أنواع القطط تسمى Felinae ، وهي جزء من عائلة Felidae . جنس Felis ، الذي ينتمي إليه نوع القطط المنزلية Felis catus ، هو جزء من تلك الفصيلة الفرعية.

تم التعبير عن اقتران المسندات هنا من خلال تطبيق المسند الثاني على مجال القيم المتوافقة مع المسند الأول. عند النظر إليها كأنواع، Felis <: Felinae <: Felidae .

إذا استوعبت T S ( T :> S ) فإن الإجراء أو الدالة أو التعبير المعطى قيمة كمتغير (قيمة معلمة أو مصطلح) سيكون قادرًا على العمل على تلك القيمة كواحدة من النوع T ، لأن . في المثال أعلاه، يمكننا أن نتوقع أن تكون دالة Subfamily قابلة للتطبيق على قيم جميع الأنواع الثلاثة Felidae و Felinae و Felis .

مخططات التصنيف الفرعي

يُجري علماء نظرية النوع تمييزًا بين التصنيف الفرعي الاسمي ، حيث يمكن فقط للأنواع المعلنة بطريقة معينة أن تكون أنواعًا فرعية لبعضها البعض، والتصنيف الفرعي البنيوي ، حيث يحدد هيكل نوعين ما إذا كان أحدهما نوعًا فرعيًا للآخر أم لا. التصنيف الفرعي الموجه للكائنات القائم على الفئة الموصوف أعلاه اسمي؛ قد تقول قاعدة التصنيف الفرعي البنيوي للغة موجهة للكائنات أنه إذا كانت الكائنات من النوع A قادرة على التعامل مع جميع الرسائل التي يمكن للكائنات من النوع B التعامل معها (أي إذا كانت تحدد جميع الأساليب نفسها )، فإن A هي نوع فرعي من B بغض النظر عما إذا كان أي منهما يرث من الآخر. هذا التصنيف المسمى بالبط شائع في لغات موجهة للكائنات ذات النوع الديناميكي. قواعد التصنيف الفرعي البنيوي السليمة للأنواع بخلاف أنواع الكائنات معروفة جيدًا أيضًا. [ بحاجة لمصدر ]

تنقسم تنفيذات لغات البرمجة التي تستخدم التصنيف الفرعي إلى فئتين عامتين: التنفيذات الشاملة ، حيث يمثل تمثيل أي قيمة من النوع A أيضًا نفس القيمة في النوع B إذا كانت A  <:  B ، والتنفيذات القسرية ، حيث يمكن تحويل قيمة من النوع A تلقائيًا إلى قيمة من النوع B. عادةً ما يكون التصنيف الفرعي الناتج عن التصنيف الفرعي في لغة موجهة للكائنات شاملاً؛ وعادةً ما تكون علاقات التصنيف الفرعي التي تربط بين الأعداد الصحيحة والأعداد العشرية، والتي يتم تمثيلها بشكل مختلف، قسرية.

في جميع أنظمة الأنواع تقريبًا التي تحدد علاقة تصنيف فرعي، تكون هذه العلاقة انعكاسية (أي A  <:  A لأي نوع A ) ومتعدية (أي إذا كان A  <:  B و B  <:  C فإن A  <:  C ). وهذا يجعلها ذات ترتيب مسبق على الأنواع.

أنواع التسجيلات

التصنيف الفرعي للعرض والعمق

تؤدي أنواع السجلات إلى ظهور مفاهيم التصنيف الفرعي حسب العرض والعمق . وتعبر هذه المفاهيم عن طريقتين مختلفتين للحصول على نوع جديد من السجلات يسمح بنفس العمليات التي يسمح بها نوع السجل الأصلي.

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

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

الطريقة الثانية، والتي تسمى التصنيف الفرعي العميق ، تحل محل الحقول المختلفة بأنواعها الفرعية. أي أن حقول النوع الفرعي هي أنواع فرعية لحقول النوع الأعلى. ونظرًا لأن أي عملية مدعومة لحقل في النوع الأعلى مدعومة لنوعه الفرعي، فإن أي عملية ممكنة على النوع الأعلى للسجل مدعومة بواسطة النوع الفرعي للسجل. التصنيف الفرعي العميق لا يكون منطقيًا إلا للسجلات غير القابلة للتغيير: على سبيل المثال، يمكنك تعيين 1.5 لحقل "x" لنقطة حقيقية (سجل يحتوي على حقلين حقيقيين)، ولكن لا يمكنك فعل الشيء نفسه لحقل "x" لنقطة عدد صحيح (والذي، مع ذلك، هو نوع فرعي عميق لنوع النقطة الحقيقية) لأن 1.5 ليس عددًا صحيحًا (انظر التباين ).

يمكن تعريف التصنيف الفرعي للسجلات في نظام F <:، والذي يجمع بين تعدد الأشكال البارامترية والتصنيف الفرعي لأنواع السجلات وهو أساس نظري للعديد من لغات البرمجة الوظيفية التي تدعم كلتا الميزتين.

تدعم بعض الأنظمة أيضًا التصنيف الفرعي لأنواع الاتحاد المنفصلة المُسمَّاة (مثل أنواع البيانات الجبرية ). يتم عكس قاعدة التصنيف الفرعي للعرض: يجب أن يظهر كل علامة تظهر في النوع الفرعي للعرض في النوع الفائق للعرض.

أنواع الوظائف

إذا كان T 1T 2 نوع دالة، فإن أي نوع دالة S 1S 2 له الخاصية التي مفادها أن T 1 <: S 1 و S 2 <: T 2 سيكون أحد الأنواع الفرعية له . ويمكن تلخيص ذلك باستخدام قاعدة الكتابة التالية :

يُقال عن نوع المعلمة S 1S 2 أنه متغاير معاكس لأن علاقة التصنيف الفرعي معكوسة بالنسبة له، في حين أن نوع الإرجاع متغاير . بشكل غير رسمي، يحدث هذا الانعكاس لأن النوع المكرر "أكثر ليبرالية" في الأنواع التي يقبلها و"أكثر تحفظًا" في النوع الذي يعيده. هذا هو ما يعمل بالضبط في سكالا : دالة n -ary هي داخليًا فئة ترث السمة ( والتي يمكن رؤيتها كواجهة عامة في لغات تشبه Java )، حيث هي أنواع المعلمات، و هو نوع الإرجاع الخاص بها؛ "-" قبل النوع يعني أن النوع متغاير معاكس بينما "+" يعني متغاير.

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

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

العلاقة مع الميراث

إن التصنيف الفرعي والوراثة هما علاقتان مستقلتان (متعامدة). قد تتطابقان، لكن لا يشكل أي منهما حالة خاصة للآخر. بعبارة أخرى، بين النوعين S و T ، تكون جميع تركيبات التصنيف الفرعي والوراثة ممكنة:

  1. S ليس نوعًا فرعيًا ولا نوعًا مشتقًا من T
  2. S هو نوع فرعي ولكنه ليس نوعًا مشتقًا من T
  3. S ليس نوعًا فرعيًا ولكنه نوع مشتق من T
  4. S هو نوع فرعي ونوع مشتق من T

يتم توضيح الحالة الأولى من خلال الأنواع المستقلة، مثل Booleanو Float.

يمكن توضيح الحالة الثانية من خلال العلاقة بين Int32و Int64. في معظم لغات البرمجة الموجهة للكائنات، Int64لا ترتبط بالوراثة بـ Int32. ومع ذلك، Int32يمكن اعتبارها نوعًا فرعيًا من Int64حيث يمكن ترقية أي قيمة عدد صحيح مكونة من 32 بت إلى قيمة عدد صحيح مكونة من 64 بت.

الحالة الثالثة هي نتيجة لتباين إدخال التصنيف الفرعي للوظيفة . افترض وجود فئة عليا من النوع T لها طريقة m تعيد كائنًا من نفس النوع ( أي أن نوع m هو TT ، لاحظ أيضًا أن المعلمة الأولى لـ m هي this/self) ونوع فئة مشتق S من T. بالوراثة، يكون نوع m في S هو SS. [ بحاجة لمصدر ] لكي تكون S نوعًا فرعيًا من يجب أن يكون نوع m في S نوعًا فرعيًا من نوع m في T [ بحاجة لمصدر ] ، بمعنى آخر: SS ≤: TT. من خلال التطبيق التصاعدي لقاعدة التصنيف الفرعي للوظيفة، فإن هذا يعني: S ≤: T و T ≤: S ، وهو أمر ممكن فقط إذا كانت S و T متماثلتين. نظرًا لأن الوراثة هي علاقة غير انعكاسية، فلا يمكن أن تكون S نوعًا فرعيًا من T.

يكون التصنيف الفرعي والوراثة متوافقين عندما تحتوي جميع الحقول والطرق الموروثة من النوع المشتق على أنواع هي أنواع فرعية للحقول والطرق المقابلة من النوع الموروث. [3]

الإكراهات

في أنظمة التصنيف الفرعي القسري، يتم تعريف الأنواع الفرعية من خلال وظائف تحويل النوع الضمنية من النوع الفرعي إلى النوع الفائق. لكل علاقة تصنيف فرعي ( S <: Tيتم توفير دالة إكراه coerce : ST ، ويتم اعتبار أي كائن s من النوع S بمثابة الكائن coerce ST ( s ) من النوع T. يمكن تعريف دالة الإكراه من خلال التركيب: إذا كان S < : T و T <: U ، فيمكن اعتبار s بمثابة كائن من النوع u تحت الإكراه المركب ( coerce T U coerce S T ) . نوع الإكراه من نوع إلى نفسه coerce TT هو دالة الهوية id T.

يمكن تعريف وظائف الإكراه للسجلات والأنواع الفرعية للاتحاد المنفصلة على أساس المكونات؛ في حالة السجلات الممتدة بالعرض، يتجاهل الإكراه النوعي ببساطة أي مكونات غير محددة في النوع الرئيسي. يمكن إعطاء الإكراه النوعي لأنواع الوظائف بواسطة f' ( t ) = coerce S 2T 2 ( f ( coerce T 1S 1 ( t )))، مما يعكس التباين المعاكس لقيم المعلمات والتباين المشترك لقيم الإرجاع.

يتم تحديد دالة الإكراه بشكل فريد بالنظر إلى النوع الفرعي والنوع الأعلى . وبالتالي، عند تعريف علاقات تصنيف فرعي متعددة، يجب توخي الحذر لضمان تماسك جميع إكراهات النوع. على سبيل المثال، إذا كان من الممكن إكراه عدد صحيح مثل 2: int إلى رقم فاصل عائم (على سبيل المثال، 2.0: float )، فلا يجوز إكراه 2.1: float إلى 2: int ، لأن الإكراه المركب coerce floatfloat المعطى بواسطة coerce intfloatcoerce floatint سيكون بعد ذلك مختلفًا عن هوية الإكراه id float .

انظر أيضا

ملحوظات

  1. ^ Copestake, Ann. Implementing typed feature structure grammars. المجلد 110. ستانفورد: منشورات CSLI، 2002.
  2. ^ Cardelli, Luca. A semantics of multiple legacy. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.
  3. ^ أ ب كوك، هيل وكانينج 1990.
  4. ^ بيرس، الفصل 15 ملاحظات
  5. ^ Benjamin C. Pierce, Types and Programming Languages , MIT Press, 2002, 15.1 "Subsumption"، ص 181-182
  6. ^ باربرا ليسكوف، جانيت وينج، مفهوم سلوكي للتصنيف الفرعي ، معاملات ACM للغات البرمجة والأنظمة، المجلد 16، العدد 6 (نوفمبر 1994)، ص 1811-1841. ظهرت نسخة محدثة كتقرير فني لـ CMU: ليسكوف، باربرا ؛ وينج، جانيت (يوليو 1999). "التصنيف الفرعي السلوكي باستخدام الثوابت والقيود" ( PS ) . تم الاسترجاع في 2006-10-05 .

مراجع

الكتب المدرسية

  • بنيامين سي بيرس، أنواع ولغات البرمجة ، مطبعة معهد ماساتشوستس للتكنولوجيا، 2002، ISBN 0-262-16209-1 ، الفصل 15 (التصنيف الفرعي لأنواع السجلات)، 19.3 (الأنواع الاسمية مقابل البنيوية والتصنيف الفرعي)، و23.2 (أنواع تعدد الأشكال) 
  • C. Szyperski, D. Gruntz, S. Murer, Component software: beyond object-oriented programming , 2nd ed., Pearson Education, 2002, ISBN 0-201-74572-0 , ص 93-95 (عرض تقديمي رفيع المستوى يستهدف مستخدمي لغات البرمجة) 

أوراق

كوك، ويليام ر.؛ هيل، والتر؛ كانينج، بيتر س. (1990). الميراث ليس تصنيفًا فرعيًا . وقائع المؤتمر السابع عشر لجمعية آلات الحوسبة SIGPLAN-SIGACT حول مبادئ لغات البرمجة (POPL). ص. 125-135. CiteSeerX  10.1.1.102.8635 . doi :10.1145/96709.96721. ISBN 0-89791-343-4.
  • رينولدز، جون سي. استخدام نظرية الفئات لتصميم التحويلات الضمنية والمشغلات العامة. في ND Jones، محرر، وقائع ورشة عمل آرهوس حول توليد المترجم الموجه بالدلالات، العدد 94 في محاضرات في علوم الكمبيوتر. Springer-Verlag، يناير 1980. أيضًا في Carl A. Gunter و John C. Mitchell، محررين، الجوانب النظرية للبرمجة الموجهة للكائنات: الأنواع والدلالات وتصميم اللغة (MIT Press، 1994).

قراءة إضافية

تم الاسترجاع من "https://en.wikipedia.org/w/index.php?title=التصنيف الفرعي&oldid=1216183599"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate