چطور یک اپلیکیشن با چند زبان نوشته میشود؟

سلام دوستان. ترم دومه و معلم ها دارن با عجله ویراژ میدن. ما بخت‌برگشته ها هم باید هرطور شده پا به پاشون بدوییم تا جا نمونیم. سِیل زمان هم به سرعت و مثل همیشه بی تفاوت همه مون رو غرق کرده و داره با خودش می بره. هیچ هم اهمیت نمی ده چی جلوشه، فقط با خودش می بره. تا به حال اینقدر سریع گذر زمان رو احساس نکرده بودم.

اما میان این همه شلوغی بالاخره وقتی پیدا شد تا با پست دیگری خدمت شما باشم. امروز می خوام به سوالی جواب بدم که طبق چیزی که دیده ام سوال خیلیای دیگه هم هست.

مخاطبین مخصوص من در این پست برنامه نویس هایی هستند که تازه بعد از یادگیری اولین زبان برنامه نویسی شون به دنبال یادگیری زبان برنامه نویسی دومشون (یا حتی سومشون) هستند. برنامه نویس ها معمولا وقتی که دومین زبان برنامه نویسی شون رو یاد می گیرن، یکی از سوالایی که ذهنشون رو درگیر می کنه اینه که: «آیا می تونم با دانشی که از X داشته ام و کار های جدیدی که با Y یاد گرفته ام یک اپلیکیشن ترکیبی بسازم که از هر دو استفاده کنه؟»

این سوال، قبلا سوال خودم هم بوده.

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

خوب دیگه حاشیه بسه. بریم سراغ اصل مطلب




معمولا یک دلیل کلی وجود داره برای استفاده از چندین زبان برنامه نویسی در یک پروژه:

هر زبان برنامه نویسی یه سری قابلیت خاص داره. یه سری کار ها رو خوب انجام میده ولی در بقیه موارد گند میزنه یا حتی اصلا نمی تونه انجامش بده. معمولا در این مواقع برای پوشاندن نقاط ضعف اون زبان برنامه نویسی، از یک زبان برنامه نویسی دیگه در کنارش به صورت ترکیبی استفاده میشه.

حالا بزارید یه سری ترکیب بهتون معرفی کنم که خیلی رایج هستند.

ترکیب یک زبان برنامه نویسی سطح پایین و یک زبان برنامه نویسی سطح بالا

زبان های سطح پایین (low level) مثل C ، C++ و rust و ... سرعت بیشتری نسبت به زبان های برنامه نویسی سطح بالا (مثلا پایتون، جاوا اسکریپت و ...) دارند. همچنین زبان های سطح پایین به یه سری API های سیستمی دسترسی دارند که زبان های سطح بالا به اون ها دسترسی مستقیم ندارند. به خاطر همین اگر می خواهید از API های سیستمی استفاده کنید یا اینکه سرعت عملیات های CPU intensive (عملیات هایی که سر و کارشون با CPU هست و دائم کار های پردازشی انجام میدن) رو بالا ببرید، می تونید یک زبان برنامه نویسی سطح پایین رو انتخاب کنید و به صورت ترکیبی با یک زبان سطح بالا استفاده کنید.

یکی از نمونه های بارزش که من خودم هم یک بار به قصد یادگیری انجام داده ام، ترکیب C++ با python هست. معمولا ترکیب یک زبان برنامه نویسی سطح پایین و یک زبان برنامه نویسی سطح بالا به این صورت هست که اون زبان برنامه نویسی سطح پایین یه سری interface های native برای اون زبان سطح بالا ایجاد می کنه و چون native هست، اون زبان سطح بالا می تونه از اون interface استفاده کنه بدون اینکه حتی متوجه بشه اون بخش با یک زبان برنامه نویسی دیگه پیاده سازی شده.

اگه می خواهید مثالش رو با C++ و پایتون ببینید به این repository سر بزنید. این پروژه رو در تابستون برای یادگیری بیشتر C++ انجام داده ام.

https://github.com/Amohammadi2/Casino_plus

تا زمانی که دلیل خوبی ندارید، بهتره سراغ این روش نرید. این روش علاوه بر کارایی، دردسر خیلی زیادی داره که به شدت سر آدم رو درد میاره. خدا نکنه کدی که با C++ نوشته اید باگ داشته باشه و ارور بده ... اون وقت می فهمید منظورم از دردسر چیه ...

ترکیب دو زبان برنامه نویسی سطح بالا در دو domain مختلف

این طور ترکیب رو به وضوح در دنیای وب می شه دید. مثال بارزش جاوا اسکریپت هست که در کنار زبان های برنامه نویسی back-end استفاده میشه تا یک وب اپلیکیشن interactive بسازه. تقریبا هر back-end ای که API وب داشته باشه رو میشه با جاوا اسکریپت ازش استفاده کرد. اهمیتی نداره که اون back-end با چه زبانی نوشته شده. تا زمانی که API وب داشته باشه (مثل REST یا اخیرا GraphQL) جاوا اسکریپت به راحتی بهش متصل میشه.

مثال دیگه ای که می تونم بزنم نحوه برقراری ارتباط بین microservice ها در back-end هست که معمولا از طریق پروتوکل های متنی یا باینری (مثلا gRPC و ...) انجام میشه.

همه این API ها و پروتوکل ها هم interface محسوب میشن ام دیگه native نیستند. یعنی شما نمی تونید مستقیم کد رو import کنید و استفاده کنید. مجبور هستید پیام رو مخابره کنید. نحوه مخابره اش می تونه یه HTTP Call باشه، یه Remote Procedure Call و ...

انواع مختلف دیگه ای می تونه وجود داشته باشه (مثل buffer protocol های گوگل و ...) که من اطلاع زیادی ازش ندارم. اگر پیشنهادی دارید تو کامنت ها بهم بگید که آپدیت کنم و اضافه کنم. تا پست بعدی در پناه یگانه.



نوشته های دیگه ی من

https://virgool.io/@mohammadiashkan1384/%D9%BE%D9%88%D9%84%D8%B3%D8%A7%D8%B2-%D8%AA%D8%B1%DB%8C%D9%86-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%AF%D9%86%D8%AC%DB%8C-%DA%A9%D9%87-%D9%87%DB%8C%DA%86-%DA%A9%D8%B3-%D9%BE%DB%8C%D8%AF%D8%A7-%D9%86%DA%A9%D8%B1%D8%AF%D9%87-yvjon869kvr1
https://virgool.io/@mohammadiashkan1384/%D8%A7%D8%B4%D8%AA%D8%A8%D8%A7%D9%87-%DA%A9%D9%85%D8%A7%D9%84-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D9%88-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D8%AA%D9%85%D8%A7%D9%85-%DB%8C%D8%A7-%D8%B4%DA%A9%D8%B3%D8%AA-%D8%AE%D9%88%D8%B1%D8%AF%D9%87-x4paozrfaje3
https://virgool.io/@mohammadiashkan1384/what-non-technical-skills-does-a-programmer-need-unoqrgvfmo18