فا شارب (لغة برمجة)
لغة F# (تُنطق إف شارب ) هي لغة برمجة متعددة الأغراض وعالية المستوى وذات كتابة قوية ومتعددة الأنماط ، تشمل أساليب البرمجة الوظيفية والإجرائية والموجهة للكائنات . تُستخدم غالبًا كلغة واجهة سطر أوامر (CLI) متعددة المنصات على .NET ، ولكنها قادرة أيضًا على توليد أكواد JavaScript [ 8 ] ووحدات معالجة الرسومات (GPU) [ 9 ] .
تم تطوير لغة F# بواسطة مؤسسة برمجيات F# ، [ 10 ] ومايكروسوفت ومساهمين آخرين. يتوفر مُصرّف مفتوح المصدر ومتعدد المنصات للغة F# من مؤسسة برمجيات F#. [ 11 ] تدعم Visual Studio [ 12 ] و JetBrains Rider لغة F# بشكل كامل . [ 13 ] كما تتوفر إضافات تدعم F# للعديد من محررات النصوص الشائعة الاستخدام، بما في ذلك Visual Studio Code و Vim و Emacs .
لغة F# هي إحدى لغات عائلة ML ، وقد نشأت كتطبيق لإطار عمل .NET لنواة لغة البرمجة OCaml . [ 5 ] [ 6 ] كما تأثرت أيضًا بلغات C# و Python و Haskell [ 4 ] و Scala و Erlang .
تاريخ
الإصدارات
تطور اللغة
تعتمد لغة F# على عملية تطوير وهندسة مفتوحة. ويتولى دون سايم من مايكروسوفت للأبحاث إدارة عملية تطوير اللغة ، بصفته المسؤول الدائم عن تصميمها، بالتعاون مع مؤسسة برمجيات F#. أما الإصدارات السابقة من لغة F# فقد صُممت من قِبل مايكروسوفت ومايكروسوفت للأبحاث باستخدام عملية تطوير مغلقة.
تم تضمين لغة F# لأول مرة في Visual Studio في إصدار 2010 ، على نفس مستوى Visual Basic (.NET) و C# (وإن كان كخيار)، وظلت موجودة في جميع الإصدارات اللاحقة، مما جعل اللغة متاحة على نطاق واسع ومدعومة بشكل جيد.
نشأت لغة F# من شركة مايكروسوفت للأبحاث في كامبريدج، المملكة المتحدة. صممها ونفذها في الأصل دون سايم ، [ 5 ] الذي يقول، ضمن فريق F#، إن حرف F يرمز إلى "المرح". [ 41 ] ساهم أندرو كينيدي في تصميم وحدات القياس. [ 5 ] طورت مايكروسوفت أدوات Visual F# لبيئة Visual Studio. [ 5 ] طورت مؤسسة برمجيات F# مُترجم F# مفتوح المصدر وأدواته، مُدمجةً تنفيذ المُترجم مفتوح المصدر الذي قدمه فريق أدوات Microsoft Visual F#. [ 10 ]
| إصدار F# | ميزات تمت إضافتها | |
|---|---|---|
| 1.0 |
| |
| 2.0 |
| |
| 3.0 [ 42 ] |
| |
| 3.1 [ 43 ] |
| |
| 4.0 [ 44 ] |
| |
| 4.1 [ 45 ] |
| |
| 4.5 [ 29 ] |
| |
| 4.6 |
| |
| 4.7 [ 46 ] |
| |
| 5.0 [ 47 ] |
| |
| 6.0 [ 48 ] |
| |
| 7.0 [ 49 ] |
| |
| 8.0 [ 50 ] |
| تعبيرات المجموعة ] |
| 9.0 [ 52 ] |
| |
| 10.0 [ 39 ] |
|
نظرة عامة على اللغة
البرمجة الوظيفية
F# هي لغة برمجة وظيفية ذات كتابة قوية ، تتميز بقدرات واسعة لا توجد عادةً إلا في لغات البرمجة الوظيفية ، مع دعمها لميزات البرمجة الكائنية المتوفرة في C#. تتيح هذه الميزات مجتمعةً كتابة برامج F# بأسلوب وظيفي بالكامل، كما تسمح بدمج الأسلوبين الوظيفي والكائني.
من أمثلة الميزات الوظيفية ما يلي:
- كل شيء تعبير
- الاستدلال على النوع (باستخدام استدلال هيندلي-ميلنر على النوع )
- يتصرفون كمواطنين من الدرجة الأولى
- الدوال المجهولة ذات الدلالات الالتقاطية (أي، الإغلاقات )
- المتغيرات والكائنات غير القابلة للتغيير
- دعم التقييم الكسول
- الدوال ذات الرتبة العليا
- الدوال المتداخلة
- الكاري
- مطابقة الأنماط
- أنواع البيانات الجبرية
- المجموعات
- فهم القوائم
- دعم نمط الموناد (يسمى تعبيرات الحساب [ 53 ] )
- تحسين استدعاء الذيل [ 54 ]
F# هي لغة برمجة تعتمد على التعبيرات، وتستخدم التقييم الفوري ، وفي بعض الحالات التقييم المؤجل . كل عبارة في F#، بما في ذلك ifالتعبيرات tryوالحلقات، هي تعبير قابل للتركيب ذو نوع ثابت. [ 55 ] الدوال والتعبيرات التي لا تُرجع أي قيمة يكون نوع إرجاعها ثابتًا unit. تستخدم F# الكلمة letالمفتاحية `return` لربط القيم باسم. [ 55 ] على سبيل المثال:
لنفترض أن x = 3 + 4يربط القيمة 7بالاسم x.
تُعرَّف الأنواع الجديدة باستخدام typeالكلمة المفتاحية. في البرمجة الوظيفية، توفر لغة F# أنواع البيانات التالية: tuple ، وrecord ، و discriminated union ، وlist ، و option ، و result . [ 55 ] يُمثل tuple مجموعة من n قيمة، حيث n ≥ 0. تُسمى القيمة n عدد عناصر tuple. على سبيل المثال، يُمكن تمثيل tuple ثلاثي على النحو التالي: A = B + C، حيث A وB وC قيم من أنواع مختلفة. يُمكن استخدام tuple لتخزين القيم فقط عندما يكون عدد القيم معروفًا مسبقًا في مرحلة التصميم، ويظل ثابتًا أثناء التنفيذ.(A, B, C)
السجل هو نوع بيانات تُسمى فيه عناصر البيانات. إليك مثال على تعريف السجل:
النوع R = { الاسم : سلسلة نصية، العمر : عدد صحيح }يمكن إنشاء السجلات كـ . تُستخدم الكلمة المفتاحية لإنشاء نسخة من سجل، كما في ، والتي تنشئ سجلاً جديداً عن طريق نسخ وتغيير قيمة الحقل (بافتراض أن السجل الذي تم إنشاؤه في المثال الأخير كان اسمه ).letr={Name="AB";Age=42}with{rwithName="CD"}rNamer
نوع الاتحاد المُمَيَّز هو نسخة آمنة من حيث النوع من اتحادات لغة C. على سبيل المثال،
النوع A = | UnionCaseX من سلسلة نصية | UnionCaseY من عدد صحيحيمكن أن تتوافق قيم نوع الاتحاد مع أي من حالتي الاتحاد. وتُدرج أنواع القيم التي تحملها كل حالة اتحاد في تعريف كل حالة.
نوع القائمة هو قائمة مرتبطة غير قابلة للتغيير ، تُمثَّل إما باستخدام رمز ( حيث يُمثِّل عامل الربط cons ) أو باختصار كـ . تُكتب القائمة الفارغة كـ . نوع الخيار هو نوع اتحاد مُميَّز مع خيارات أو . قد تكون أنواع F# عامة ، ويتم تنفيذها كأنواع .NET عامة.head::tail::[item1;item2;item3][]Some(x)None
تدعم لغة F# دوال لامدا والإغلاقات . [ 55 ] جميع الدوال في F# هي قيم من الدرجة الأولى وغير قابلة للتغيير. [ 55 ] يمكن تطبيق الدوال بشكل جزئي (curryed) . وبما أنها قيم من الدرجة الأولى، يمكن تمرير الدوال كوسائط إلى دوال أخرى. ومثل لغات البرمجة الوظيفية الأخرى، تسمح F# بتركيب الدوال باستخدام المعاملين `and` .>><<
يوفر F#تعبيرات التسلسل [ 56 ] التي تُعرّف تسلسلاًseq { ... }أو قائمة[ ... ]أو مصفوفة[| ... |]من خلال التعليمات البرمجية التي تُولّد القيم. على سبيل المثال،
seq { for b in 0 .. 25 do if b < 15 then yield b * b }يشكل سلسلة من مربعات الأرقام من 0 إلى 14 عن طريق تصفية الأرقام من نطاق الأرقام من 0 إلى 25. التسلسلات هي مولدات - يتم إنشاء القيم عند الطلب (أي يتم تقييمها بشكل كسول ) - بينما يتم تقييم القوائم والمصفوفات بشكل فوري.
تستخدم لغة F# مطابقة الأنماط لربط القيم بالأسماء. كما تُستخدم مطابقة الأنماط عند الوصول إلى الاتحادات المُميزة، حيث تتم مطابقة قيمة الاتحاد مع قواعد النمط، ويتم اختيار القاعدة عند نجاح المطابقة. تدعم F# أيضًا الأنماط النشطة كشكل من أشكال مطابقة الأنماط القابلة للتوسيع. [ 57 ] تُستخدم هذه الأنماط، على سبيل المثال، عند وجود طرق متعددة للمطابقة على نوع معين. [ 55 ]
تدعم لغة F# صيغة عامة لتعريف العمليات الحسابية التركيبية تسمىتعابير الحساب . تُعدّ تعابير التسلسل والحسابات غير المتزامنة والاستعلامات أنواعًا خاصة من تعابير الحساب. وتُمثّل تعابير الحساب تطبيقًا لنمطالموناد. [ 56 ]
البرمجة الإجرائية
يتضمن دعم لغة F# للبرمجة الإجرائية ما يلي:
forالحلقاتwhileالحلقات- المصفوفات ، التي تم إنشاؤها باستخدام
[| ... |]الصيغة - جدول التجزئة ، الذي تم إنشاؤه باستخدام
dict [ ... ]الصيغة أوSystem.Collections.Generic.Dictionary<_,_>النوع.
يمكن أيضًا تسمية القيم وحقول السجلات بـ mutable. على سبيل المثال:
// تعريف المتغير 'x' بقيمة ابتدائية '1' let mutable x = 1 // تغيير قيمة 'x' إلى '3' x <- 3كما يدعم F# الوصول إلى جميع أنواع وعناصر واجهة سطر الأوامر مثل تلك المحددة في System.Collections.Genericمساحة الاسم التي تحدد هياكل البيانات الإجرائية.
البرمجة الكائنية التوجه
مثل لغات البنية التحتية للغة المشتركة (CLI) الأخرى، يمكن للغة F# استخدام أنواع CLI من خلال البرمجة كائنية التوجه. [ 55 ] يشمل دعم F# للبرمجة كائنية التوجه في التعبيرات ما يلي:
- تدوين النقاط، على سبيل المثال،
x.Name - تعابير الكائنات، على سبيل المثال،
{newobj()withmemberx.ToString()="hello"} - بناء الكائنات، على سبيل المثال،
newForm() - اختبارات النوع، على سبيل المثال،
x:?string - التحويلات النوعية، على سبيل المثال،
x:?>string - الوسائط المسماة، على سبيل المثال،
x.Method(someArgument=1) - على سبيل المثال، اللاعبون الذين يحددون أسماءهم في قائمة الإعداد.
newForm(Text="Hello") - الوسائط الاختيارية، على سبيل المثال،
x.Method(OptionalArgument=1)
يتضمن دعم البرمجة الكائنية التوجه في الأنماط
- اختبارات النوع، على سبيل المثال،
:?stringass - الأنماط النشطة، والتي يمكن تعريفها على أنواع الكائنات [ 57 ]
يمكن أن تكون تعريفات أنواع الكائنات في F# تعريفات لأنواع الفئات، أو الهياكل، أو الواجهات، أو التعدادات، أو المفوضين، بما يتوافق مع أشكال التعريف الموجودة في C# . على سبيل المثال، إليك فئة تحتوي على مُنشئ يأخذ اسمًا وعمرًا، ويُعلن عن خاصيتين.
/// تعريف نوع كائن بسيط type Person ( name : string , age : int ) = member x . Name = name member x . Age = ageالبرمجة غير المتزامنة
تدعم لغة F# البرمجة غير المتزامنة من خلال سير العمل غير المتزامن . [ 58 ] يُعرَّف سير العمل غير المتزامن بأنه سلسلة من الأوامر داخل async{ ... }، كما في
let asynctask = async { let req = WebRequest.Create ( url ) let ! response = req.GetResponseAsync ( ) use stream = response.GetResponseStream ( ) use streamreader = new System.IO.StreamReader ( stream ) return streamreader.ReadToEnd ( ) }يشير هذا let!إلى أن التعبير الموجود على اليمين (الحصول على الاستجابة) يجب أن يتم بشكل غير متزامن، ولكن يجب أن يستمر التدفق فقط عند توفر النتيجة. بعبارة أخرى، من وجهة نظر كتلة التعليمات البرمجية، يبدو الأمر كما لو أن الحصول على الاستجابة عملية حظر، بينما من وجهة نظر النظام، لن يتم حظر الخيط ويمكن استخدامه لمعالجة تدفقات أخرى حتى تصبح النتيجة المطلوبة لهذا التدفق متاحة.
يمكن استدعاء الكتلة غير المتزامنة باستخدام Async.RunSynchronouslyالدالة. ويمكن تنفيذ عدة كتل غير متزامنة بالتوازي باستخدام Async.Parallelالدالة التي تأخذ قائمة من asyncالكائنات (في المثال، asynctaskهو كائن غير متزامن) وتُنشئ كائنًا غير متزامن آخر لتشغيل المهام في القوائم بالتوازي. ويتم استدعاء الكائن الناتج باستخدام Async.RunSynchronously. [ 58 ]
يتبع انعكاس التحكم في F# هذا النمط. [ 58 ]
منذ الإصدار 6.0، يدعم F# إنشاء مهام .NET واستهلاكها وإعادتها مباشرةً. [ 59 ]
افتح System.Net.Http، ثم عرّف دالة fetchUrlAsync التي تأخذ عنوان URL كسلسلة نصية ، وتُعيد كائن Task<string>. تُنشئ الدالة كائن HttpClient جديدًا ، ثم تستدعي دالة GetAsync للحصول على عنوان URL ، ثم تسترجع محتوى الاستجابة . بعد ذلك ، تُنفّذ الدالة عملية تأخير لمدة 500 مللي ثانية ، ثم تُعيد المحتوى .// طريقة الاستخدام let fetchPrint () = let task = task { let! data = fetchUrlAsync "https://example.com" printfn $ "{data}" } task . Wait ()البرمجة المتوازية
يتم دعم البرمجة المتوازية جزئيًا من خلال Async.Parallel، Async.Startوعمليات أخرى تقوم بتشغيل الكتل غير المتزامنة بالتوازي.
كما يتم دعم البرمجة المتوازية من خلال Array.Parallelعوامل التشغيل الوظيفية في مكتبة F# القياسية، والاستخدام المباشر لنموذج System.Threading.Tasksبرمجة المهام، والاستخدام المباشر لمجموعة مؤشرات الترابط .NET ومؤشرات الترابط .NET، ومن خلال الترجمة الديناميكية لرمز F# إلى محركات التنفيذ المتوازية البديلة مثل رمز GPU [ 9 ] .
وحدات القياس
يدعم نظام أنواع F# التحقق من وحدات القياس للأرقام: [ 60 ] يمكن إسناد وحدات قياس، مثل المتر أو الكيلوغرام، إلى قيم الفاصلة العائمة، والأعداد الصحيحة غير الموقعة [ 61 ]، والأعداد الصحيحة الموقعة. يسمح هذا للمترجم بالتحقق من أن العمليات الحسابية التي تتضمن هذه القيم متسقة الأبعاد، مما يساعد على منع أخطاء البرمجة الشائعة من خلال ضمان عدم إضافة الأطوال إلى الأوقات عن طريق الخطأ، على سبيل المثال.
تتكامل ميزة وحدات القياس مع استنتاج أنواع F# لتقليل الحاجة إلى التعليقات التوضيحية للأنواع في كود المستخدم. [ 62 ]
[< قياس >] اكتب م // متر [< قياس >] اكتب ث // ثانيةlet distance = 100.0 <m> // float<m> let time = 5.0 <sup> s > // float <s> let speed = distance / time // float<m / s >[< قياس >] نوع kg // كيلوغرام [< قياس >] نوع N = ( kg * m )/( s ^ 2 ) // نيوتن [< قياس >] نوع Pa = N /( m ^ 2 ) // باسكال[< قياس >] نوع أيام let better_age = 3u < أيام > // uint<أيام>يُوفّر مُدقّق الأنواع الثابتة في لغة F# هذه الوظيفة أثناء الترجمة، ولكن يتم حذف الوحدات من الكود المُترجم. وبالتالي، لا يُمكن تحديد وحدة القيمة أثناء التشغيل.
البرمجة الوصفية
تسمح لغة F# ببعض أشكال تخصيص بناء الجملة عبر البرمجة الوصفية لدعم تضمين لغات خاصة بمجال معين داخل لغة F#، لا سيما من خلال تعبيرات الحساب. [ 55 ]
تتضمن لغة F# ميزةً للبرمجة الوصفية أثناء التشغيل تُسمى الاقتباسات. [ 63 ] يُقيّم تعبير الاقتباس إلى تمثيل شجري مجرد لبنية تعبيرات F#. وبالمثل، يمكن الوصول إلى التعريفات المُصنّفة بهذه السمة في شكل اقتباس. تُستخدم اقتباسات F# لأغراض متنوعة، بما في ذلك ترجمة كود F# إلى JavaScript [ 8 ] وكود GPU [ 9 ] . تُمثل الاقتباسات تعبيرات كود F# كبيانات لاستخدامها من قِبل أجزاء أخرى من البرنامج، مع اشتراط أن يكون كود F# صحيحًا نحويًا.[<ReflectedDefinition>]
برمجة غنية بالمعلومات
قدّمت لغة F# 3.0 شكلاً من أشكال البرمجة الوصفية في وقت الترجمة من خلال توليد أنواع قابلة للتوسيع بشكل ثابت تُعرف باسم مُزوّدي أنواع F#. [ 64 ] يسمح مُزوّدو أنواع F# بتوسيع مُصرّف F# وأدواته بمكونات تُوفّر معلومات النوع للمُصرّف عند الطلب في وقت الترجمة. وقد استُخدم مُزوّدو أنواع F# لتوفير وصول مُحدّد النوع إلى مصادر المعلومات المُتصلة بطريقة قابلة للتوسع، بما في ذلك مخطط المعرفة Freebase . [ 65 ]
في F# 3.0، تم دمج ميزات الاقتباس وتعبيرات الحساب في F# لتنفيذ استعلامات LINQ . [ 66 ] على سبيل المثال:
// استخدم موفر أنواع OData لإنشاء أنواع يمكن استخدامها للوصول إلى قاعدة بيانات Northwind. افتح Microsoft.FSharp.Data.TypeProvidersنوع Northwind = ODataService < "http://services.odata.org/Northwind/Northwind.svc" > let db = Northwind . GetDataContext ()// تعبير استعلام. let query1 = query { for customer in db . Customers do select customer }يُعرف الجمع بين موفري الأنواع والاستعلامات والبرمجة الوظيفية ذات الأنواع القوية باسم البرمجة الغنية بالمعلومات . [ 67 ]
برمجة الوكلاء
تدعم لغة F# نموذجًا مُعدَّلًا لبرمجة الممثلين من خلال تنفيذ وكلاء غير متزامنين خفيفي الوزن في الذاكرة. على سبيل المثال، يُعرِّف الكود التالي وكيلًا وينشر رسالتين:
نوع الرسالة = | إضافة سلسلة نصية | إزالة قناة الرد غير المتزامن < الخيار < السلسلة النصية >>// يوفر وصولاً متزامنًا إلى قائمة من السلاسل النصية let listManager = MailboxProcessor.Start ( fun inbox - > let rec messageLoop list = async { let ! msg = inbox.Receive ( ) match msg with | Enqueue item -> return ! messageLoop ( item :: list )| إزالة قناة الرد من قائمة الانتظار -> مطابقة القائمة مع | [] -> قناة الرد . الرد لا شيء إرجاع ! حلقة الرسائل القائمة | الرأس :: الذيل -> قناة الرد . الرد ( رأس ما ) إرجاع ! حلقة الرسائل الذيل }// ابدأ الحلقة بقائمة فارغة messageLoop [] )// الاستخدام غير المتزامن { // إضافة بعض السلاسل النصية إلى قائمة الانتظار listManager.Post ( Enqueue " Hello" ) listManager.Post ( Enqueue " World " )// إزالة السلاسل النصية من قائمة الانتظار ومعالجتها let! str = listManager.PostAndAsyncReply ( Dequeue ) str |> Option.iter ( printfn " تمت إزالة السلسلة النصية من قائمة الانتظار: %s" )} |> بدء غير متزامنأدوات التطوير
- يُمكن استخدام Visual Studio ، مع تثبيت أدوات Visual F# من Microsoft ، لإنشاء مشاريع F# وتشغيلها وتصحيح أخطائها. تتضمن أدوات Visual F# وحدة تحكم تفاعلية (REPL) مُستضافة في Visual Studio، تُتيح تنفيذ كود F# أثناء كتابته. كما يدعم Visual Studio لنظام Mac مشاريع F# بشكل كامل.
- يحتوي برنامج Visual Studio Code على دعم كامل للغة F# عبر إضافة Ionide .
- يمكن تطوير لغة F# باستخدام أي محرر نصوص. ويتوفر دعم خاص لها في محررات مثل Emacs .
- تم تحسين JetBrains Rider لتطوير كود F# بدءًا من الإصدار 2019.1. [ 68 ]
- يدعم LINQPad لغة F# منذ الإصدار 2.x.
مقارنة بيئات التطوير المتكاملة
| بيئة التطوير المتكاملة | رخصة | ويندوز | لينكس | نظام التشغيل macOS | مطور |
|---|---|---|---|---|---|
| مايكروسوفت فيجوال ستوديو | برنامج احتكاري (قياسي) برنامج مجاني (إصدار مجتمعي) | نعم | لا | نعم | مايكروسوفت |
| Visual Studio Code [ 69 ] | ملكية خاصة ( شفرة ثنائية ) رخصة MIT ( شفرة مصدرية ) | نعم | نعم | نعم | مايكروسوفت |
| رايدر [ 70 ] | ملكية خاصة | نعم | نعم | نعم | جيت برينز |
مجالات التطبيق
لغة F# هي لغة برمجة للأغراض العامة .
برمجة الويب
تُعدّ SAFE Stack حزمة برمجية متكاملة مكتوبة بلغة F# لتطوير تطبيقات الويب. وهي تستخدم ASP.NET Core على جانب الخادم وFable على جانب العميل. [ 71 ]
تشمل الخيارات البديلة الشاملة للغة F# إطار عمل WebSharper وإطار عمل Oxpecker. [ 72 ]
تطوير تطبيقات متعددة المنصات
يمكن استخدام لغة F# مع أدوات Visual Studio لـ Xamarin لتطوير تطبيقات لأنظمة iOS و Android . توفر مكتبة Fabulous واجهة وظيفية أكثر سهولة في الاستخدام.
البرمجة التحليلية
من بين استخدامات أخرى، تُستخدم لغة F# في برمجة التمويل الكمي، [ 73 ] وتجارة الطاقة وتحسين المحافظ الاستثمارية، [ 74 ] والتعلم الآلي، [ 75 ] وذكاء الأعمال ، [ 76 ] والألعاب الاجتماعية على فيسبوك . [ 77 ]
في العقد الثاني من القرن الحادي والعشرين، تم تقديم لغة F# كبديل مُحسَّن للغة C# . وقد ساهمت قدرة F# على كتابة البرامج النصية وتوافقها مع جميع منتجات مايكروسوفت في جعلها شائعة بين المطورين. [ 78 ]
كتابة البرامج النصية
يمكن استخدام لغة F# كلغة برمجة نصية، وخاصةً لبرمجة حلقات القراءة والتقييم والطباعة (REPL) على سطح المكتب. [ 79 ]
مجتمع المصادر المفتوحة
يشمل مجتمع F# مفتوح المصدر مؤسسة برمجيات F# [ 10 ] ومجموعة F# مفتوحة المصدر على GitHub . [ 11 ] ومن بين مشاريع F# مفتوحة المصدر الشائعة ما يلي:
- Fable ، وهو برنامج لتحويل لغة F# إلى Javascript يعتمد على Babel .
- Paket ، مدير حزم بديل لـ .NET لا يزال بإمكانه استخدام مستودعات NuGet ، ولكنه يتميز بإدارة مركزية للإصدارات.
- FAKE ، نظام بناء متوافق مع لغة F#.
- Giraffe ، برنامج وسيط وظيفي التوجه لـ ASP.NET Core .
- Suave ، خادم ويب خفيف الوزن ومكتبة لتطوير الويب.
التوافق
تتميز لغة F# بـ "وضع توافق ML" القديم الذي يمكنه تجميع البرامج المكتوبة بمجموعة فرعية كبيرة من OCaml تقريبًا، بدون دوال أو كائنات أو متغيرات متعددة الأشكال أو إضافات أخرى.
أمثلة
فيما يلي بعض الأمثلة الصغيرة:
// هذا تعليق لبرنامج "مرحباً بالعالم" التجريبي. printfn "مرحباً بالعالم!"تعريف نوع السجل. السجلات غير قابلة للتغيير افتراضياً، ويتم مقارنتها بناءً على التساوي الهيكلي.
نوع الشخص = { الاسم الأول : سلسلة نصية، الاسم الأخير : سلسلة نصية، العمر : عدد صحيح }// إنشاء نسخة من السجل let person = { FirstName = "John" ; LastName = "Doe" ; Age = 30 }فئة Person تحتوي على مُنشئ يأخذ الاسم والعمر وخاصيتين غير قابلتين للتغيير.
/// هذا تعليق توثيقي لتعريف نوع. type Person ( name : string , age : int ) = member x . Name = name member x . Age = age /// إنشاء كائن من الفئة let mrSmith = Person ( "Smith" , 42 )أحد الأمثلة البسيطة التي تُستخدم غالبًا لتوضيح بنية اللغات الوظيفية هو دالة المضروب للأعداد الصحيحة غير السالبة ذات 32 بت، كما هو موضح هنا في لغة F#:
/// باستخدام تعبير مطابقة الأنماط let rec factorial n = match n with | 0 -> 1 | _ -> n * factorial ( n - 1 )/// بالنسبة للدوال ذات الوسيط الواحد، يوجد اختصار برمجي (دالة مطابقة الأنماط): let rec factorial = function | 0 -> 1 | n -> n * factorial ( n - 1 ) /// باستخدام عامل الطي وعامل النطاق let factorial n = [ 1 .. n ] |> Seq . fold (*) 1أمثلة على التكرار:
/// التكرار باستخدام حلقة 'for' let printList lst = for x in lst do printfn $ "{x}"/// التكرار باستخدام دالة من الرتبة العليا let printList2 lst = List . iter ( printfn "%d" ) lst/// التكرار باستخدام دالة تكرارية ومطابقة الأنماط let rec printList3 lst = match lst with | [] -> () | h :: t -> printfn "%d" h printList3 tأمثلة على متتالية فيبوناتشي:
/// صيغة أعداد فيبوناتشي [< استدعاء الذيل >] let fib n = let rec g n f0 f1 = match n with | 0 -> f0 | 1 -> f1 | _ -> g ( n - 1 ) f1 ( f0 + f1 ) g n 0 1/// نهج آخر - متتالية لا نهائية كسولة من أعداد فيبوناتشي let fibSeq = Seq.unfold ( fun ( a , b ) - > Some ( a + b , ( b , a + b ) )) ( 0 , 1 )// طباعة قيم فيبوناتشي الزوجية [ 1 .. 10 ] |> List.map fib | > List.filter ( fun n - > ( n % 2 ) = 0 ) | > printList// نفس الشيء، باستخدام تعبير قائمة [ for i in 1 .. 10 do let r = fib i if r % 2 = 0 then yield r ] |> printListبرنامج نموذجي لنظام ويندوز فورمز:
// افتح مكتبة نماذج ويندوز، افتح System.Windows.Forms// إنشاء نافذة وتعيين بعض الخصائص let form = new Form ( Visible = true , TopMost = true , Text = "Welcome to F#" )// إنشاء تسمية لعرض نص ما بالشكل التالي: let label = let x = 3 + ( 4 * 5 ) new Label ( Text = $ "{x}" )// أضف التسمية إلى النموذج form.Controls.Add ( label )// وأخيرًا، قم بتشغيل النموذج [< System . STAThread >] Application . Run ( form )مثال على البرمجة المتوازية غير المتزامنة (مهام وحدة المعالجة المركزية والإدخال/الإخراج المتوازية):
/// كاشف بسيط للأعداد الأولية let isPrime ( n : int ) = let bound = int ( sqrt ( float n )) seq { 2 .. bound } |> Seq . forall ( fun x -> n % x <> 0 )// نحن نستخدم سير العمل غير المتزامن let primeAsync n = async { return ( n , isPrime n ) }/// إرجاع الأعداد الأولية بين m و n باستخدام خيوط متعددة let primes m n = seq { m .. n } |> Seq . map primeAsync |> Async . Parallel |> Async . RunSynchronously |> Array . filter snd |> Array . map fst// تشغيل اختبار الأعداد الأولية 1000000 1002000 |> Array.iter ( printfn " %d" )انظر أيضاً
ملحوظات
- ↑ https://learn.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-10 .
{{cite web}}: مفقود أو فارغ|title=( مساعدة ) - ↑ "رخصة مؤسسة برمجيات F#" . جيت هاب . 14 أكتوبر 2021.
- ↑ "رخصة مايكروسوفت للغة F#" . جيت هاب . 16 أكتوبر 2021.
- 1 2 سايم وجرانيتش وسيسترنينو (2007 :2)
- 1 2 3 4 5 "شكر وتقدير تاريخي" . مايكروسوفت .
- 1 2 سايم، دون (2006). "الاستفادة من مكونات البرمجة الوصفية في .NET من F#" .
[F#] متجذرة في تصميم Core ML، وعلى وجه الخصوص، لديها لغة أساسية متوافقة إلى حد كبير مع لغة OCaml.
- ↑ للبرمجة غير المتزامنة
- ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ١٠ ١١ ١٢ ١٣ ١٤ مؤسسة برمجيات F#. "استخدام F# لتطبيقات الويب" . تم الاطلاع عليه بتاريخ ٣٠ يوليو ٢٠٢٠ .
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 مؤسسة برمجيات F#. "استخدام F# لبرمجة وحدة معالجة الرسومات" . مؤرشف من الأصل بتاريخ 25 ديسمبر 2019. تم الاطلاع عليه بتاريخ 25 ديسمبر 2019 .
- 1 2 3 مؤسسة برمجيات F#. "مؤسسة برمجيات F#" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ١ ٢ مؤسسة برمجيات F#. "مترجم F# (إصدار مفتوح المصدر) على GitHub" . مؤرشف من الأصل بتاريخ ١٧ مايو ٢٠١٣. تم الاطلاع عليه بتاريخ ٢٤ نوفمبر ٢٠١٢ .
- ↑ "التطوير باستخدام Visual F# في Visual Studio" . تم الاطلاع عليه بتاريخ 30 يوليو 2020 .
- ↑ "F#" . تم الاسترجاع في 30 يوليو 2020 .
- ↑ سايم، دون. "إصدار F# 1.0.8" . مايكروسوفت . تم الاطلاع عليه في 7 سبتمبر 2014 .
- ↑ سايم، دون. "تم إصدار F# 2.0 كجزء من Visual Studio 2010" . مايكروسوفت . تم الاطلاع عليه في 7 سبتمبر 2014 .
- ↑ زاندر، جيسون. "إصدار Visual Studio 2012 و.NET Framework 4.5 للويب" . مايكروسوفت . تم الاطلاع عليه في 7 سبتمبر 2014 .
- ↑ "إصدار Visual Studio 2013 للويب" . مايكروسوفت. 17 أكتوبر 2013. تم الاطلاع عليه في 7 سبتمبر 2014 .
- ↑ "الإعلان عن الإصدار النهائي من Visual F# 4.0" . مايكروسوفت . تم الاطلاع عليه بتاريخ 15 سبتمبر 2015 .
- ↑ "الإعلان عن F# 4.1 وأدوات Visual F# لـ Visual Studio 2017" . تم الاطلاع عليه بتاريخ 2017-03-08 .
- ↑ "الإعلان عن F# 4.5" . مايكروسوفت. 14 أغسطس 2018. تم الاطلاع عليه بتاريخ 14 أغسطس 2018 .
- ↑ "FSharp.Core 4.5.0" .
- ↑ "تنزيل .NET Core 2.1 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه في 13 مايو 2021 .
- ↑ "الإعلان عن F# 4.6" . مايكروسوفت. 29 مارس 2019. تم الاطلاع عليه بتاريخ 29 مارس 2019 .
- ↑ "FSharp.Core 4.6.0" .
- ↑ "تنزيل .NET Core 2.2 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه بتاريخ 13 مايو 2021 .
- ↑ "الإعلان عن F# 4.7" . مايكروسوفت. 23 سبتمبر 2019. تم الاطلاع عليه بتاريخ 23 سبتمبر 2019 .
- ↑ "FSharp.Core 4.7.0" .
- ↑ "تنزيل .NET Core 3.0 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه بتاريخ 13 مايو 2021 .
- 1 2 "الإعلان عن F# 5" . 10 نوفمبر 2020.
- ↑ "تنزيل .NET 5.0 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه بتاريخ 13 مايو 2021 .
- ↑ "F# 6 هنا رسميًا!" . 9 نوفمبر 2021.
- ↑ "تنزيل .NET 6.0 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه بتاريخ 14 نوفمبر 2021 .
- ↑ "الإعلان عن F# 7" . 8 نوفمبر 2022.
- ↑ "تنزيل .NET 7.0 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه بتاريخ 8 نوفمبر 2022 .
- ↑ "الإعلان عن F# 8" . 14 نوفمبر 2023.
- ↑ "تنزيل .NET 8.0 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه بتاريخ 14 نوفمبر 2023 .
- ↑ "ما الجديد في F# 9" . 12 نوفمبر 2024.
- ↑ "تنزيل .NET 9.0 (لينكس، ماك أو إس، وويندوز)" . مايكروسوفت . تم الاطلاع عليه في 13 يناير 2025 .
- 1 2 "ما الجديد في F# 10" .
- ↑ "تنزيل .NET 10.0" .
- ↑ إدواردز، كاثرين (23 ديسمبر 2008). "دليل لغات البرمجة: F#" . عالم الشبكات . IDG. مؤرشف من الأصل في 13 نوفمبر 2018. تم الاطلاع عليه في 8 أغسطس 2016 .
- ↑ ماكنمارا، برايان. "المزيد حول ميزات لغة F# 3.0" . مايكروسوفت . تم الاسترجاع في 7 سبتمبر 2014 .
- ↑ ماكنمارا، برايان. "الإعلان عن إصدار تجريبي من F# 3.1" . مايكروسوفت . تم الاطلاع عليه في 7 سبتمبر 2014 .
- ↑ "الإعلان عن الإصدار النهائي من Visual F# 4.0" . تم الاطلاع عليه بتاريخ 2017-03-08 .
- ↑ "الإعلان عن F# 4.1 وأدوات Visual F# لـ Visual Studio 2017" . تم الاطلاع عليه بتاريخ 2017-03-08 .
- ↑ "الإعلان عن F# 4.7" . 23 سبتمبر 2019.
- ↑ "الإعلان عن F# 5" . 10 نوفمبر 2020.
- ↑ "ما الجديد في F# 6 - دليل F#" . 10 مارس 2023.
- ↑ "الإعلان عن F# 7" . 8 نوفمبر 2022.
- ↑ "الإعلان عن F# 8" . 14 نوفمبر 2023.
- ↑ "تبسيط العمليات الحسابية في لغة F# باستخدام الكلمة المفتاحية الجديدة 'while!'"" . 20 سبتمبر 2023.
- ↑ "ما الجديد في F# 9" . 12 نوفمبر 2024.
- ↑ "تعابير البرمجة/الحساب في لغة فا شارب - ويكي بوكس، كتب مفتوحة لعالم مفتوح" . en.wikibooks.org . تم الاطلاع عليه بتاريخ 21 يناير 2022 .
- ↑ kexugit (8 يوليو 2011). "استدعاءات الذيل في F#" . docs.microsoft.com . تم الاسترجاع في 22 أبريل 2022 .
- 1 2 3 4 5 6 7 8 "نظرة عامة على لغة F#" (ملف PDF) . تم الاطلاع عليه بتاريخ 14-12-2007 .
- 1 2 "بعض التفاصيل حول تعابير الحساب في لغة F#" . تم الاطلاع عليه بتاريخ 14-12-2007 .
- 1 2 "مطابقة الأنماط في لغة F# الجزء 2 : الأنماط النشطة" . مؤرشف من الأصل بتاريخ 2012-12-09 . تم الاطلاع عليه بتاريخ 2012-11-24 .
- 1 2 3 "مقدمة في سير العمل غير المتزامن في لغة F#" . تم الاطلاع عليه بتاريخ 14-12-2007 .
- ↑ "تعبيرات المهمة" . 19 أبريل 2022. تم الاسترجاع في 15 يناير 2023 .
- ↑ "وحدات القياس (فا#)" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ "توسيع وحدات القياس لتشمل المزيد من الأنواع العددية" . GitHub .
- ↑ "وحدات القياس في فا دييز: الجزء الأول، مقدمة عن الوحدات" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ "اقتباسات الكود (F#)" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ "مقدمو أنواع البيانات" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ "تقرير تقني جديد من مايكروسوفت للأبحاث: دعم لغات البرمجة ذات الأنواع القوية لمصادر المعلومات على نطاق الإنترنت" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ "تعبيرات الاستعلام (F#)" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ "F# 3.0 – LINQ + موفرو الأنواع = برمجة غنية بالمعلومات" . تم الاطلاع عليه بتاريخ 24-11-2012 .
- ↑ ألكسندر كوراكين (15 مارس 2019). "Rider 2019.1 يطلق برنامج الوصول المبكر!" .
- ↑ "استخدام لغة F# على نظام ويندوز" . مؤسسة برمجيات F# . تم الاطلاع عليه بتاريخ 7 أغسطس 2018 .
- ↑ "الميزات - رايدر" . جيت برينز . تم الاسترجاع في 7 أغسطس 2018 .
- ↑ "Fable: JavaScript يمكنك أن تفخر به!" . fable.io . تم الاطلاع عليه بتاريخ 9 ديسمبر 2017 .
- ↑ إنتليفكتوري. "الصفحة الرئيسية لـ WebSharper" . تم الاسترجاع في 24 نوفمبر 2012 .
- ↑ "دراسات حالة مايكروسوفت: مايكروسوفت فيجوال ستوديو 2012 - شركة خدمات مالية" . مايكروسوفت . تم الاطلاع عليه بتاريخ 25-11-2012 .
- ↑ "F# لتداول الطاقة وتحسين المحافظ الاستثمارية" . تم الاطلاع عليه بتاريخ 25-11-2012 .
- ↑ "دراسة حالة مايكروسوفت: شركة غرانج للتأمين" . مايكروسوفت . تم الاطلاع بتاريخ 25-11-2012 .
- ↑ تريلفورد، فيل (2007). "التعلم باستخدام F#" . وقائع ورشة عمل ACM SIGPLAN الرابعة حول المستخدمين التجاريين للبرمجة الوظيفية - CUFP '07 . الصفحات 1-2 . doi : 10.1145/1362702.1362709 . ISBN 9781450378444. S2CID 24018363 . تم الاسترجاع بتاريخ 25-11-2012 .
- ↑ "وظيفة في مجال ألعاب التواصل الاجتماعي على فيسبوك باستخدام لغة F#" . تم الاطلاع عليه بتاريخ 25-11-2012 .
- ↑ "شهادات مطوري لغة F#" . تم الاطلاع عليه بتاريخ 25 مايو 2021 .
- ↑ "البرمجة النصية بلغة F#" . 12 سبتمبر 2008. تم الاطلاع عليه بتاريخ 17 يناير 2020 .
مراجع
- سيمي, دون ; جرانيكز، آدم. سيستيرنينو، أنطونيو (2007)، خبير F# ، Apress
- هاروب، جون (2010)، فيجوال إف شارب 2010 للحوسبة التقنية ، شركة فلاينج فروج للاستشارات
- بيكرينغ، روبرت (2007)، أسس فا دييز ، أبريس
- سميث، كريس (2009)، برمجة F# ، أورايلي
- بيتريتشيك، توماس (2009)، البرمجة الوظيفية في العالم الحقيقي مع أمثلة في F# و C# ، منشورات مانينغ
- هانسن، مايكل. ريشيل، هانز (2013)، البرمجة الوظيفية باستخدام F# ، مطبعة جامعة كامبريدج
- أستبورغ، يوهان (2013)، لغة F# للتمويل الكمي ، دار نشر باكت.
- لوندين، ميكائيل (2015)، الاختبار باستخدام لغة F# ، دار نشر Packt
روابط خارجية
- الموقع الرسمي لمؤسسة برمجيات F#
- مجموعة F# مفتوحة المصدر على GitHub، مؤرشفة بتاريخ 17 مايو 2013 على Wayback Machine
- مركز مطوري Visual F# (مؤرشف بتاريخ 19 نوفمبر 2008 على موقع Wayback Machine)
- جرب لغة F#، لتعلمها في متصفح الويب
- موقع مقتطفات F#
- مدونة فريق Visual F#
- موقع مايكروسوفت للأبحاث الأصلي للغة F#
- دليل البقاء على قيد الحياة في F#، ديسمبر 2009 (كتاب إلكتروني)
- مواصفات لغة F#
- مقدمة في برمجة F# ( مؤرشفة بتاريخ 13 يوليو 2011 على موقع Wayback Machine)
- دليل تعليمي يشرح عملية الوصول إلى تصميم وظيفي؛ يتضمن الاختبار والبرمجة المتوازية
- لغات برمجة .NET
- برامج مجانية متعددة المنصات
- لغات البرمجة عالية المستوى
- اللغات الوظيفية
- برامج مايكروسوفت المجانية
- لغات برمجة مايكروسوفت
- أبحاث مايكروسوفت
- عائلة لغات البرمجة ML
- عائلة لغات البرمجة OCaml
- لغات برمجة مطابقة الأنماط
- لغات البرمجة التي تم إنشاؤها في عام 2005
- لغات البرمجة التي تدعم وحدات القياس
- برنامج يستخدم ترخيص أباتشي
- برنامج مرخص بموجب ترخيص MIT
- لغات البرمجة ذات الكتابة الثابتة
