PDA

View Full Version : مقایسه ی توانایی های زبانهای FP با OOP



deopen
پنج شنبه 12 دی 1387, 14:40 عصر
سلام, بحث ما در رابطه با زبانهای FP و OOP است, زبان cpp زبانی OOP است البته این چیزی است که در کتابها مینویسند, سوالهای من در رابطه با ماهیت این زبان است و اینکه چرا پیشنهادی با این عنوان ذکر میشود :

یادگیریه یک زبان تابعی لازم است.

آیا عمر زبان برنامه نویسی مهم است؟ آیا هر چه زبان قدیمیتر باشد پس از رده خارج شده است؟ پس چرا زبانی مانند اسمبلی با این همه عمر هنوزم پا بر جا و قوی است؟ چرا دیگر حرفی از زبانهای تابعی مطرح نمیشود؟ زبان cpp سال 1983 آخرین تکامل را طی کرد یکی از دوستان میگوید:


سی پلاس پلاس همسن بیشتر زبان های تابعیه. (از بعضی ها قدیمی تر)


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

C++0x
به حقیقت خواهد پیوست. از نظر من cpp هنوز هم بر زبانهای دیگر برتری دارد و قابل توسعه است.

Nima_NF
پنج شنبه 12 دی 1387, 15:32 عصر
زبان cpp سال 1983 آخرین تکامل را طی کرد اگر منظورتان آخرین نسخه ++C هست خیر، هر چند سال یک استاندارد جدید برای آن به وجود می آید و آخرین استاندارد برای آن سال 2003 هست.
که در حال حاضر استاندارد نسخه C++0x در حال نوشته شدن برای عرضه در سالهای آینده است.

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

Mehdi Asgari
پنج شنبه 12 دی 1387, 15:33 عصر
خب
اولا نمی دونم جای مناسبی سوالت رو مطرح کردی یا نه. (اینو بسپریم به مدیر محترم این بخش)

زبان cpp زبانی OOP است
سی پلاس پلاس یک زبان multi paradigm هست که از برنامه نویسی ساخت یافته ، انتزاع داده ، شی گرایی و generic programming پشتیبانی می کنه ، پس صرفا شی گرا نیست

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

آیا هر چه زبان قدیمیتر باشد پس از رده خارج شده است؟ پس چرا زبانی مانند اسمبلی با این همه عمر هنوزم پا بر جا و قوی است؟
نه (هنوز هم از فورترن و لیسپ که اولین زبان های برنامه نویسی هستن داره استفاده میشه.)
اسمبلی یک زبان ثابت نیست. هر ماشینی یک زبان داره و قرار نیست پابرجا نباشه (وگرنه ما برنامه هامون رو به چی کامپایل کنیم ؟)
باز گفتی قوی. قوی یعنی چی ؟ اگه صرفا منظورت از قدرت ، ارتباط با سخت افزاره خب پس از زبان ماشین استفاده کن. ولی امروزه این حافظه و زمان سی پی یو نیست که مهمه ، وقت برنامه نویسه که مهمه. از این دید هم نگاه کنید که زبانی قوی تره که به برنامه نویس اجازه بده به جای سروکله زدن با بیت و بایت و اشاره گر و ... ، منظورش رو بیان کرده و بیشتر روی الگوریتم و طراحی برنامه تمرکز کنه تا پیاده سازی.
به این میگن expressive-ness

چرا دیگر حرفی از زبانهای تابعی مطرح نمیشود؟
کی گفته ؟
دیالکت های زیادی از Scheme ، LISP ، Haskell ، ML ، ... الان وجود دارن و زود به زود هم آپدیت میشن.
زبان Erlang که یک زبان FP هست توسط شرکت اریکسون طراحی و پیاده سازی شده و برای کارهای real-time و پردازش موازی استفاده میشه (مخصوصا در سیستم های مخابراتی (http://www.erlang-projects.org/Public/success_stories/commercial_use/view)) و تنها زبانیه که شنیدم قابلیت Hot code loading رو داره
زبان هایی مثل پایتون ، روبی ، سی شارپ 3 ، جاوااسکریپت ، ... خیلی از ویژگی های زبان های تابعی بهره گرفتن.
زبان F# که از نسخۀ بعدی ویژوال استودیو در کنار وی بی ، سی شارپ و سی پلاس پلاس جزو زبان های رسمی مایکروسافت خواهد بود یک زبان FP هست که از OCaml مشتق شده (اون هم از ML)
پرفورمنس OCaml (http://shootout.alioth.debian.org/) بسیار نزدیک سی پلاس پلاس هست.
هنوز کتاب داره در این زمینه ها چاپ میشه (آخریش: Real World Haskell)
سی شارپ 3.0 ویژگی هایی رو اضافه کرد که سال ها وجود داشتن در زبان های تابعی (مثل توابع لامبدا ، expression tree ، anonymous types و ...)
نسخۀ پروتوتایپ GC دات نت ابتدا در Common LISP نوشته شد.
Yahoo Store توسط LISP نوشته شده
مایکروسافت علاوه بر F# روی Haskell هم داره سرمایه گذاری می کنه (استخدام Peyton Jones در MS Research)
اینجا رو هم ببین: http://homepages.inf.ed.ac.uk/wadler/realworld/

بله C++0x نسخۀ بعدی استاندارد این زبان هست که الان کمیتۀ مربوطه در ISO دارن روش کار می کنن و احتمالا قبل از پایان سال 2009 نسخۀ final استاندارد بیرون می یاد. (البته الان روی یک سری از ویژگی ها توافق جمع حاصل شده ؛ در این زمینه یه TR دادن به نام TR1 که VC++ 2008 SP1 و C++ Builder 2009 اون رو ساپورت می کنن. مثل regex و smart ptr و hash table و RNG و tuple و ... (tr1 namespace ؛)

از نظر من cpp هنوز هم بر زبانهای دیگر برتری دارد و قابل توسعه است.
به نقل از خالق سی پلاس پلاس:

One language is not necessarily better than another because it possesses a feature the other does not.
اینجا نظر شخصی جمع نمی کنیم. لطفا علمی صحبت کنید (همین حرفت باعث میشه یه سری آدم علاف بیان اینجا و داد سخن در طرفداری از تنها زبانی که بلدن ، بدن.)
(با این که تازه کارم ولی چون با زبان های زیادی کار کردم به این نتیجه رسیدم که مهم نیست از چه ابزاری استفاده می کنم ، مهم اینه که اون زبان بتونه سریع تر منو به هدفم برسونه و مناسب کارم باشه
شده از پایتون در جایی استفاده کنیم که به جای دوهفته کد نویسی در سی پلاس پلاس ، در یک روز کارمون راه افتاده (گرچه پرفورمنس اجرا پایین تر بوده))


آخرین استاندارد برای آن سال 2003 هست
آخرین استاندارد سی پلاس پلاس برای سال 1998 هست. کمیتۀ استاندارد سازی سی پلاس پلاس بعد از انتشار یک استاندارد تا 5 سال به حالت maintenance قرار می گیرن. از 98 تا 2003 حدود 400 تا باگ و مشکل از استاندارد در اومد که سال 2003 یه TC دادن بیرون. (در واقع اصلاح شدۀ سال 1998 بود)
برای اطلاعات بیشتر در این زمینه: http://www.research.att.com/~bs/hopl-almost-final.pdf

پ ن: یادگیری زبان های تابعی (مخصوصا LISP) کار هر کسی نیست. این مقاله رو بخون:
http://www.paulgraham.com/avg.html
(اون وقت می فهمی که چرا فعلا متوجه مزایای زبان های تابعی نیستی. Blub Paradox)

Mehdi Asgari
پنج شنبه 12 دی 1387, 16:08 عصر
البته بهت حق میدم که نگران بازار کار باشی. خب مطمئنا تعداد شغل برای اینطور زبان ها خیلی کمتر از جاوا ، دلفی ، دات نت ، پایتون و ... است. ولی لزومی نداره حتما برای شغل ازش استفاده کنی ، همین که برنامه نویس بهتری بشی کافیه.
با ارائۀ F# توسط مایکروسافت خیلی زود شرکت هایی ایحاد شدن که فقط با این زبان کار می کنن و برنامه نویس F# استخدام می کنن.
تو لینکی هم که در پست قبلیم دادم شرکت ها و سیستم های زیادی رو پیدا می کنی که از زبان های تابعی برای کاراشون استفاده می کنن.(یه مثال کوچولو: http://www.orbitz.com/)

یه نکتۀ دیگه: زبان های تابعی (مخصوصا Haskell در این مورد خاص) خیلی side effect کمی دارن (side effect هر چیزیه که باعث تغییر در حالت برنامه بشه. مثل تغییر مقدار متغیر ها) (به خاطر همینه که زبان های تابعی عملگر انتساب (assignment) ندارن و مقادیر immutable هستن.) بنابراین گزینۀ خیلی خوبی ان برای برنامه نویسی Multi-core (که امروزه خیلی هم تبش داغه.
این مقاله رو حتما بخون : http://www.gotw.ca/publications/concurrency-ddj.htm
یه مشکل دیگه در این زمینه ناآگاهی مدرسین دانشگاهه. چند سال قبل تو یکی از کلاس ها یه نفر از استادمون سوال کرد که آیا میشه در درون یک تابع ، تابع دیگری تعریف کرد. استادمون گفت نه. من گفتم چرا استاد با LISP میشه (اون موقع هنوز اسم بقیه رو نشنیده بودم) استادمون خندید و گفت اون که زبان نیست ،فقط تو هوش مصنوعی کاربرد داره (نتایج اخلاقی: 1- همون کار الان در خیلی از زبان ها از جمله سی شارپ قابل انجامه (متدهای بی نام و توابع لامبدا) 2- هر کاری که با زبان هایی مثل سی شارپ و جاوا و سی پلاس پلاس قابل انجامه توسط زبان های تابعی هم قابل انجامه (به جز کارایی مثل درایور سخت افزاری نوشتن یا دستکاری سخت افزار ؛ در ضمن در جاهایی که یک زبان کم می یاره ، می تونه بدون از دست دادن مزایای برنامه نویسی تابعی ، API های دیکر زبان ها (مخصوصا سی ) رو فراخوانی کنه)

Nima_NF
پنج شنبه 12 دی 1387, 17:06 عصر
آخرین استاندارد سی پلاس پلاس برای سال 1998 هستالبته درست هست که نسخه 2003 فقط شامل تغییرات اصلاحی هست، اما به این شکل نمی توان گفت که 2003 یا همان (ISO/IEC 14882:2003) یک استاندارد نیست.

معمولا در سایت های مختلف این طوری مطرح می کنند که " هر چند 2003 یک استاندارد کامل با قابلیت های جدید نیست، اما آخرین و بزرگترین نسخه استاندارد (major) همان 1998 هست"

کامپایلرهایی مثل gcc هم به این طور مطرح می کنند (چون تمامی 2003 را پیاده سازی نکرده است):




The original ISO C++ standard was published as the ISO standard (ISO/IEC 14882:1998) and amended by a Technical Corrigenda published in 2003 (ISO/IEC 14882:2003).
These standards are referred to as C++98 and C++03, respectively. GCC implements the majority of C++98 (export is a notable exception) and most of the changes in C++03.





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

deopen
پنج شنبه 12 دی 1387, 17:18 عصر
خیلی جالب شد, بله هیچ زبان پرکاربردی از دوره خارج نمی شود, مگر اینکه منافع شرکتهای بزرگی مانند مایکروسافت را به خطر اندازد .


تو با زبان های تابعی کاری رو که میخوای انجام بشه توسط زبان بیان می کنی (و نه چگونگی پیاده سازی اون رو)


این جمله را نمی فهمم, اگر امکان دارد جوری بیان کنید که متوجه بشم.


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


درست است ولی این حرف را خیلی قبول ندارم به هر حال باید 2 مرحله کاری در برنامه نویسی طی شود .
1- طراحی الگوریتم
2- نوشتن برنامه
راستش به زمانی که مرحله دوم کار را حذف کنم نمی توانم فکر کنم, برنامه نویسی بدون بیت و بایت و اشاره گر و ... بسیار ملال آور است!


قابلیت Hot code loading

این چه قابلیتی است؟


زبان F#

راجع به این زبان هم بی اطلاعم.


OCaml

فکر میکنم نیاز به توضیح بیشتر است...

توابع لامبدا چیست؟


regex و smart ptr و hash table و RNG و tuple

می دانم خیلی سوال کردم ولی واقعا به دانستن اینها هم علاقه دارم!


One language is not necessarily better than another because it possesses a feature the other does not

پس هر زبان ویژگی مخصوص به خودش را دارا میباشد و زبانی برای ما بهتر است که زودتر و بهتر و با پرفورمنس خوب مارا به مقصد برساند و پرفورمنس خوب به گذاشتن وقت هم می ارزد!


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


شرمنده , گاهی اوقات این نکته را فراموش میکنم.


یادگیری زبان های تابعی (مخصوصا LISP) کار هر کسی نیست. این مقاله رو بخون

بله حتما, در حال حاضر اشتیاق خاصی به گرفتن جوابهام دارم.


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

ببخشید این تنها حرفی است که کاملا اشتباه است, من اصلا به بازار کار فکر نمکنم , قصد اظهار نظر شخصی ندارم, ولی تنها چیزی که باعث شده در دنیای برنامه نویسی غرق بشم علاقه بوده و بس! اینها را محض اینکه راحتتر قادر باشید جوابهارا به من تفهیم کنید میگم, من واقعا مبتدی هستم و نیاز به اطلاعات دارم.

side effect هر چیزیه که باعث تغییر در حالت برنامه بشه. مثل تغییر مقدار متغیر ها
اگر یک مثال بزنید واقعا عالی میشود.


به خاطر همینه که زبان های تابعی عملگر انتساب (assignment) ندارن و مقادیر immutable هستن.)

چطوری امکان دارد؟ immutable چیست؟


بنابراین گزینۀ خیلی خوبی ان برای برنامه نویسی Multi-core

بحث در مورد این برنامه نویسی نیاز به تاپیکی جداگانه دارد, فقط بگویید چگونه FP در این مورد منحصربه فرد است؟


این مقاله رو حتما بخون : http://www.gotw.ca/publications/concurrency-ddj.htm (http://www.gotw.ca/publications/concurrency-ddj.htm)


بله , چشم.


متدهای بی نام
تاحالا نشنیدم!


آیا میشه در درون یک تابع ، تابع دیگری تعریف کرد.

در مورد این اگر امکان دارد توضیح بدید , واقعا برام جالب است!


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


پس امکانش هست که به مقایسه LISP با ++C بپردازیم و این با موضوع بحث هم مطابقت دارد.

Mehdi Asgari
پنج شنبه 12 دی 1387, 18:15 عصر
این جمله را نمی فهمم, اگر امکان دارد جوری بیان کنید که متوجه بشم.
در زبان هایی که declarative هستن ما بیشتر روی بیان مسئله تاکید داریم تا چگونگی پیاده سازی (یعنی ما روی بخش What تاکید داریم و How رو می سپاریم به کامپایلر)
مثال:
تابعی بنویسید که به صورت بازگشتی مجموع اعضای یک آرایه (لیست) را محاسبه کند: (OCaml و F# ؛)


let rec sum xs =
match xs with
| [] -> 0
| h::t -> h + sum t;;
ببینید ، ما فقط اینجا الگوریتم رو بیان کردیم و دیگه نیازی به درگیر کردن خودمون با جزئیات پیاده سازی نداریم (در واقع از سطح بالاتری داریم به مسئله نگاه می کنیم)
تمرین: همین رو با سی پلاس پلاس نوشته و مقایسه کنید (صد البته این یه مثال خیلی کوچک و جزئیه)
(در زبان های تابعی زیاد از توابع بازگشتی استفاده میشه ولی این کار باعث کندشدن برنامه نمیشه ، چون از tail call optimization استفاده میشه)

راستش به زمانی که مرحله دوم کار را حذف کنم نمی توانم فکر کنم, برنامه نویسی بدون بیت و بایت و اشاره گر و ... بسیار ملال آور است!
مگه برنامه نویسی فقط بیت و بایت و اشاره گره ؟

این که سوال بپرسی هیچ اشکالی نداره. تا جایی که سوادم قد بده کمکت می کنم ، اما به شرطی که اول خودت بری دنبالشون مطالعه کنی ، بعد بیای بپرسی.
جواب خیلی از سوالاتت رو در wikipedia و گوگل پیدا می کنی (بگرد ، بخون ، متوجه نشدی سوال کن)

اگر یک مثال بزنید واقعا عالی میشود.
این ها side effect هستن:
تغییر مقدار یک متغیر ، چاپ یک مقدار در خروجی ، کار با I/O ، ... (البته صددرصد بدون side-effect بودن نه مفیده و نه ممکن. یه خورده که با زبان های تابعی کار کنی می بینی که اصلا عملگر = با اونی که تا الان فکر می کردی فرق داره.مثال هایی می زنم در پست های بعدی)

immutable چیست؟
یعنی غیر قابل تغییر.
در مورد انتساب: زبان های تابعی مثل ریاضی هستن. در ریاضی یه بچۀ راهنمایی هم می دونه که عبارت زیر غلطه:

x = x + 1
در واقع هیچ عبارتی وجود نداره که با یکی بیشتر از خودش برابر باشه (در حالی که در برنامه نویسی چیز دیگری می فهمیم از این عبارت)

بحث در مورد این برنامه نویسی نیاز به تاپیکی جداگانه دارد, فقط بگویید چگونه FP در این مورد منحصربه فرد است؟
با کمتر بودن side-effect نسبت به زبان های دستوری

تاحالا نشنیدم!
anonymous methods

در مورد این اگر امکان دارد توضیح بدید , واقعا برام جالب است!
سی شارپ :


Func<int, int, int> myAdd = delegate(int x, int y) { return x + y; };
Console.WriteLine(myAdd(10, 20));
OCaml:


let myAdd = fun x y -> x + y;;
Scheme:


(define (myAdd)
(lambda (x y)
(+ x y)))

Saeed_m_Farid
جمعه 13 دی 1387, 16:19 عصر
سلام
آقا مهدي خيلي لطف كردين كه اينهمه موضوع رو با بسط توضيح دادين ولي چند تا نكته به نظرم رسيد كه ذكرشون رو بدون استفاده واسه خودم و دوستا نديدم (البته به هيچ وجه قصد مقايسه زبانها درميان نيست! قصدم روشن شدن موضوعه) :

1- شما دارين تو بخش سي نظرات مفيدتون رو مطرح ميكنين و اگه حداقل يه جوري كلماتتون رو انتخاب كنيد كه نياز به ديكشنري نباشه و بچه ها به اونها عادت داشته باشن و يه مقدار شبيه به كلمات كليدي سي باشه فكر كنم بهتر باشه مثلا immutable يه چيزي شبيه const هست كه ما بيشتر بهش نزديكيم.

2- آشنايي با زبانهاي تابعي دقيقا مطابق گفته شما خيلي مفيد و كاربرديه ولي نبايد باعث بشه كه ما كاملا ديدمون به برنامه نويسي عوض بشه مثلا anonymous methods اسميه كه سي شارپ رو define# هاي سي گذاشته و مفهوم جديدي نيست فقط اگه منظور سرعت باشه اتفاقا دست كاربر سي تو اين زمينه بازتره :

#define myadd(x,y) x+y
در ریاضی یه بچۀ راهنمایی هم می دونه که عبارت زیر غلطه3- بعضي جاهاي صحبت شما يكم شبيه مغلطه است : انتساب و شرط تساوي دو مقوله جدا هستند، خوب تو پاسكال =: ميذاريم تو سي = اتفاقا اين واسه راحتي كاربرهاس چون معمولا كاربرد انتساب خيلي بيشتر از بررسي شرط تساويه و شايد بخاطر همينه كه اين عملگر انتخاب شده.


مگه برنامه نویسی فقط بیت و بایت و اشاره گره ؟4- دقيقا حرف شما درسته و محترم ولي اكثر كسايي كه بصورت كاربردي ميان طرف سي بخاطر اينه كه هيچ جاي ديگه اينهمه دست ما رو تو كار با اين موارد باز نذاشتن مخصوصا زبانهاي داتي! درسته خيلي كارها رو راحت كردن و مثلا واسه يه thread‌ كه ما جونمون در مياد واسه مديريتشون اونجا فقط يه متغير تعريف شده كه تابع رو بهش پاس ميدي! يا ArrayList ها و... ولي همونجا هم من چطوري ميتونم پروسس، سمافور يا ميوتكس ها رو مديريت كنم؟ شايد واسه اونهم راه داشته باشن ولي با روش خودش...

از اينها گذشته در اينكه شما چشم ما رو به يه ديدگاه و تفكر جديد باز ميكنيد شكي نيست و ممنون.

Mehdi Asgari
جمعه 13 دی 1387, 20:57 عصر
1- هر محیطی vocabulary خودش رو داره. به هر حال از شماها انتظار میره در مواجهه با یه واژه یا اصطلاح جدید خودتون برید دنبالش و مطالعه کنید. const یه modifier هست که به مقادیر اعمال میشه. در سی ، سی شارپ ، ... این modifier میگه که اون مقدار قابل تغییر نیست. (یعنی writable نیست) اما immutability از مشخصات یک نوع داده (type) هست. مثلا نوع دادۀ String در دات نت ، immutable هست. ما می تونیم مقداری رو به یک رشته بدیم ، منتها این کار باعث ایجاد یک رشتۀ جدید خواهد شد. (ما در زبان های تابعی variable نداریم ، value داریم. همین عدم آشنایی با این مفاهیم و محیط ها باعث ایجاد همچین سوالاتی میشه) همین immutability باعث میشه نگران تغییر مقدارشون نباشیم و بتونیم بین thread های مختلف مقدار ارسال کنیم.
2- اصلا قیاس درستی نبود. #define برای تعریف ماکرو استفاده میشه ، و type checking نداره
(خیلی به پرفورمنس فکر می کنی. این اشتباهه. بزرگی در مورد طرز فکرت میگه:
Premature optimization is the root of all evil)
مثال:


#define mul(x,y) x * y

int main()
{
int x = 10;
int y = 20;
int z = mul(y+2,y);
cout << z << endl;

return 0;
}
انتظار داریم 440 چاپ بشه ، ولی 60 چاپ میشه (می دونم با محصور کردن x و y در پرانتز میشه جلوشو گرفت)
توابع لامبدا (که بر اساس متدهای بی نام کار می کنند) خوانایی برنامه رو بالا می برن. دو کد زیر رو مقایسه کن: (پیدا کردن اولین عضو کوچکتر از 7 در لیستی از اعداد)


// C# 3.0
var numbers = new List<int>() { 10,0,23,4,343};
int sum = numbers.Find(i => i <7);


template<class T> struct Less_Than
{
T value;
Less_Than(const T& v) :value(v) { }
bool operator()(const T& v) const
{
return v < value;
}
};

class Lambda {} ;

template<class T>
Less_Than<T> operator < (Lambda, const T& v)
{
return Less_Than<T>(v);
}

int main()
{
vector<int> v;
v.push_back(10);
v.push_back(0);
v.push_back(23);
v.push_back(4);
v.push_back(343);

Lambda x;

vector<int>::iterator find_lt_7 = find_if(v.begin(),v.end(),x<7);

return 0;
}
3- زبان های تابعی بر پایۀ ریاضیات بنا شدن. برای همینم بیشتر شبیه ریاضی هستن (زیبا ، کم حجم ، دقیق)
فکر کنید 50 ساله زبان های برنامه نویسی ایجاد شدن و هنوز داریم با همون ساختار و سینتکس اون موقع برنامه می نویسیم.

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

Saeed_m_Farid
شنبه 14 دی 1387, 09:08 صبح
به هر حال از شماها انتظار میره در مواجهه با یه واژه یا اصطلاح جدید خودتون برید دنبالش و مطالعه کنید. const یه modifier هست که به مقادیر اعمال میشه
بنده از طرف خودم میگم و دوستان دیگه رو نمیدونم : در مورد مطالب شما اگه مطالعه نمیکردم که در موردش نمیتونستم نظر بدم. منظورم این بود که یه جوری مطالب غیر مرتبط با سی رو بیان کنید که با ذهنیتی که تو سی داریم یه مقدار الفت داشته باشه واسه اینکه همونطور که گفتم تو بخش C هستیم و با این ذهنیت داریم اینجا کار میکنیم اگه رفتیم یه بخش دبگه خوب ذهنیت بالطبع عوض میشه، ولی اگه هیچ سنخیتی نداره که خوب مطمئن باشید که هر کلمه ای که نا آشنا باشه از روش نمی پرم! و حتما به تمام لینکها و کلمات نا آشنا قبل پرسیدن رجوع میکنم.


مثلا نوع دادۀ String در دات نت ، immutable هست.

این تعریف کلاس String تو #C هست من که جایی immutable نمی بینم :


public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>


ما می تونیم مقداری رو به یک رشته بدیم ، منتها این کار باعث ایجاد یک رشتۀ جدید خواهد شد

اونوقت به فرض تو یه حلقه طولانی که داره از یه متغیر String استفاده میشه حافظه سر به فلک میزنه.


خیلی به پرفورمنس فکر می کنی. این اشتباهه.
من و امثال من که با سخت افزار و منابع محدود سیستمی درگیریم کوچکترین اشتباه تو گرفتن و آزاد کردن منابع سیستمی باعث بروز بدترین نوع خطاهایی میشه که developer هایی که دارن dll یا engine ما رو استفاده میکنن میشه، نمیتونم همینطوری فقط به رسیدن به هدف فکر کنم چون مسئولیت درایور و منابع سیستمی با بنده است و باید کاربر از این لحاظ مطمئن باشه که بتونه رو اون مثلا dll کد بزنه...


خوانایی برنامه رو بالا می برن. دو کد زیر رو مقایسه کن
بنظر من لازم نبود کلاس template تعریف کنید که کد اینقدر ناخوانا بشه، من میتونم دقیقا همون تابع لامبادا رو شبیه سازی کنم تو سی ولی واسه من مهمه که اون پشت چه خبره! ضمنا به نظر میرسه که #C هم دقیقا یه کلاس template واسه این کار استفاده کرده.


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

ممنون که وقت گذاشتین.

Mehdi Asgari
شنبه 14 دی 1387, 12:22 عصر
منظورم این بود که یه جوری مطالب غیر مرتبط با سی رو بیان کنید که با ذهنیتی که تو سی داریم یه مقدار الفت داشته باشه واسه اینکه همونطور که گفتم تو بخش C هستیم
به عنوان تاپیک دقت کنید. اسمی از سی برده نشده. قبلا هم بحث شد چون جایی برای بحث در مورد اینطور مطالب در فروم نیست ، به ناچار در این بخش مطرح شد.

این تعریف کلاس String تو #C هست من که جایی immutable نمی بینم :
قرار نیست در تعریف نوشته بشه. رانتایم با رشته ها جدای از بقیۀ ref type ها برخورد می کنه.
(در ضمن همۀ کتابای سی شارپ این نکته رو عنوان می کنن.
Professional .NET Framework 2.0 :


Strings are also immutable (read-only), so you don't have to worry about the contents of a string changing "underneath you" once you have a reference to one.

CLR Via C# :


The most important thing to know about a String object is that it is immutable. That is, once
created, a string can never get longer, get shorter, or have any of its characters changed

اونوقت به فرض تو یه حلقه طولانی که داره از یه متغیر String استفاده میشه حافظه سر به فلک میزنه.
برای کار با رشته ها به میزان زیاد (مثلا در حلقه ها) از System.Text.StringBuilder استفاده میشه. immutability باعث بالاتر رفتن سرعت کار با رشته ها (duplicate نشدن رشته های یکسان ، interning ، سرعت بالای مقایسه ، ...) میشه همچنین رشته ها thread-safe هستن.

بنظر من لازم نبود کلاس template تعریف کنید که کد اینقدر ناخوانا بشه،
با توجه به دانش کمی که از سی پلاس پلاس دارم ، مشتاقم شکل کوتاه شدۀ این کد رو ببینم.

من نگفتم برای کارای سیستمی هم باید از زبان های تابعی استفاده کرد. منتها این زبان ها نشون دادن که پرفورمنسی نزدیک به سی دارن (OCaml) و در سیستم های مخابراتی و real-time هم میشه ازشون استفاده کرد (Erlang)

Saeed_m_Farid
یک شنبه 15 دی 1387, 00:51 صبح
آقاي مهدي خان:
به علت اينكه شما سردبير ما هستين و همچنين خيلي قديمي تر و سرشناس تر از بنده و اكثر دوستان هستيد و حرفهاتون منطقيه من ادامه اين بحث رو حداقل از طرف خودم جايز نميدونم؛ از طرف ديگه اينقدر تو زبانهاي تابعي تخصص ندارم كه بتونم تمام رفرنسهايي كه شما بهشون اشاره كرديد سريعا بررسي كنم و ادامه بحث رو انجام بدم؛ باز از يه طرف ديگه فكر ميكنم بحثمون يه مقدار داره ميره رو فاز مقايسه و off-topic‌ ميشه مگر اينكه مدير بخش در مورد ادامه دادن بحث و مفيد بودنش اظهارنظر كنن و الا بنده به هيچ وجه ادعايي در هيچ زمينه اي ندارم و فقط نسبت به نياز هست كه در هر مقطع و نسبت به هر كاربردي زبان موردنظر رو انتخاب ميكنم و چون تا حالا هيچوقت به زبانهاي تابعي نياز پيدا نكردم (يا نميدونستم كه نياز دارم!) دنبالشون به صورت كاربردي نرفتم.

در مورد اون كلاس template‌ هم منظورم اينه كه با چند تا define و operator ميشه يه چيزي شبيه لامباداي #C رو شبيه سازي كرد حالا اگه شما ميگين نميشه خوب حتما نميشه.
ببخشيد.

با تشكر.

Mehdi Asgari
یک شنبه 15 دی 1387, 01:11 صبح
سردبیر بودن یا مدیر بودن یا قدیمی تر بودن دلیل بر قبول کردن حرف کسی نمیشه (همه اشتباه می کنن. هیچ وقت رو حساب authority حرف کسی رو قبول نکن)
نه خوبه اتفاقا. چون سی پلاس پلاس نمایندۀ خوبی برای زبان های با ویژگی شی گرایی محسوب میشه. در ضمن ما نمی گیم کدوم بهتره ، فقط ویژگی ها رو بیان می کنیم.
اتفاقا من هم زیاد سررشته ندارم و فقط نتیجۀ مطالعات اخیرم رو به عنوان یه تازه کار در حال یادگیری دارم بیان می کنم (و انتظار دارم حرفه ای تر ها اشکالاتم رو گوشزد کنن)
امیدوارم اینطور بحث ها علاقه مندان رو راغب تر کنه برای یادگیری محیط های جدید و متفاوت تا بتونیم در سایۀ این بحث ها (به شکل منطقی و محترمانه) همه مون چیزی از هم یاد بگیریم

در مورد اون template ، من نگفتم نمیشه. گفتم بلد نیستم. باز اگه کسی راه بهتری برای شبیه سازی لامبدا در سی پلاس پلاس داره ، مشتاقم ببینم.

Nima_NF
یک شنبه 15 دی 1387, 15:09 عصر
سردبیر بودن یا مدیر بودن یا قدیمی تر بودن دلیل بر قبول کردن حرف کسی نمیشه (همه اشتباه می کنن. هیچ وقت رو حساب authority حرف کسی رو قبول نکن)
نه خوبه اتفاقا. چون سی پلاس پلاس نمایندۀ خوبی برای زبان های با ویژگی شی گرایی محسوب میشه. در ضمن ما نمی گیم کدوم بهتره ، فقط ویژگی ها رو بیان می کنیم.
اتفاقا من هم زیاد سررشته ندارم و فقط نتیجۀ مطالعات اخیرم رو به عنوان یه تازه کار در حال یادگیری دارم بیان می کنم (و انتظار دارم حرفه ای تر ها اشکالاتم رو گوشزد کنن)
امیدوارم اینطور بحث ها علاقه مندان رو راغب تر کنه برای یادگیری محیط های جدید و متفاوت تا بتونیم در سایۀ این بحث ها (به شکل منطقی و محترمانه) همه مون چیزی از هم یاد بگیریم

در مورد اون template ، من نگفتم نمیشه. گفتم بلد نیستم. باز اگه کسی راه بهتری برای شبیه سازی لامبدا در سی پلاس پلاس داره ، مشتاقم ببینم.
نمی دانم اطلاع دارید یا نه، lambda در C++0x اضافه شده است:
http://blogs.msdn.com/vcblog/archive/2008/10/28/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx

mazdadoost
یک شنبه 15 دی 1387, 15:53 عصر
سلام و خسته نباشید:
زیز ساخت هایه زبانهایه تابعی (به جز #F رویه دات نت ) چه چیز هایی هست. و چطور Scale میشند.
با تشکر.

Mehdi Asgari
یک شنبه 15 دی 1387, 20:39 عصر
نمی دانم اطلاع دارید یا نه، lambda در C++0x اضافه شده است
درسته. (نظرات آقای stroustrup خیلی جالبه. مثلا همین کارشون. یا استفاده از auto که خیلی هوشمندانه بود) (سینتکس جالبی داره)

زیز ساخت هایه زبانهایه تابعی (به جز #F رویه دات نت ) چه چیز هایی هست. و چطور Scale میشند.
منظورتون framework هست ؟
یه سری روی دات نت پیاده شدن
بقیه هم اکثرا به native کامپایل می کنن و همراهشون یک محیط interactive مفسری هم دارن
منظورتون رو از Scale متوجه نشدم.

deopen
یک شنبه 15 دی 1387, 23:05 عصر
پرفورمنس مهم است, بهینه سازی بیجا وجود ندارد و هر بهینه سازی در هر جا مفید است , در صورتی این بهینه سازی بد است که راه رسیدن به هدف را به کلی کج و به بیراهه بکشاند, آیا شما میتوانید در برنامه نویسیه تابعی از تخصیص حافظه بطور دستی استفاده کنید و یا میتوانید از حلقه استفاده کنید تا از کپی مکرر مقادیر و هدر رفتن حافظه جولوگیری شود؟ آیا بهتر نیست به حافظه و سرعت جور دیگری نگاه کنیم و از اطلاف آن جولوگیری کنیم؟ آیا نمی شود از قابلیتهای زبان تابعی در زبان cpp استفاده کرد ؟ بنظر من میشود از قابلیتی مانند توابع مرتبه بلا به گونه ای دیگر استفاده کرد , با استفاده از یک اشاره گر که خود ممکن است به توابعی دیگر اشاره کند, البته این از دید کوتاه من است , چرا یک برنامه باید وقتش را روی محاسبات عددی بگذارد , بله این زبانها میتوانند به سرعت خود اضافه کنند ولی واقعا بهینه سازی را نمیشود بگونه ای درست در آنها اعمال کرد, ولی یادگیری یک زبان تابعی قدرت برنامه نویس را چند برابر میکند , مثلا میشود یک برنامه را ابتدا با زبان تابعی نوشت تا از برنامه دید خوبی بدست آید و در اینجا است که ما جواب را میدانیم و روی طریقه انجام شدن آن تمرکز میکنیم, و در cpp برنامه را مینویسیم , سوال من این است , کدام زبان برای هدف من که حال گفته شد بهتر است هاسکل یا لیسپ؟

Mehdi Asgari
یک شنبه 15 دی 1387, 23:32 عصر
سوال من از تو: چرا الان در سال 2009 ، نیم قرن پس از ایجاد زبان های برنامه نویسی ، در عصری که ماشین ها حداقل 2 گیگابایت رم و یک پردازندۀ خفن 2 هسته ای دارن ، هنوز باید خودمون رو درگیر جزئیات پیاده سازی بکنیم ؟ آیا وقت ما ارزش بیشتری نداره ؟
(بله. من هم اگه بخوام یه بازی یا یه کرنل درایور یا یه کامپایلر برای ARM گوشیم بنویسم مطمئنا کتاب M. Abrash یا Y. Magda جلوم خواهد بود ؛ اما آیا یه برنامه نویس که در حوزۀ سخت افزار یا دستگاه های embedded یا اینطور محیط های resource-constrained کار نمی کنه هم باید خودش رو اینقدر درگیر جزئیات کنه ؟
من منکر مزیت بلد بودن این ها نیستم. (دو کتاب فوق رو هم هر از چندگاهی یه نیم نگاهی بهشون میندازم) تو داری جبهه می گیری. من نمی گم سی پلاس پلاس زبان بدیه (که تصمیم دارم سال بعد بیشترین وقتم رو روش بذارم) من میگم تو با یادگیری یه سری تکنیک های حل مسئله و تغییر نگرشت به برنامه نویسی (حالا از طریق هر ابزاری) در برنامه نویسی با سی پلاس پلاس موفق تر خواهی بود. (نمی گم ول کنید این زبان ها رو و بچسبید به FP ؛ لااقل نه الان در ایران))
هنوز ماها داریم همه چیز رو با مفهوم آرایه و حلقه و بیت و متغیر و ... می بینیم. این بده. وقتی رفتی بالاتر و از زاویه و سطح متفاوتی به برنامه نویسی نگاه کردی ، اون وقت با همین ساختار ها هم هوشمندانه تر برخورد خواهی کرد.

بهتر نیست به حافظه و سرعت جور دیگری نگاه کنیم و از اطلاف آن جولوگیری کنیم؟
برو به http://shootout.alioth.debian.org/ و ببین چند تا مسئله هستن که سی پلاس پلاس تفاوت سرعت فاحشی با زبان های FP داره. من اگه یک مسئله رو با یک زبان بتونم در یک روز حل کنم و همون رو با زبان دیگری در یک هفته و زبان دوم فقط نیم ثانیه تفاوت اجرا و 5 مگابایت مصرف کمتر حافظه رو برام ذخیره کنه ، ترجیح میدم برم سراغ اولی (به هرحال وقت من ارزشمند تر از وقت ماشینه)
در ضمن: همونطور که در کشورهایی مثل فرانسه نرم افزار های زیر ساخت مخابراتی رو با سی پلاس پلاس توسعه دادن ، شرکت هایی هم مثل اریکسون و نورتل و T-Mobile هستن که از Erlang استفاده می کنن (یک طرفه نبین قضیه رو)

کدام زبان برای هدف من که العان گفته شد بهتر است هاسکل یا لیسپ؟
راستش متوجه سوالت نشدم. لطفا دقیق تر بپرس. (ولی قسمت آخر سوالت کاملا مقایسه ای بودا!)

deopen
دوشنبه 16 دی 1387, 00:55 صبح
من میگم تو با یادگیری یه سری تکنیک های حل مسئله و تغییر نگرشت به برنامه نویسی (حالا از طریق هر ابزاری) در برنامه نویسی با سی پلاس پلاس موفق تر خواهی بود.
من هم دقیقا همین را میخواهم, شرمنده قصد قیاس نداشتم ولی گفتم برای هدفی که من در پیش دارم یعنی کمک گرفتن از این زبان نه نوشتن برنامه اصلی در این زبان, کدام زبان مناسبتر است, هرچه قابل فهم تر باشد بیشتر برایم خوب است.

Mehdi Asgari
دوشنبه 16 دی 1387, 04:09 صبح
تجربۀ اندکم اینو میگه:
اگه دات نت کاری ، F# گزینۀ خوبیه (چون نیاز به یادگیری API جدید نداری)
زبان ساده میخوای : Scheme (یه dialect از لیسپه. قبلا تو MIT برای آموزش برنامه نویسی تدریس می شد. اینم کتابشه: http://mitpress.mit.edu/sicp/full-text/book/book.html
(لیسپ سخت تر از اسکیمه و برای کارای جدی تر (فراتر از آموزش) استفاده میشه)
اگه با مخابرات و سیستم های real-time سروکار داری ، بدون شک Erlang
Haskell هم گزینۀ خوبیه (زیبا ، ساده ، pure)

Saeed_m_Farid
دوشنبه 16 دی 1387, 07:02 صبح
سوال من از تو: چرا الان در سال 2009 ، نیم قرن پس از ایجاد زبان های برنامه نویسی ، در عصری که ماشین ها حداقل 2 گیگابایت رم و یک پردازندۀ خفن 2 هسته ای دارن ، هنوز باید خودمون رو درگیر جزئیات پیاده سازی بکنیم ؟ آیا وقت ما ارزش بیشتری نداره ؟
من نميخواستم بازم بحث رو ادامه بدم ولي چون ديدم بچه ها و خود شما تمايل دارين و آقا نيما هم مخالفت نكردن ميگم:

ببينيد صحبت عادت كردن به C نيست؛ مشكل در محدوديت هاست، اگه حتي سرسوزني فكر كنيد دارم از چيزي صحبت ميكنم كه رفتم گشتم پيدا كردمش تا يه جوابي داده باشم مطمئن باشيد در اشتباهيد! اينا دقيقا تو زمينه كاري من و دوستان همكارمون هستند (اينو ميگم تا سوء تعبير نشه):

من دارم وب سرويسها و صفحات وب و يا خيلي كاراي ديگه رو با #C و حتي VB دات نت مينويسم و اگه به فرض ميخواستم سايتي رو با ASP خالي بنويسم حتي پياده سازي يه Dataview با مديريت رخدادهاش واقعا غيرقابل تصور بود! يا پياده سازي يه وب سرويس با C! و خيلي هم كارم رو راحت و مفيد كردن. كارايي كدها ،به حداقل رسيدن ميزان كدنويسي و عدم نگراني مديريت منابع و اشاره گرها و ... رو كاملا قبول دارم؛ و يا منكر مثلا تنوع فوق العاده ليستها و درختها و ساير امكاناتشون نيستم و ضمنا از اين بابت خوب مديونشون هستم.
نياز به زبانهاي نيم قرن پيش زماني واسه ما پيش مياد كه مجبوريم يا مستقيم مثلا با DSPها يا كارتهايي كه با درايورشون درگيريم (اجازه بدين وارد جزئيات نشيم) كد بنويسيم و يا packet decoding خطهاي E1 : چون ما بايد از تو اون پكتهاي بي سروته و نامطمئن يه چيزي دربياريم تا بديمش دست مردم!

ميدونم كه شما Erlang‌ رو براي كارهاي مخابراتي پيشنهاد دادين و نميگين كه با #C يا زبانهاي تابعي واسه سخت افزار كدنويسي كنيم ولي هر چي هم كه بياد اولا واسه يه مورد خاصي بهينه سازي شده و مثل سي همه منظوره نيست و از طرف ديگه اينم در نظر بگيرين كه مسئوليت خيلي سيستمهاي زيربار الان با ماست فكر ميكنين چقدر به ما تو تفكر جديد برنامه نويسي اهميت ميدن؟ يا چقدر ميتونن سيستمهاي فعلي (حالا با هر وضعيتي كه ميتونيم تحويلشون بديم!) رو منتظر بذارن تا ما بتونيم تحقيق كنيم و يا مثلا با Erlang كه فعلا فقط اسمش و يكيمي كلي در موردش ميدونيم اون سيستمهاي فوري و فوتي كه بازارش داره از دستمون درمياد رو پياده سازي كنيم؟ واقعيتش اينجا ما هرچقدر هم تلاش كنيم كه به روز باشيم بازم با محدوديتهايي مواجه هستيم!

از طرف ديگه اتفاقا همون مزايايي كه شما فرمودين بيشتر به ضرر ماست! مثلا يه سرور با دو يا حتي چهار تا CPU : Quad core Xeon و 16 گيگ رم و ... مثلا HP ميگيرن ميگن بفرماييد اين بستر! شما بايد سيستمتون تا ابدالدهر بدون كوچكترين مشكلي كار كنه چون ما خدا تومن پول سرور داديم ديگه چي ميخواين؟ ولي اكثرا مشكل كجاست؟ با اين همه تلاش و فعاليت شبانه روزي و تحقيق و ... مثلا آقايون مخابراتي تو خطهاي E1 پكتهاي ناجور ميفرستن سمت ما و اينقدر اينكار رو ادامه ميدن كه برنامه ديگه نميتونه ignore شون كنه و نتيجه چي ميشه؟ يا هنگ كردن سرور يا رست شدن سرور كه معادل 100 تا نامه اداري و ...
از اين دسته مشكلات تا بخواين واستون ميشمرم چون بلايي كه هر روزه داره سرمون مياد، بستر شبكه ناجور، رد شده خطوط مخابراتي از كنار سيم برق، نداشتن Earth سرورها و حتي بارون و برف‌: همه اينها رو ما بايد تو كدنويسي در نظر بگيريم!!!
خوب كدوم زبان برنامه نويسي بدبختي كه تو اروپا و آمريكا و هرجا غير از ايران ئ با درنظر گرفتن شرايط اونجا بهينه سازي شده مثل سي توسريخوره كه ما هرچي بارش كنيم آخ نگه
ديگه قضاوت رو ميذارم به عهده دوستان ولي اينو درنظر بگيرين كه ما نسبت به شرايط اجتماعمون هم بايد در مورد وقتمون تجديدنظر كنيم.

mazdadoost
دوشنبه 16 دی 1387, 10:02 صبح
منظورتون framework هست ؟
یه سری روی دات نت پیاده شدن
بقیه هم اکثرا به native کامپایل می کنن و همراهشون یک محیط interactive مفسری هم دارن
منظورتون رو از Scale متوجه نشدم.


منظورم پلت فرم هست (غیر از سیستم عامل) مثلا رویه دات نت یا جاوا.(تا بتونن قابلیت هایی مثل Transication-Security-Persistence-ووو رو برایه برنامه نویساشون فراهم کنند.)

در اینجا از Scale توانایی پاسخگویی به کاربران همزمان بالا در محیط هایه توزیع شدس.برایه مثال در دات نت و جاوا مکانیزم هایی هست که به شما این امکان رو میدن (بدون توجه به API مورد استفاده یا زبان یا دیتابس) برنامتون رو از یک سرور شروع کنید و با بالا رفتن کاربران و به تبع باره کاریه سرور با کلاسترینگ و تکنیک هایه دیگه باره کاری برنامه رو با اضافه کردن سرور هایه بیشتر سر شکن کنید.(در این جا من به عنوانه پلت فرم از java و .net استفاده کردم)

سوال اینجاست که در مورد زبان هایی که مثال زدین Scheme ، LISP ، Haskell ، ML به چه شکل میتونیم برنامه هایه توزیع شدمون رو Scale کنیم.
برایه مثال وقتی میگید :Yahoo Store توسط LISP نوشته شده .
در مورده : بقیه هم اکثرا به native کامپایل می کنن و همراهشون یک محیط interactive مفسری هم دارن منظورتون اینه که Scheme ، LISP ، Haskell ، ML برایه یه ماشین مجازی کد اجرایی درست میکنند یا برایه CPU واقعی یا برایه مفسر!؟ منظورتون از Native رو روشنتر بفرمایید.
با تشکر.

Mehdi Asgari
دوشنبه 16 دی 1387, 11:24 صبح
در مورد تکنیک های scaling و ... کار عملی نکردم هنوز و نمی دونم.
(نمی دونم ربطی به سوالت داره یا نه ولی به عنوان نمونه سیستم مخابراتی انگلستان با Erlang پیاده سازی شده که در سال فقط 31 میلی ثانیه down-time داره (یعنی تقریبا 100 درصد پاسخگویی))
{یه تکنیک دیگه که مختص Erlang هست ، استفاده از lightweight process ها در سطح زبان (و مستقل از پلتفرم) هست که به شما این قابلیت رو میده که بدون سربار ایجاد process توسط سیستم عامل ، میلیون ها process ایجاد کنید (هرکدوم برای یه task خاص)}
من می دونم Yahoo Store توسط لیسپ پیاده سازی شده ، اما نمی دونم با چه تکنیک هایی به افزایش بار روی سرور (تعداد کاربران ، ...) جواب میدن. (یعنی نمی دونم این ربط مستقیم به زبان داره یا تکنیک های سخت افزاری)

منظورتون از Native رو روشنتر بفرمایید.
کلمۀ code رو انداختم. منظورم ایجاد کد native برای پلتفرمی که روی اون اجرا میشه. (مثلا exe برای ویندوز)

پ ن: در حال حاضر دارم روی Erlang و فریم ورک وب (http://erlyweb.org/) و وب سرورش (http://yaws.hyber.org/) مطالعه می کنم. پس از کسب دانش بیشتر (در مورد سوالاتتون) جوابتون رو تا حد دانشم می نویسم

Saeed_m_Farid عزیز:
حرفات قبوله. هیچ بحثی هم نیست. من فقط پیشنهاد یادگیری یک چیز جدید دادم ، حالا اگه وقتشو نداری یا به سودآوری مالیش فکر می کنی ، OK

آف تاپیک: دیشب خوندم که facebook هم از Erlang استفاده می کنه

Saeed_m_Farid
دوشنبه 16 دی 1387, 11:43 صبح
در حال حاضر دارم روی Erlang و فریم ورک وب (http://erlyweb.org/) و وب سرورش (http://yaws.hyber.org/) مطالعه می کنم.دست مارو هم بگيرين، اگه ما رو هم از پيشرفتهاتون مطلع كنيد ممنون ميشم (اگه يه تاپيك در اين زمينه تو هرجايي زدين به ما هم خبر بدين بيزحمت).


به عنوان نمونه سیستم مخابراتی انگلستان با Erlang پیاده سازی شده که در سال فقط 31 میلی ثانیه down-time داره (یعنی تقریبا 100 درصد پاسخگویی)
اميدوارم كه روي صحبتتون با من و stablity برنامه هاي داخلي نباشه، اونا يه كار بزرگ فوق العاده تيمي رو به نتيجه رسوندن ولي سيستمهاي ما با نميگم حداقل ولي امكانات كم و نيروي كار خيلي كمتر و بازم سوددهي خيلي خيلي كمتر پيش ميره ولي بازم سعي مي كنيم بهترين نتيجه رو تحويل بديم و واسه همين از شماها كمك و راهنمايي ميخواهيم.


یا به سودآوری مالیش فکر می کنیدستتون درد نكنه!

Mehdi Asgari
سه شنبه 17 دی 1387, 16:23 عصر
این ویدئو رو ببینید : (مخصوصا علاقه مندان به مخابرات و سیستم های real-time و همینطور اون دوستی که می خواست بدونه hot code loading چیه)
http://video.google.com/videoplay?docid=-5830318882717959520
(حجم: 30 مگابایت)
من که ذوق زده شدم
پ ن: این ویدئو مال 19 سال قبله (سینتکس Erlang اون موقع با الان فرق داره)
پ ن 2: قیافه های جالبی دارن

Mehdi Asgari
جمعه 04 بهمن 1387, 15:53 عصر
از این پست بیش از یک سال میگذره ولی جالبه که بدونید از زبان های تابعی در چه شرکت هایی الان داره استفاده میشه (البته بیشتر مشاغل OCaml رو در بر داره)
http://flyingfrogblog.blogspot.com/2007/09/functional-programming-in-industry.html