PDA

View Full Version : f# در مقایسه با scala



r00tkit
پنج شنبه 10 تیر 1389, 23:57 عصر
سلام

همیشه بحث (دعوا) سر java و C#‎ بود

حالا من می خوام بدنم این دو (F# و scala) چه فرق هایی دارن یعنی یه مقایسه ی کاملا فنی می خوام

سرچ کردم و چیز هایی که پیدا کردم اینه که

f# با syntax ml هستش ولی scala با lisp
کی .net ان یکی Java Virtual Machine

و

نبود IDE درست حسابی برای scala

پشتیبانی رو نمی دونم ولی scala یه 6 تا کتاب داره

F# focusses more on the functional aspect than Scala, and Scala focusses more on the OO

دوستان راهنمایی کنن

ممنون

Mehdi Asgari
جمعه 11 تیر 1389, 13:09 عصر
بزرگ ترین تفاوت این دو موجود در اینه که #F روی پلتفرم دات نت و Scala روی پلتفرم جاوا اجرا میشه (البته پورتی از Scala بر روی دات نت موجوده، ولی قدیمیه و ظاهرا ولش کردن به امون خدا)
اون کسی که گفته Scala شباهتی با LISP (از هر لحاظ) داره ، یا لیسپ نمی دونه چیه یا دستت انداخته (شاید هم منظورش Clojure بوده که یک لیسپ مدرن با سینتکسی تمیزتر و سوار بر سکوی جاوا هست). در واقع Scala ایده های زیادی از ML ، Erlang و جاوا گرفته.
IDE تا جایی که من اطلاع دارم IntelliJ هست و Emacs (شاید Eclipse هم باشه ، نمی دونم) که خب بالطبع قابل قیاس با Visual Studio نیستند.
هر دوی زبان ها هم ویژگی های شی گرایی رو پشتیبانی می کنن و هم تابعی، اما درصد ها متفاوته. #F بیشتر یک زبان تابعی هست تا شی گرا (یعنی هم از لحاظ ظاهری و نیز ویژگی های پیشتیبانی شده ، #F بیشتر یک زبان تابعی محسوب میشه) در مقابل Scala شبیه یک جاوای تمیز و موجز + کمی ویژگی های تابعی هست.
پشت #F موتور تبلیغاتی مایکروسافت ، پشتیبانی اون و نیز جامعۀ برنامه نویسان بزرگ تری وجود داره (Scala متعلق به یک شرکت نیست)
موفقیت های تجاری #F رو قبلا در این تالار گفتم؛ در مورد Scala ، بزرگ ترین افتخارشون سویچ کردن توییتر از روبی به این زبانه (پارسال خبرش رو هم در فروم آوردم) (چند جای دیگه هم هستن که از Scala استفاده می کنن مثل EDFT فرانسه ، یا Capital IQ Clarifi)
سازنده های این دو زبان ، تفاوت های عمده ای دارن. هر دو از دنیای دانشگاه و تحقیقات اومدن، ولی Don Syme آدم پرگماتیکیه، قبلا هم طراحی و پیاده سازی Generics رو که در نسخۀ 2.0 به دات نت اضافه شد ، در کارنامه اش داره؛ Martin Odersky آدم آکادمیکی هست، همین باعث میشه که Scala هم مثل Haskell شده آزمایشگاه تست ویژگی های مختلف زبان های برنامه نویسی. Syme همواره سعی می کنه از روش هایی استفاده کنه که قبلا کاربردی بودن خودشون رو نشون دادن (خیلی جاها در #F می بینید که یک چیزی که شاید ظاهر خفن و عنوان دهن پر کنی داشته ، حذف شده و به جاش یه قابلیت کاربردی معرفی شده. مثلا OCaml که زبان مادر #F هست ، operator overloading نداریم و #F این قابلیت رو اضافه کرد. یا Polymorphic Variant ها در #F وجود ندارند. یا مثلا سینتکس پیش فرض #F ، مثل پایتون به تورفتگی ها حساسه و همین باعث کوتاه تر شدن و مرتب تر شدن کد شده.)
از نظر Type Inference وضع #F بسیار بهتر هست (سعی شده تا حد امکان برنامه نویس هیچ Type ای رو موقع تعریف متغیر ها ننویسه )
این دو تابع مشابه رو ببینید:


class Factorial1 {
def factorial(n: Int): Int = {
if (n <= 1) 1
else n * factorial(n - 1)
}
}

پیاده سازی F#:


let rec factorial n =
if(n <= 1) then 1
else n * factorial(n-1)
Scala از actor ها به صورت ذاتی و first class پشتیبانی می کنه (مثل Erlang) ولی در #F باید از کلاس MailboxProcessor استفاده کرد (یعنی در هر دو میشه از message passing استفاده کرد ، ولی در Scala حجم کد کم تر و کد خوانا تر هست)
Scala از Tail Call Recursion به صورت کامل پشتیبانی نمی کنه (علتش هم محدودیت پلتفرم زیرین هست ، نه خود زبان) در حالی که دات نت از همون نسخۀ بتای اولیه در سال 2000 از این ویژگی در رانتایم استفاده می کرد. (پشتیبانی Scala محدود هست و شرایط خاصی داره و در برخی شرایط باید از trampoline استفاده کرد که باعث ناخواناتر شدن کد و نیز کند تر شدن اون خواهد شد)
{خیلی ها Scala رو با آرگومان های مختلفی ، یک زبان تابعی کامل و واقعی نمی دونن. یکی از این آرگومان ها اینه که توابع در این زبان first class نیستن و برنامه نویس باید از method ها یا در واقع function member ها استفاده کنه}
همچنین #F پشتیبانی بهتری از پارامترهای جنریک داره.
مثال:تابعی که نوع برگشتیش از نوع آرگومان ورودی اش هست (به صورت جنریک)


F#:
let f x = x
Scala:
def f[A](x:A) = x
C#:
T f<T>(T x) { return x; }

به غیر از TCO و first class function ها که یک زبان تابعی باید ازشون پشتیبانی کنه ، Algebraic Data Type ها هم جزو ویژگی هایی هستن که زبان هایی مثل OCaml و #F از اون ها پشتیبانی کرده و خیلی به درد می خورن (مخصوصا در ایجاد DSL ها)
مثال:


F#:
type MyADT =
| Foo of int
| Bar of string
| Baz
Scala:
sealed abstract class MyADT;
sealed case class Foo(value:Int) extends MyADT;
sealed case class Bar(value:String) extends MyADT;
sealed case class Baz extends MyADT;

مخلص کلام این که Scala بیشتر یک جایگزین مدرن و خوب برای جاوا می تونه باشه ، تا رقیبی تابعی برای #F ، OCaml یا Clojure