تفاوت برنامه نویسی imperative و functional


#1

این مثال رو تو یه مقاله خوندم. ولی پاراگراف دومش رو نفهمیدم. یعنی سرعت یه برنامه ای که با یه زبان functional نوشته شده، سریعتر از همون برنامه هست که با یه زبان imperative رو همون کامپیوتر نوشته شده؟ اصلاً منظورش چیه؟ میگه هر وقت بخواییم میتونیم به مقدار دلخواهمون دسترسی داشته باشیم؟ خوب مگه محاسبه نباید بشه و این محاسبه زمانبر نیست؟

" متغیر ها مثل کشوهای یه میز هستن. بنابراین اگه به جز شما چند نفر دیگه هم از اون میز توی محل کار استفاده کنن، احتمالش هست یه روز که برای پیدا کردن یه منگنه یه کشو رو باز می کنید، همه چی اون تو ببینید جز منگنه! (اثر جانبی)
میشه اینجوری جواب داد که:
خوب، تو محل کار، من اتاق خودم رو دارم. (برد متغیر)
و کشویی که استفاده می کنم قفله و کلیدش فقط دسته منه. (متغیر خصوصی)"

" اما آیا مطمئن هستین که دقیقاً اون وقتی که به منگنه احتیاج پیدا می کنید، همون موقع بش دسترسی هم خواهید داشت و میتونید پیداش کنید؟
اگه بلافاصله نتونید منگنه رو پیدا کنید زمین به آسمون نمیاد. ولی اگه برنامۀ سیستم رانش معکوس یه هواپیما که تو ارتفاع 30000 پایی در حاله پروازه، نتونه مقدار مناسب رو تو یه متغیر پیدا کنه، فاجعه به بار میاد.
با برنامه نویسی functional میشه برنامه های مطمئنتر و استوارتری (robust) نوشت."


#2

زبان های functional چون در آنها متغیر وجود نداره و حافظه یک داده هیچ وقت تغییر نمیکنه به راحتی میشه برنامه را روی چند cpu به صورت parallel اجرا کرد
immutability علاوه بر این که به ارتقا پذیری بسیارکمک میکنه درک برنامه را بسیار آسان میکنه چون همیشه داده همونی هست که برنامه نویس انتظار داره و تغییر نمیکنه
در اینکه سرعت برنامه های functional از imparative بیشتره در کل بله اما چند استثنا وجود داره
در کل برنامه هایی که از cpu بیشتر استفاده میکنن در FP سرعت بیشتری دارند و برنامه هایی که از memory بیشتر استفاده میکنن با یک سری بهبود در زبان های functional بهترند اما در برخی موارد بخاطر تعلق گرفتن memory بیشتر با کپی کردن داده برنامه های FP حافظه بیشتری استفاده میکنن


#3

خوب نبودن متغیر باعث نمیشه کاربرد اون زبان محدود بشه؟ مثلاً بدون متغیر میشه رابط کاربری یا برنامه های گرافیکی ساخت یا اصلاً این زبان ها برای این جور کارا ساخته نشدن؟ clojure هم functional هست دیگه؟ common lisp هم همینطور؟ این زبانها محدودن یا میشه کارهایی که با python انجام میدیم با اونها هم انجام بدیم؟


#4

متغیر وجود نداره به این معنا نیست که داده رو در یک جا نمیتونی نگاه بداری یعنی نمیتونی بعدا تغییر بدی

بر عکس موجبه قدرت این زبان هاست


#5

دستت درد نکنه. واقعاً جالب شد. بیشتر راجع به زبانهای functional میخونم و اگه خواستم در کنار python چیز دیگه ای یاد بگیرم هم یه همچین زبانی انتخاب می کنم.


#6

به مثال نگاه کن

val myList: List[Int] = List(1,2,3)
val doubled:List[Int] = myList.map(x=> x*2)
val filterd: List[Int] = doubled.filter(x=> x<2)

در زبان های functional برنامه با اعمال تابع روی داده , داده جدید درست میکنه برنامه در واقع یک سری از دگرگونی ها توسط تابع ها هست که داده جدید درست میکنه
اغلب در FP نمیگی که چطور برنامه کار کنه بلکه چه کار کنه یعنی declarative


#7

اگر مقاله انگلیسی هست، اصل مقاله رو میشه لطف کنی لینک کنی اینجا؟


#8

متاسفانه انگلیسی نیست. یه مجموعه کتاب هست که ریاضیدانهای فرانسوی برای اونهایی نوشتن که ریاضیات سطح بالا نمیدونن. این مقاله تو یکی از اون کتابها بود که موضوعش کلاً الگوریتم بود. تو اینترنت اکثرشون رو میشه دانلود کرد.
bibliothèque tangente, les algorithmes, numéro 37
اسم مقاله هم هست la programmation fonctionnelle.


#9

لینک خود مقاله رو میشه لطف کنید؟


#10

جز این (http://publimath.univ-irem.fr/biblio/AAT13334.htm) که صرفاً یه توضیح راجع به کتاب و فهرستشه، چیز دیگه ای ندیدم. من خودم کتابو دانلود کردم و اون مقاله توش هست.


#11

منظورم اینه که کلا وقتی یک مقاله عنوان میشه منبع هم داشته باشه که دیگران هم استفاده کنند


#12

این کتاب رایگانه؟


#13

آها. باشه. از این به بعد منبع رو هم میزارم.
فکر نمیکنم. پشتش قیمت داره. ولی تقریباً همه کتابای این مجموعه تو اینترنت واسه دانلود گذاشته شدن.


#14

ببخشید من لینک های کتاب رو به دلیل قوانین سایت پاک کردم