تالار گفتمان مانشت
تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - نسخه‌ی قابل چاپ

تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - ldns0098 - 06 آذر ۱۳۹۳ ۱۲:۳۸ ب.ظ

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

پ.ن: در کنکور ۸۱ علوم کامپیوتر به صورت ضمنی تفوت این دو مورد پرسش قرار گرفته

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - MShariati - 06 آذر ۱۳۹۳ ۰۱:۵۱ ب.ظ

(۰۶ آذر ۱۳۹۳ ۱۲:۳۸ ب.ظ)ldns0098 نوشته شده توسط:  ممنون میشم کسی راهنمایی کنه البته تو سایتهای خارجی مطلب زیاد بود اما خیلی تکنیکال بودن. من تفاوت بارزشون رو میخوام بدونم.

پ.ن: در کنکور ۸۱ علوم کامپیوتر به صورت ضمنی تفوت این دو مورد پرسش قرار گرفته

سلام
البته من تو این زمینه خیلی اطلاعات ندارم ولی فکر کنم جواب شما این باشه:
در زبان‌های روالی، شما باید ریز روال انجام کارها رو مشخص کنی و با متغیرها و دستکاری داده سروکار داری. مثلاً برای جابجایی مقدار دو متغیر اول یک متغیر موقت ایجاد میکنی و ...
در زبان‌های تابعی شما قدری سطح بالاتر عمل می‌کنید و با دستکاری مستقیم داده‌ها سروکار ندارید بلکه عملکردها و تابع‌ها رو بصورت تودرتو فراخوانی می‌کنید. برنامه‌نویسی با JQuery تا حدی با این نوع برنامه‌نویسی شباهت داره. در این روش از تئوری توابع بازگشتی ریاضیات استفاده می‌شه و برخلاف روش قبلی اینجا ترتیب انجام کارها چندان مهم نیست.

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - ldns0098 - 06 آذر ۱۳۹۳ ۰۲:۵۲ ب.ظ

(۰۶ آذر ۱۳۹۳ ۰۱:۵۱ ب.ظ)MShariati نوشته شده توسط:  سلام
البته من تو این زمینه خیلی اطلاعات ندارم ولی فکر کنم جواب شما این باشه:
در زبان‌های روالی، شما باید ریز روال انجام کارها رو مشخص کنی و با متغیرها و دستکاری داده سروکار داری. مثلاً برای جابجایی مقدار دو متغیر اول یک متغیر موقت ایجاد میکنی و ...
در زبان‌های تابعی شما قدری سطح بالاتر عمل می‌کنید و با دستکاری مستقیم داده‌ها سروکار ندارید بلکه عملکردها و تابع‌ها رو بصورت تودرتو فراخوانی می‌کنید. برنامه‌نویسی با JQuery تا حدی با این نوع برنامه‌نویسی شباهت داره. در این روش از تئوری توابع بازگشتی ریاضیات استفاده می‌شه و برخلاف روش قبلی اینجا ترتیب انجام کارها چندان مهم نیست.

ممنون. بعد با توجه به این توضیح عدم وجود side effect در زبانهای رویه ای رو چطور توجیه میکنین؟

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - MShariati - 06 آذر ۱۳۹۳ ۱۰:۴۱ ب.ظ

(۰۶ آذر ۱۳۹۳ ۰۲:۵۲ ب.ظ)ldns0098 نوشته شده توسط:  
(06 آذر ۱۳۹۳ ۰۱:۵۱ ب.ظ)MShariati نوشته شده توسط:  سلام
البته من تو این زمینه خیلی اطلاعات ندارم ولی فکر کنم جواب شما این باشه:
در زبان‌های روالی، شما باید ریز روال انجام کارها رو مشخص کنی و با متغیرها و دستکاری داده سروکار داری. مثلاً برای جابجایی مقدار دو متغیر اول یک متغیر موقت ایجاد میکنی و ...
در زبان‌های تابعی شما قدری سطح بالاتر عمل می‌کنید و با دستکاری مستقیم داده‌ها سروکار ندارید بلکه عملکردها و تابع‌ها رو بصورت تودرتو فراخوانی می‌کنید. برنامه‌نویسی با JQuery تا حدی با این نوع برنامه‌نویسی شباهت داره. در این روش از تئوری توابع بازگشتی ریاضیات استفاده می‌شه و برخلاف روش قبلی اینجا ترتیب انجام کارها چندان مهم نیست.

ممنون. بعد با توجه به این توضیح عدم وجود side effect در زبانهای رویه ای رو چطور توجیه میکنین؟

Side Effect نداشتن، هدفیه که تا جایی که من می‌دونم فقط مربوط به زبان‌های تابعیه و معنای اون اینه که با اجرای یک تابع، غیر از خروجی مورد انتظار از اون تابع، اثر جانبی دیگه‌ای ازش بجا نمونه. اصطلاحاً Stateless عمل کنه و داده و اطلاعات دیگه‌ای از اجراهای قبلیش رو حفظ نکنه. این خاصیت باعث می‌شه که عملکرد زبان به لحاظ ریاضی رسمی‌تر و قابل تحلیل و تضمین باشه.

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - blackhalo1989 - 06 آذر ۱۳۹۳ ۱۱:۰۲ ب.ظ

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

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - ldns0098 - 07 آذر ۱۳۹۳ ۰۱:۰۸ ق.ظ

(۰۶ آذر ۱۳۹۳ ۱۱:۰۲ ب.ظ)blackhalo1989 نوشته شده توسط:  یه زمانی یه مطالعاتی راجع به زبان های مختلف داشتم. اینها چیزایی هست که یادم مونده. الزاما ممکنه درست نباشه البته.
ساید افکت یعنی هر زمانی یه سری ورودی خاص به یه تابع بدید یه سری خروجی خاص رو تحویل بگیرید. در یه زبان غیر تابعی، خروجی یک تابع تابعی از ورودی ها + وضعیت هست. مثلا ممکنه یه تابع داشته باشید که خروجیش به مقدار یه متغیر global وابسته باشه. در این صورت ممکنه یه ورودی خاص در زمان های مختلف خروجی های متفاوتی داشته باشه. اگر نفهدمیدید مفهوم ساید افکت رو بگید تا مثال واقعی بزنم.
وقتی ساید افکت حذف شد میتونید خیلی راحت برنامه رو concurrent کنید چون دیگه احتیاجی به رعایت انحصار متقابل نیست.

یعنی شما میگین ساید افکت تو زبانهای تابعی رخ نمیده؟!
والا اصل سوال اصن این بود که میپرسید اگه زبان روالی باشه، چه وِیژگی ای داره؟ و پاسخ این بود که هرگز ساید افکت رخ نمیده، من هم حساس شدم که چرایی این موضوعو پاسخ بدم. البته میشه حفظش کرد! ولی ترجیح میدم بفهمم چرا

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - blackhalo1989 - 07 آذر ۱۳۹۳ ۰۱:۲۸ ق.ظ

(۰۷ آذر ۱۳۹۳ ۰۱:۰۸ ق.ظ)ldns0098 نوشته شده توسط:  
(06 آذر ۱۳۹۳ ۱۱:۰۲ ب.ظ)blackhalo1989 نوشته شده توسط:  یه زمانی یه مطالعاتی راجع به زبان های مختلف داشتم. اینها چیزایی هست که یادم مونده. الزاما ممکنه درست نباشه البته.
ساید افکت یعنی هر زمانی یه سری ورودی خاص به یه تابع بدید یه سری خروجی خاص رو تحویل بگیرید. در یه زبان غیر تابعی، خروجی یک تابع تابعی از ورودی ها + وضعیت هست. مثلا ممکنه یه تابع داشته باشید که خروجیش به مقدار یه متغیر global وابسته باشه. در این صورت ممکنه یه ورودی خاص در زمان های مختلف خروجی های متفاوتی داشته باشه. اگر نفهدمیدید مفهوم ساید افکت رو بگید تا مثال واقعی بزنم.
وقتی ساید افکت حذف شد میتونید خیلی راحت برنامه رو concurrent کنید چون دیگه احتیاجی به رعایت انحصار متقابل نیست.
یعنی شما میگین ساید افکت تو زبانهای تابعی رخ نمیده؟!
والا اصل سوال اصن این بود که میپرسید اگه زبان روالی باشه، چه وِیژگی ای داره؟ و پاسخ این بود که هرگز ساید افکت رخ نمیده، من هم حساس شدم که چرایی این موضوعو پاسخ بدم. البته میشه حفظش کرد! ولی ترجیح میدم بفهمم چرا
زبان هایی که تابعی خالص باشن (pure functional) ساید افکت ندارن.
زبان های روالی ساید افکت دارن.
چیزی که تو ذهنمه ولی مطمئن نیستم اینه که یه زبان تابعی خالص اصلا متغیر نداره. بنابراین اصلا نمیتونه حالت رو نگه داره پس نمیتونه ساید افکت هم داشته باشه.
حفظ کردن این مفاهیم مثل رویکرد حرفه و فن دوره راهنماییه که الان من چیزی ازش یادم نمونده. این مسایل رو باید واقعا تو عمل دید نه اینکه حفظ کرد. مثلا باید یه مدت با یه زبان تابعی خالص مثل هسکل کار کرد تا بفهمید منظور از ساید افکت و حالت چیه و چطور میشه برنامه رو همزمان کرد.

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - ldns0098 - 07 آذر ۱۳۹۳ ۰۹:۴۹ ق.ظ

(۰۷ آذر ۱۳۹۳ ۰۱:۲۸ ق.ظ)blackhalo1989 نوشته شده توسط:  زبان هایی که تابعی خالص باشن (pure functional) ساید افکت ندارن.
زبان های روالی ساید افکت دارن.
این دقیقا عکس چیزیه که تو کتاب گفته.Exclamation

RE: تفاوت زبانهای روالی(پروسه ای) با زبانهای تابعی - Ametrine - 07 آذر ۱۳۹۳ ۱۰:۴۷ ق.ظ

(۰۷ آذر ۱۳۹۳ ۰۹:۴۹ ق.ظ)ldns0098 نوشته شده توسط:  
(07 آذر ۱۳۹۳ ۰۱:۲۸ ق.ظ)blackhalo1989 نوشته شده توسط:  زبان هایی که تابعی خالص باشن (pure functional) ساید افکت ندارن.
زبان های روالی ساید افکت دارن.
این دقیقا عکس چیزیه که تو کتاب گفته.Exclamation

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.
یه جدول از مقایسه ی انواع مدل های زبان های برنامه سازی نوشته
برای زبان های تابعی نوشته که ساید افکت ندارن.