چندریختی و جنریکها
چندریختی به یک قطعه کد واحد اجازه میدهد تا به طور یکنواخت بر روی انواع مختلف عمل کند، که چندریختی پارامتری (جنریکها)، چندریختی موردی (سربارگذاری و کلاسهای نوع)، و چندریختی زیرنوعی اشکال اصلی آن هستند.
Definition
چندریختی خاصیتی است که به موجب آن یک تابع، نوع یا عملیات واحد میتواند برای مقادیر بیش از یک نوع اعمال شود؛ چندریختی پارامتری این کار را به طور یکنواخت از طریق پارامترهای نوع (جنریکها) انجام میدهد، در حالی که چندریختی موردی به پیادهسازیهای خاص نوع ارسال میشود.
Scope
این موضوع انواع اصلی چندریختی را پوشش میدهد: چندریختی پارامتری که توسط جنریکها و System F محقق میشود، چندریختی موردی از طریق سربارگذاری و کلاسهای نوع، و چندریختی شمول (زیرنوعی). به پارامتریسیته و اصول استدلال قوی که از آن ناشی میشود، و نحوه کامپایل و محدود شدن انتزاعات جنریک میپردازد.
Core questions
- چگونه جنریکها بدون قربانی کردن ایمنی نوع، قابلیت استفاده مجدد را فراهم میکنند؟
- پارامتریسیته چیست و چه تضمینهایی را به صورت رایگان ارائه میدهد؟
- چگونه کلاسهای نوع سربارگذاری موردی را سیستماتیک میکنند؟
- تعاریف جنریک چگونه کامپایل میشوند و چه محدودیتهایی میتوانند پارامترهای نوع را محدود کنند؟
Key theories
- پارامتریسیته (قضیه انتزاع)
- قضیه انتزاع رینولدز نشان میدهد که توابع چندریختی پارامتری به طور یکنواخت در انواع مختلف رفتار میکنند، خاصیتی که رفتار ممکن آنها را مستقل از نمونهسازی نوع بتنی محدود میکند.
- قضایای رایگان
- وادلر نشان داد که نوع یک تابع چندریختی پارامتری به تنهایی قضایای رایگانی را در مورد رفتار آن ایجاب میکند، که نتیجهای مستقیم و عملی از پارامتریسیته است.
- کلاسهای نوع برای سربارگذاری اصولی
- وادلر و بلوت کلاسهای نوع را معرفی کردند و به چندریختی موردی یک پایه نظری نوعی منسجم دادند که در آن عملیات سربارگذاری شده با ارسال دیکشنریهای ضمنی از پیادهسازیهای متد حل میشوند.
Clinical relevance
جنریکها و چندریختی در طراحی کتابخانههای قابل استفاده مجدد و چارچوبهای مجموعهای در زبانهای برنامهنویسی مدرن محوری هستند. کلاسهای نوع و مشابهات آنها (traits, concepts, protocols) سربارگذاری ایمن از نظر نوع و اصولی را فراهم میکنند، در حالی که پارامتریسیته از استدلال صحت و بهینهسازیهای کامپایلر پشتیبانی میکند.
History
System F، که چندریختی پارامتری را در بر میگیرد، به طور مستقل توسط ژیرار و رینولدز در اوایل دهه ۱۹۷۰ کشف شد. ML چندریختی را با استنتاج به عمل آورد. بررسی کاردلی و وگنر در سال ۱۹۸۵ اشکال چندریختی را طبقهبندی کرد، رینولدز پارامتریسیته را در سال ۱۹۸۳ رسمی کرد، و کلاسهای نوع وادلر و بلوت در سال ۱۹۸۹ سربارگذاری را در Haskell شکل دادند و بر traits و concepts در جاهای دیگر تأثیر گذاشتند.
Debates
- پاکسازی در مقابل جنریکهای بازنمایی شده
- پیادهسازان زبان در مورد کامپایل جنریکها از طریق پاکسازی نوع (type erasure)، که ساده است اما اطلاعات نوع زمان اجرا را از دست میدهد، در مقابل بازنمایی پارامترهای نوع در زمان اجرا (reifying)، که امکان دروننگری را با هزینهای در پیچیدگی و اندازه کد فراهم میکند، بحث میکنند.
Key figures
- John Reynolds
- Jean-Yves Girard
- Philip Wadler
- Luca Cardelli
- Robin Milner
Related topics
Seminal works
- reynolds1983
- wadler1989free
- wadler1989
- cardelli1985
Frequently asked questions
- تفاوت بین چندریختی پارامتری و موردی چیست؟
- چندریختی پارامتری یک پیادهسازی یکنواخت را برای همه آرگومانهای نوع اعمال میکند (مانند جنریکها)، در حالی که چندریختی موردی یک پیادهسازی خاص نوع را انتخاب میکند، مانند سربارگذاری یا کلاسهای نوع.
- پارامتریسیته چه چیزی به ما میدهد؟
- پارامتریسیته تضمین میکند که یک تابع جنریک با تمام نمونههای نوع به طور یکنواخت رفتار میکند، که منجر به «قضایای رایگان» در مورد رفتار آن میشود که تنها از امضای نوع آن قابل استخراج است.