بهترین زبان برنامه‌نویسی (با معرفی مختصر پارادایم‌های برنامه‌نویسی)


  • کدوم زبون رو از همه بیشتر دوست داری؟
  • احتمالا انتظار داری بگم پایتون یا جاوا، ولی racket!
  • رَکِت چه کوفتیه؟!
  • حالا صبر کن می‌گم :)

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

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

این ترم یه درس دارم با عنوان طراحی زبان‌های برنامه‌نویسی یا PL. معمولا ترم 6 به بعد برمی‌دارن و من به دلیل کراشی که رو استادش داشتم، برداشتم. استادش دکتر محمد ایزدیه که یه ارشد فلسفه علم هم داره و موجود عمیقیه. تو این درس یه مفهومی به نام "پارادایم‌های برنامه‌نویسی" مطرح می‌شه، آشنایان با فلسفه علم احتمالا یاد پارادایم‌های کوهن می‌افتن، پارادایم‌های برنامه‌نویسی هم چیزهای مشابهی هستند، هر پارادایم یک روش و نگاهی متفاوت به برنامه‌نویسیه، هر پارادایم گویا دنیایی جداست، منطق و روشی متفاوت برای حل مسائل و فکر کردن. مثلا یه پارادایم logic programming یا برنامه‌نویسی منطقی داریم که اساسش منطق محمولاته و شما یه سری گزاره رو به برنامه می‌دید و برنامه گزاره‌های دیگری رو از اون‌ها استنتاج می‌کنه، تو این پاراداریم همه چی به صورت ویژگی و روابط بین اشیاء دیده می‌شه، همون‌طورکه تو منطق می‌بینیم. یا مثلا معروف‌ترین و پرکاربردترین پارادایم، imperative programming یا برنامه‌نویسی دستوری هستش که نگرشی نزدیک به فیزیک کامپیوتر و سخت‌افزاره، که ما یکسری state یا وضعیت تو حافظه داریم، مثل اینکه تو فلان خونه‌ی حافظه فلان عدد و فلان جمله و فلان متغیر ذخیره شده، و برنامه‌نویسی یعنی مجموعه‌ای از دستوراتی که این stateها یا وضعیت برنامه رو تغییر می‌دن. دستوراتی مثل "یه خونه تو حافظه تخصیص بده"، "تو اون خونه فلان عدد رو بریز"، "حالا اون عدد رو با این یکی جمع کن و حاصل رو تو این متغیر ذخیره کن" و... برنامه‌نویسی دستوری خودش شامل دو پارادایم رویه‌ای(شامل زبون C) و پارادایم شی‌گرا (شامل C++ و جاوا) می‌شه. تو پارادایم شی‌گرا ما یه سری موجودیت یا کلاس تعریف می‌کنیم (کلاس‌ها رو شبیه مُثُل افلاطونی در نظر بگیرید:) ) مثل "انسان"، حالا برای این کلاس یه سری ویژگی تعریف می‌کنیم، مثل "اسم"، "قد"، "سن"، و حالا از این کلاسی که تعریف کردیم می‌تونیم یک شیء یا نمونه بسازیم، و برای ویژگی‌هاش مقدار تعیین کنیم، که مثلا اسمش "امیرعلی" باشه و قدش 175 و سنش 20. اینجوری به وسیله برنامه‌نویسی شیءگرا دنیا رو شبیه سازی می‌کنیم و تو صنعت می‌شه گفت پرکاربردترین پارادایمه. چون شما تو دنیای واقعی یه سری کلاس و شی مثل ماشین و کامپیوتر و کارمند و مشتری دارید و می‌تونید اینها رو به وسیله این پارادایم شبیه‌سازی کنید.

و اما functional programming یا برنامه‌نویسی تابعی، تو این پارادایم اصلا دیدگاه دستوری نداریم، متغیر و حافظه و اینا رو فراموش کنید، یه سری مقادیر ورودی داریم که کاربر می‌ده، باید با اعمال پی‌درپی یه سری تابع بر ورودی‌ها، خروجی مدنظر رو بسازیم. هر عبارتی در زبان‌های فانکشنال اعمال یه تابع به یه ورودیه و در نتیجه خروجی داره. طبعا خبری از حلقه‌های for و while هم نیست و باید همه چیز رو با تابع بازگشتی بنویسید :) شاید بگید اوه چه همه محدودیت! ولی وقتی شروع کنید به حل مسئله می‌بینید که برخی مسائل، مخصوصا مسائل بازگشتی چقدر زیبا حل می‌شن! خلاصه خیلی نمی‌تونم توصیف کنم این پارادایمو، باید باهاش کار کنید تا دست‌تون بیاد. اگه دوست دارید درباره پارادایم تابعی و دستوری بیشتر بدونید می‌تونید این ویدئو رو ببینید.


حالا racket یه زبون فانکشناله که برای طراحی زبان‌های جدید استفاده می‌شه. اگه بخواید برنامه‌نویسی با racket رو امتحان کنید، این توتاریال هست، و می‌تونید از این لینک ادیتورش رو هم دانلود کنید. زبان‌های lisp و scheme هم مشابه racketان، haskell اما یه زبون فانکشنال نسبتا متفاوته که خودم هم ایده چندانی درباره‌اش ندارم. در نهایت اگر دانشجوی کامپیوتر هستید می‌تونید درسش رو بردارید.

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