معرفی زبان #F

مقدمه

# F یک زبان کاربردی مدرن برای پلتفرم NET. است که توسط یک تیم تحقیقاتی مایکروسافت ساخته شده است و از 2005 تاکنون در حال توسعه است و در دسامبر 2013 نسخه 3.1 نیز منتشر شد. این پروژه به عنوان یک پروژه تحقیقاتی دانشگاهی آغاز شد و در طی چندین سال به یک زبان آماده تولید رسیده که توسط بسیاری از شرکتهای تجاری بخصوص در بخش مالی استفاده می شود.

دلایل ایجاد یک زبان جدید که بسیار متفاوت از # C بود:

جابجایی از شیئ گرا به پارادایم functional که برای محاسبات و دستکاری داده مناسب تر است.

استفاده از مفاهیم ارزشمند برنامه نویسی که به دلیل ایدئولوژی متفاوت # C در آن گنجانده نشده است.

اجتناب از مشکلات ذاتی شناخته شده # C که برای رفع آن خیلی دیر بود.

از نظر ویژگی های زبان ، #F یک مجموعه بزرگ تر از #C است ، بنابراین هر کاری که #C انجام دهد #F نیز می تواند انجام دهد اما برعکس این قضیه درست نیست: #F کار هایی می تواند انجام دهد که C# نمی تواند.

قابلیت همکاری کامل بین زبانهای #F و سایر زبانهای دات نت وجود دارد. پس از اینکه کد F# به اسمبلی کامپایل شد ، می توان از آن در هر زبان خانواده NET. مانند #C یا VB.NET استفاده کرد. این بدان معنی است که کد #F می تواند با سایر قسمتهای یک سیستم که با #C نوشته شده است به خوبی کار کند.

مزایایF# نسبت به C#

استفاده از Options بجای NULL

#C یک ویژگی خطرناک دارد که امکان استفاده از مقادیر NULL را به جای اشیاء می دهد. این ویژگی منبعی از باگ های بی شماری است که به آسانی ایجاد میشوند اما تشخیص آنها سخت است که تلاش برای برطرف کردن این باگ ها منجر به بررسی های اضافی در سراسر کد می شود که باعث می شود خوانایی کد کمتر شود.

#F اجازه استفاده از NULL را نمی دهد ، در عوض باید از options استفاده شود که امنیت کار را تضمین می کند و کاربردی مانند همان null در C# را دارد.

انواع داده های جبری

#C از انواع داده های جبری (ADT) کاملاً پشتیبانی نمی کند ، که باعث می شود ساختار داده های پیچیده از ساختار های داده ای ساخته شود. C# از کلاس ها و ساختارها پشتیبانی می کند ، اما از ساختار داده های محدودی پشتیبانی می کند ، که فقط توسط enum ها ارائه می شوند.

در مقابل ، #F پشتیبانی کاملی از ADT دارد و این امکان را فراهم می کند که بطور دقیق تر منطق پروژه را از نظر ساختار داده ها توصیف کنند و احتمال سوء تفسیر داده ها را کاهش داده و منجر به کیفیت بالاتر کد شوند. اساساً در #F می توان با ننوشتن کد های نامناسب از موقعیت های ناخواسته جلوگیری کرد.

تحولات و جهش ها

#C از جهش داده ها و استفاده از State ها پشتیبانی می کند. این بدان معناست که پس از ایجاد یک شیء ، در طول استفاده از آن شیئ دچار چندین تغییر می شود که State خود را تغییر می دهد. بسته به وضعیت فعلی شیئ ، ممکن است عملیات خاصی روی آن مجاز یا مجاز نباشد. قبل از اینکه با خیال راحت بتوانید از شیئ استفاده کنید ، به یک بررسی نیاز دارد. عدم انجام این کار احتمالاً منجر به اشکال خواهد شد که باعث رفتار غیر منتظره و در کد شما خواهد شد.

از طرف دیگر ،#F از انتقالات بجای جهش استفاده می کند. یک انتقال ، شی را تغییر نمی دهد و بنابراین state نیز تغییر نمی یابد. در یک انتقال یک شیئ جدید ساخته و منتقل می شود تا شیئ اصلی تغییر نکند. این بدان معناست که شیئ همیشه می تواند در یک حالت واحد باشد که از ابتدا بوده است. مقابله با فقط یک state روند توسعه را بسیار آسان می کند و میزان کد را کاهش می دهد ، زیرا هر وقت با یک شیء کار می کنیم میدانیم در یک حالت است و نیاز به بررسی های اضافی ندارد.

Expression ها و Statement ها

از آنجا که #C به State ها و جهش ها متکی است ، ترتیب استفاده از این جهش ها بسیار مهم می شود زیرا با جابجایی دو statement ممکن است خطا رخ دهد بنابراین ترتیب statement ها در کد #C موضوعی است که باید به آن توجه کرد. اما در #F اساساً یک Expression بزرگ (فرمول) از عبارات کوچکتر تشکیل شده است و مقادیر ورودی را برای مقادیر خروجی گاشت می کند. ترتیب ارزیابی قسمت های مختلف Expression مهم نیست. بنابراین تغییر استفاده از Statement ها در برنامه نویسی با Expression منجر به کد ایمن تر می شود که دیگر اشکالات ناشی از ترتیب Statement ها را ندارد.

جداسازی داده و منطق

#C با اجازه تعریف property ها و متد ها در یک کلاس یا structure ترکیب کردن داده ها با منطق را انجام می دهد. اما وقتی صحبت از سریال سازی می شود ، منطق پیوست شده به کلاس ها ازبین می رود ، به همین دلیل است که کلاس ها باید بدون هیچ منطقی به اشیاء داده های ساده تبدیل شوند و فقط پس از آن به یک serializer منتقل شوند.

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

سینتکس

سینتکس #C طولانی است. برای بیان موارد مختلف در #C در مقایسه با همان موارد در #F ، تایپ کردن به طرز قابل توجهی بیشتر است. طولانی بودن سینتکس در #C ناشی از مشخص کردن نوع پارامتر ها و مشخص کردن نوع بازگشتی متد ها می باشد. #F  دارای یک سیستم استنباط نوع پیشرفته است که انواع مقادیر را از نحوه استفاده از این مقادیر استنباط می کند ، بنابراین در بیشتر موارد توصیه می شود نوشتن نوع داده ها را در کد خود حذف کنید و به #F اجازه دهید تا آنها را تشخیص دهد درنتیجه میزان تایپ کردن کاهش می یابد و بهره وری افزایش می یابد. برخی افراد نحو #F را بسیار زیبا تر و ساده تر می دانند.

ترتیب

ترتیب فایلها ، کلاسها و متدها در #C مهم نیست. از طرف دیگر ، در #F ترتیب کاملا به فایل ها بستگی دارد، بنابراین شما نمی توانید به چیزی که قبلاً اعلام نشده است ، مراجعه یا استفاده کنید. اگرچه این ممکن است یک پیچیدگی غیر ضروری به نظر برسد ، اما چیز خوبی است ، زیرا این امر نظم و انضباط بیشتری را به توسعه دهنده تحمیل می کند و باعث می شود تا مقاصد خود را صریحا اعلام کند.

قابلیت تست و طراحی خوب

اصول طراحی مدرن شی گرا معروف به SOLID را می توان به راحتی در #C نقض کرد. به همین دلیل مهم است که آنها را بشناسید و با این حال ، همین اصول در ماهیت برنامه نویسی، کاربردی است. بنابراین زبان #F شما را از ابتدا به درست کردن کد صحیح تشویق می کند.

اجرا به صورت موازی با هزینه کم

اجرای کد #C به صورت موازی به دلیل شرایط رقابتی یک مسئله چالش برانگیز است ، که ممکن است رخ دهد هنگامی که 2 ترد سعی در تغییر همزمان یک شیء دارند، این چالش ایجاد می شود. #F با جدا کردن اشیاء پس از ایجاد ، این مشکل را کاملاً از بین می برد ، هر زمان که نیاز به تغییر باشد ، با استفاده از یک تغییر و تحول در شی اصلی ، یک شی جدید ساخته می شود. این بدان معنی است که کدی که در #F نوشته شده است به طور طبیعی می تواند با تلاش کم به صورت موازی اجرا شود.

ماژولاریتی بهتر

یک واحد اصلی منطق در #F یک تابع است ، در حالی که در #C این یک کلاس است. توابع در #F می توانند به عنوان پارامترهای دیگر توابع منتقل شده و در نتیجه یک تابع برگردانده شوند. نوشتن توابع تلاش کمتری نسبت به نوشتن کلاسها نیاز دارد. این امر باعث می شود به یک سطح بهتری از ماژولاریتی برسیم و سناریوهای ترکیبی پیچیده تر با هزینه کمتری انجام شود. کد نوشته شده به این روش ، مقاوم تر و ساده تر است.

ابزارهای استاندارد برای تولید پارسرها

#F دارای 2 ابزار استاندارد FsLex و FsYacc برای تولید پارسرها بر اساس گرامر است. این ابزارها پس از Lex و Yass به عنوان محبوبترین ابزارهای تولیدکننده پارسر در دنیای یونیکس نامگذاری شده اند. FsLex و FsYacc از قابلیت های تشخیصی غنی برخوردار بوده و می توانند در فرآیند ساخت ، به ساده سازی توسعه کمک کنند.

معایب # F

منحنی یادگیری شیب دار

برای شخصی که تجربه ای در برنامه نویسی کاربردی نداشته است ، هنگام کدنویسی در #F سازگاری با روش جدید تفکر می تواند چالش برانگیز باشد.

ساختار داده های پیچیده تر

با رویکرد تبدیل بیش از حد جهش ، ساختارهای داده پیشرفته تری نیاز دارند تا دستکاری های کارآمد روی آنها انجام دهند. به عنوان مثال شخص باید به جای جدول هش همانطور که در # C انجام می داد از یک درخت باینری در #F استفاده کند. مثال دیگر استفاده گسترده از Zipper ها به جای iterator ها است.

بار سنگین روی جمع کننده زباله

پیروی از اصل انتقال بیش از حد جهش باعث ایجاد اشیاء بیشتری می شود که باعث می شود بار سنگین تری روی جمع کننده زباله باشد. یک توسعه دهنده برای حل این مشکل باید با یک روش متعادل اتخاذ کند.

نامگذاری چالش برانگیز تر است

#F ویژگی overload کردن که در C# برای متد ها داشتیم را ندارد. بنابراین دو تابع در #F که در یک ماژول قرار گرفته اند ، نمی توانند اسم یکسانی داشته باشند ، بنابراین در نام گذاری به صورت یکتا دشواری خواهیم داشت که حل این مشکل در F# چالش برانگیز است.

ابزارهای پیشرفته کمتر

مایکروسافت سرمایه گذاری زیادی در ساخت بهترین ابزار برای برنامه نویسان #C می کند. متأسفانه ابزارهای بسیاری برای #F وجود ندارد که کدزنی با آن راحت شود. #F ابزار ابتدایی اولیه ای ندارد.

استفاده محدود برای انواع خاصی از پروژه ها

اپلیکیشن های UI می توانند مثال خوبی از اپلیکیشن هایی باشند که استفاده از # F در آن ها مناسب نیست زیرا دستکاری در کنترل ها حاکی از تغییر وضعیت آنهاست و این چیزی است که #F برای آن طراحی نشده است.

خلاصه

#F یک زبان کاربردی مدرن است که به عنوان جایگزین #C و VB طراحی شده است ، که از پارادایم شی گرا استفاده می کند. #F از بهترین ویژگی ها ی این دو زبان استفاده می کند و معایب آن ها را حل می کند. به همین دلیل است که کد نوشته شده در #F امن تر و آسان تر است. اگرچه انواع خاصی از پروژه ها وجود دارد که #F برای آن ها یک انتخاب ضعیف است ، اما قطعاً برای پروژه های سنگین در محاسبات و دستکاری داده ها گزینه مناسبی می باشد.

لینک های مرتبط

چگونه می توانم یک برنامه نویس #C شوم

نظر شما

2 نظر

محمدامین - 1399/11/17
عالی خیلی خوب بود ممنون از شما

صادق - 1399/2/9
سلام مقاله‌ی جالبی بود. اطلاعات خوبی رو انتقال داد. فقط یخورده مشکل نگارشی داشت. مثلا mutate رو جهش ترجمه کردید از نظر ترجمه لفظی درسته اما برای اینجا خیلی معنی نمیده. به نظرم همون تغییر ترجمه می کردید بهتر بود. سرتیتر ها رو هم باید فونتش لااقل بزرگ‌تر می‌شد که معلوم باشه.