روش هایی برای قابلیت همکاری

**قابلیت همکاری زبان** توانایی دو زبان برنامه نویسی مختلف برای تعامل بومی به عنوان بخشی از یک سیستم و عملکرد بر روی یک نوع ساختار داده است. 

راه های زیادی وجود دارد که زبان های برنامه نویسی با یکدیگر قابل همکاری هستند. HTML ، CSS ، و جاوا اسکریپت به دلیل استفاده پشت سر هم در صفحات وب، قابلیت همکاری دارند. برخی از زبان‌های شی گرا به لطف ماشین مجازی میزبان مشترک خود، قابل همکاری هستند (مثلاً زبان‌های سازگار با NET CLI در زبان مشترک Runtime و زبان‌های سازگار JVM در ماشین مجازی جاوا ). 

## روش هایی برای قابلیت همکاری

### مدل های شی
مدل‌های آبجکت مدل‌های استاندارد شده‌ای هستند که به اشیاء اجازه می‌دهند به شیوه‌ای زبان شناسانه نمایش داده شوند، به طوری که می‌توان از همان اشیاء در بین برنامه‌ها و زبان‌ها استفاده کرد. CORBA و COM محبوب ترین مدل های شی هستند.

### ماشین های مجازی
بندانگشتی|زبان های مختلف در یک زمان اجرا مشترک کامپایل می شوند.

ماشین مجازی (VM) یک زبان میانی تخصصی است که چندین زبان مختلف به آن کامپایل می‌شوند. زبان‌هایی که از یک ماشین مجازی استفاده می‌کنند، می‌توانند با هم کار کنند، زیرا یک مدل حافظه و کامپایلر مشترک دارند و بنابراین کتابخانه‌های یک زبان می‌توانند برای دیگران در همان VM دوباره استفاده شوند. ماشین‌های مجازی می‌توانند سیستم‌های نوع را برای اطمینان از صحت زبان‌های شرکت‌کننده ترکیب کنند و به زبان‌ها زمینه مشترکی برای اطلاعات نوعشان بدهند. استفاده از زبان میانی در حین تالیف یا تفسیر می تواند فرصت های بیشتری برای بهینه سازی فراهم کند. 

### رابط های تابع خارجی

رابط های تابع خارجی (FFI) به برنامه های نوشته شده در یک زبان اجازه می دهد تا توابع نوشته شده به زبان دیگر را فراخوانی کنند. غالباً ملاحظاتی وجود دارد که از تلقی توابع خارجی به عنوان توابع نوشته شده در زبان میزبان جلوگیری می کند، مانند تفاوت در انواع و مدل اجرا. رابط‌های تابع خارجی ساخت کتابخانه‌های پوششی را قادر می‌سازند که عملکردی را از یک کتابخانه از زبان دیگری در زبان میزبان ارائه می‌دهند، اغلب به سبکی که برای زبان اصطلاحی‌تر است. بیشتر زبان‌ها دارای FFI به C هستند که امروزه «زبان فرانکا» برنامه‌نویسی است.

## چالش ها

### تفاوت مدل شی
زبان های شی گرا سعی می کنند محفظه های داده را با کد جفت کنند، اما نحوه انتخاب هر زبان ممکن است کمی متفاوت باشد. این تصمیمات طراحی همیشه به راحتی به زبان های دیگر نگاشت نمی شوند. به عنوان مثال، کلاس هایی که از وراثت چندگانه از زبانی استفاده می کنند که به آن اجازه می دهد، به خوبی به زبانی که اجازه وراثت چندگانه را نمی دهد، ترجمه نمی شود. یک رویکرد رایج برای این موضوع، تعریف زیرمجموعه ای از یک زبان است که با ویژگی های زبان دیگر سازگار است.  این رویکرد به این معنی است که برای اینکه کدی که از ویژگی‌های خارج از زیر مجموعه استفاده می‌کند برای تعامل با یکدیگر، باید برخی از اینترفیس‌های خود را در کلاس‌هایی قرار دهد که برای زیرمجموعه قابل درک باشد.

### مدل های حافظه
تفاوت در نحوه مدیریت عدم تخصیص حافظه توسط زبان های برنامه نویسی یکی دیگر از مسائلی است که در تلاش برای ایجاد قابلیت همکاری است. زبان‌های دارای تخصیص خودکار به خوبی با زبان‌هایی که عدم تخصیص دستی دارند کار نمی‌کنند و زبان‌هایی که تخریب قطعی دارند با زبان‌هایی که تخریب غیر قطعی دارند ناسازگار خواهند بود. بر اساس محدودیت های زبان، استراتژی های مختلفی برای پل زدن رفتارهای مختلف وجود دارد. به عنوان مثال: برنامه های C++ که معمولاً از تخصیص دستی استفاده می کنند، می توانند با تغییر رفتار عدم تخصیص برای حذف شیء، اما نه بازیابی حافظه، با یک جمع کننده زباله سبک جاوا تعامل داشته باشند. این امر مستلزم آن است که هر شی باید به صورت دستی تخصیص داده شود تا جمع کننده زباله بتواند حافظه را به طور ایمن آزاد کند.

### تغییرپذیری
تغییرپذیری در هنگام تلاش برای ایجاد قابلیت همکاری بین زبان های کاربردی و رویه ای خالص به یک مسئله تبدیل می شود. زبان‌هایی مانند Haskell هیچ نوع قابل تغییری ندارند، در حالی که C++ چنین تضمین‌های دقیقی را ارائه نمی‌کند. بسیاری از انواع تابعی که به زبان های شی گرا متصل می شوند، نمی توانند تضمین کنند که اشیاء زیربنایی تغییر نخواهند کرد.

## همچنین ببینید

* رابط عملکرد خارجی
* مشخصات مستقل از زبان
* الزام آور زبان
* زبان چسب
* استفاده مجدد API
* زبان های JVM
* زبان های CLI
* SWIG

## مراجع

# 
# 
#