سكالا (لغة برمجة)
سكالا ( تُلفظ / ˈskɑːlɑː / سكا -لا ) [ 7 ] [ 8 ] هي لغة برمجة عامة الأغراض عالية المستوى ذات كتابة ثابتة قوية ، تدعم كلاً من البرمجة الكائنية والبرمجة الوظيفية . صُممت سكالا لتكون موجزة، [ 9 ] وتهدف العديد من قرارات تصميمها إلى معالجة الانتقادات الموجهة إلى جافا . [ 6 ]
يمكن ترجمة كود Scala المصدري إلى بايت كود JVM وتشغيله على آلة جافا الافتراضية (JVM). كما يمكن تحويل Scala إلى JavaScript لتشغيله في متصفح، أو ترجمته مباشرةً إلى ملف تنفيذي أصلي باستخدام Clang . عند التشغيل على JVM، توفر Scala إمكانية التوافق اللغوي مع Java، بحيث يمكن الرجوع مباشرةً إلى المكتبات المكتوبة بأي من اللغتين في كود Scala أو Java. [ 10 ] ومثل Java، فإن Scala لغة كائنية التوجه ، وتستخدم بنية تُسمى الأقواس المعقوفة ، وهي مشابهة للغة C. منذ Scala 3، أصبح بالإمكان استخدام قاعدة المسافة البادئة (المسافة الجانبية) لتنظيم الكتل ، ويُنصح باستخدامها. وقد صرّح مارتن أوديرسكي بأن هذا التغيير كان الأكثر إنتاجية في Scala 3. [ 11 ]
على عكس جافا، تتمتع سكالا بالعديد من خصائص لغات البرمجة الوظيفية (مثل سكيم ، وستاندرد إم إل ، وهاسكل )، بما في ذلك التخصيص الجزئي ، وعدم قابلية التغيير ، والتقييم الكسول ، ومطابقة الأنماط . كما أنها تمتلك نظام أنواع متقدمًا يدعم أنواع البيانات الجبرية ، والتباين المشترك والتباين العكسي ، وأنواع الرتبة العليا (ولكن ليس أنواع الرتبة العليا )، والأنواع المجهولة ، وتحميل المعاملات الزائد ، والمعاملات الاختيارية ، والمعاملات المسماة ، والسلاسل النصية الخام ، وإصدارًا تجريبيًا للتأثيرات الجبرية يقتصر على الاستثناءات فقط، والذي يمكن اعتباره نسخة أكثر قوة من الاستثناءات المُدققة في جافا . [ 12 ]
اسم Scala هو مزيج من كلمتي scalable و language ، مما يدل على أنه مصمم لينمو مع متطلبات مستخدميه. [ 13 ]
تاريخ
بدأ تصميم لغة سكالا في عام ٢٠٠١ في المدرسة الفيدرالية للفنون التطبيقية في لوزان (EPFL) (في لوزان ، سويسرا ) على يد مارتن أوديرسكي . وقد جاء ذلك استكمالاً للعمل على لغة فانل، وهي لغة برمجة تجمع بين أفكار البرمجة الوظيفية وشبكات بيتري . [ ١٤ ] عمل أوديرسكي سابقاً على لغة جافا العامة ، وجافاك ، مُصرّف جافا الخاص بشركة صن. [ ١٤ ]
بعد إصدار داخلي في أواخر عام 2003، تم إصدار Scala علنًا في أوائل عام 2004 على منصة Java ، [ 15 ] [ 6 ] [ 14 ] [ 16 ] تبع ذلك إصدار ثان (v2.0) في مارس 2006. [ 6 ]
في 17 يناير 2011، فاز فريق سكالا بمنحة بحثية لمدة خمس سنوات تزيد قيمتها عن 2.3 مليون يورو من المجلس الأوروبي للبحوث . [ 17 ] وفي 12 مايو 2011، أطلق أوديرسكي وزملاؤه شركة تايب سيف (التي أعيد تسميتها لاحقًا إلى لايت بيند )، وهي شركة تُعنى بتقديم الدعم التجاري والتدريب والخدمات الخاصة بلغة سكالا. وقد تلقت تايب سيف استثمارًا بقيمة 3 ملايين دولار أمريكي في عام 2011 من شركة غريلوك بارتنرز . [ 18 ] [ 19 ] [ 20 ] [ 21 ]
المنصات والترخيص
تعمل لغة سكالا على منصة جافا ( آلة جافا الافتراضية ) وهي متوافقة مع برامج جافا الحالية. [ 15 ] وبما أن تطبيقات أندرويد تُكتب عادةً بلغة جافا وتُترجم من بايت كود آلة جافا الافتراضية إلى بايت كود دالفيك (والذي قد يُترجم بدوره إلى كود الآلة الأصلي أثناء التثبيت) عند تجميعها ، فإن توافق سكالا مع جافا يجعلها مناسبة تمامًا لتطوير تطبيقات أندرويد، لا سيما عند تفضيل البرمجة الوظيفية. [ 22 ]
يتم إصدار توزيعة برنامج Scala المرجعية، بما في ذلك المترجم والمكتبات، بموجب ترخيص Apache . [ 23 ]
المترجمات والأهداف الأخرى
Scala.js هو مُصرّف لغة Scala يُحوّل البرامج إلى JavaScript، مما يُتيح كتابة برامج Scala قابلة للتشغيل على متصفحات الويب أو Node.js. [ 24 ] وقد أُعلن عن أن المُصرّف، الذي كان قيد التطوير منذ عام 2013، لم يعد تجريبيًا في عام 2015 (الإصدار 0.6). وصدر الإصدار 1.0.0-M1 في يونيو 2018، والإصدار 1.1.1 في سبتمبر 2020. [ 25 ]
Scala Native هو مُصرّف لغة Scala يستهدف بنية مُصرّف LLVM لإنشاء كود قابل للتنفيذ باستخدام بيئة تشغيل مُدارة خفيفة الوزن، تعتمد على جامع النفايات Boehm . يقود المشروع دينيس شابالين، وقد صدرت النسخة الأولى منه، 0.1، في 14 مارس 2017. بدأ تطوير Scala Native في عام 2015 بهدف أن يكون أسرع من التجميع الفوري (JIT) لـ JVM، وذلك من خلال إلغاء التجميع الأولي للكود أثناء التشغيل، بالإضافة إلى توفير إمكانية استدعاء الإجراءات الأصلية مباشرةً. [ 26 ] [ 27 ]
تم إصدار مترجم Scala مرجعي يستهدف إطار عمل .NET ووقت تشغيل اللغة المشتركة الخاص به في يونيو 2004، [ 14 ] ولكن تم إسقاطه رسميًا في عام 2012. [ 28 ]
أمثلة
مثال "مرحباً بالعالم"
يأخذ برنامج "Hello World" المكتوب بلغة Scala 3 الشكل التالي:
@main def main () = println ( "Hello, World!" )على عكس تطبيق Hello World المستقل للغة Java ، لا يوجد تعريف للفئة ولا يتم تعريف أي شيء على أنه ثابت.
عندما يتم تخزين البرنامج في الملف HelloWorld.scala ، يقوم المستخدم بتجميعه باستخدام الأمر التالي:
$ scalac HelloWorld.scala
ويشغله مع
$ scala HelloWorld
يشبه هذا عملية تجميع وتشغيل كود جافا. في الواقع، نموذج تجميع وتنفيذ Scala مطابق لنموذج جافا، مما يجعله متوافقًا مع أدوات بناء جافا مثل Apache Ant .
نسخة مختصرة من برنامج "Hello World" المكتوب بلغة Scala هي:
println ( "Hello, World!" )تتضمن لغة سكالا واجهة تفاعلية ودعمًا للبرمجة النصية. [ 29 ] يمكن تشغيل هذا الملف المحفوظ باسم HelloWorld2.scala، كبرنامج نصي باستخدام الأمر:
$ scala HelloWorld2.scala
يمكن أيضًا إدخال الأوامر مباشرة في مترجم لغة سكالا، باستخدام الخيار -e :
$ scala -e 'println("Hello, World!")'يمكن إدخال التعبيرات بشكل تفاعلي في بيئة REPL :
$ scala مرحبًا بك في Scala 2.12.2 (Java HotSpot(TM) 64-Bit Server VM، Java 1.8.0_131). اكتب التعبيرات لتقييمها. أو جرب :help.scala> List(1, 2, 3).map(x => x * x) res0: List[Int] = List(1, 4, 9)سكالا>مثال أساسي
يوضح المثال التالي الاختلافات بين صيغة Java و Scala. تأخذ الدالة mathFunction عددًا صحيحًا، وتربعه، ثم تضيف الجذر التكعيبي لهذا العدد إلى اللوغاريتم الطبيعي له، وتعيد النتيجة (أي،):
// جافا: int mathFunction ( int num ) { int numSquare = num * num ; return ( int ) ( Math . cbrt ( numSquare ) + Math . log ( numSquare )); } | |
// سكالا: تحويل مباشر من جافا// لا حاجة للاستيراد؛ scala.math // تم استيرادها مسبقًا باسم `math` def mathFunction ( num : Int ): Int = var numSquare : Int = num * num return ( math . cbrt ( numSquare ) + math . log ( numSquare )). asInstanceOf [ Int ] | // سكالا: أكثر اصطلاحية // يستخدم استنتاج النوع، ويحذف عبارة `return`، // ويستخدم دالة `toInt`، ويُعلن أن numSquare غير قابل للتغييرimport math . * def mathFunction ( num : Int ) = val numSquare = num * num ( cbrt ( numSquare ) + log ( numSquare )). toInt |
بعض الاختلافات النحوية في هذا الكود هي:
- لا تتطلب لغة Scala استخدام الفاصلة المنقوطة (;) لإنهاء العبارات.
- تُكتب أنواع القيم بأحرف كبيرة (حالة الجملة):
Int, Double, Booleanبدلاً منint, double, boolean. - تتبع أنواع المعاملات والإرجاع، كما هو الحال في لغة باسكال ، بدلاً من أن تسبق كما هو الحال في لغة سي .
- يجب أن تسبق الطرق بـ
def. - يجب أن تسبق المتغيرات المحلية أو متغيرات الفئة بـ
val(يشير إلى متغير غير قابل للتغيير ) أوvar(يشير إلى متغير قابل للتغيير ). - لا داعي لاستخدام عامل
returnالتشغيل في الدالة (على الرغم من أنه مسموح به)؛ فقيمة العبارة أو التعبير الأخير الذي تم تنفيذه هي عادةً قيمة الدالة. - بدلاً من عامل التحويل في جافا
(Type) foo، تستخدم سكالاfoo.asInstanceOf[Type]، أو دالة متخصصة مثلtoDoubleأوtoInt. foo()يمكن أيضًا تسمية الدالة أو الطريقة بـ justfoo؛thread.send(signo)ويمكن أيضًا تسمية الطريقة بـ just ؛ ويمكن أيضًا تسميةthread send signoالطريقة بـ just .foo.toString()foo toString
تم تصميم هذه التعديلات النحوية للسماح بدعم اللغات الخاصة بمجال معين .
بعض الاختلافات النحوية الأساسية الأخرى:
- تُكتب مراجع المصفوفات مثل استدعاءات الدوال، على سبيل المثال
array(i)بدلاً منarray[i]. (داخليًا في لغة سكالا، يتم توسيع الأول إلى array.apply(i) الذي يُعيد المرجع) - تُكتب الأنواع العامة على النحو التالي: eg
List[String]بدلاً من كتابة الأنواع العامة في لغة جافا .List<String> - بدلاً من النوع الزائف ، تحتوي لغة Scala على فئة singleton
voidالفعلية (انظر أدناه).Unit
مثال مع الفئات
يوضح المثال التالي الفرق بين تعريف الفئات في لغتي جافا وسكالا.
// جافا:فئة عامة Point {متغيران مزدوجان خاصان x و y ؛نقطة عامة ( x ، y ) {this.x = x ;this.y = y ;}public Point ( double x , double y , boolean addToGrid ) {هذا ( س ، ص )؛إذا ( تمت الإضافة إلى الشبكة )grid.addPoint ( this ) ;}نقطة عامة () {this ( 0.0 , 0.0 );}private void addPoint ( Point p ) {x += p . x ;y += p . y ;}public double getX () {أعد x ؛}public double getY () {أعد y ؛}double distanceToPoint ( Point other ) {أعد المسافة بين النقاط ( س ، ص ،other.x , other.y ) ;}private static Point grid = new Point ();المسافة الثابتة بين النقاط (double x1 , double y1 ,double x2 , double y2 ) {أعد Math.hypot ( x1 - x2 , y1 - y2 ) ؛}} | // سكالافئة النقطة (فار x : مزدوج , فار y : مزدوج ,إضافة إلى الشبكة : منطقي = خطأ):استيراد نقطة . *def += ( p : Point ) =x += p . xy += p . yإذا ( تمت الإضافة إلى الشبكة )grid += thisdef this () = this ( 0.0 , 0.0 )دالة المسافة إلى النقطة ( الآخر : نقطة ) =distanceBetweenPoints ( x , y , other . x , other . y )نقطة النهايةنقطة الكائن :private val grid = new Point ()دالة المسافة بين النقاط ( x1 : عدد عشري ، y1 : عدد عشري ،x2 : Double , y2 : Double ) =الرياضيات . الناقص ( x1 - x2 , y1 - y2 ) |
يوضح الكود أعلاه بعض الاختلافات المفاهيمية بين طريقة تعامل لغتي جافا وسكالا مع الفئات:
- لا تحتوي لغة سكالا على متغيرات أو دوال ثابتة. بدلاً من ذلك، تحتوي على كائنات أحادية النسخة ، وهي عبارة عن فئات تحتوي على نسخة واحدة فقط. تُعلن الكائنات الأحادية النسخة باستخدام `<sup>-----`
objectبدلاً من `class<sup>-----`. من الشائع وضع المتغيرات والدوال الثابتة في كائن أحادي النسخة يحمل نفس اسم الفئة، ويُعرف حينها باسم الكائن المرافق . [ 15 ] (تحتوي الفئة الأساسية للكائن الأحادي النسخة على `<sup>-----`$. وبالتالي، بالنسبةclass Fooللكائن المرافق `<sup>-----`object Foo، يوجد في الخلفية فئةFoo$تحتوي على كود الكائن المرافق، ويتم إنشاء كائن واحد من هذه الفئة، باستخدام نمط الكائن الأحادي .) - بدلاً من مُعاملات المُنشئ، تستخدم لغة سكالا مُعاملات الفئة ، التي تُوضع على مستوى الفئة، على غرار مُعاملات الدالة. عند تعريفها باستخدام مُعدِّل ` <input>
val` أو `var<input>`، تُعرَّف الحقول بنفس الاسم، وتُهيأ تلقائيًا من مُعاملات الفئة. (في الواقع، يتم الوصول الخارجي إلى الحقول العامة دائمًا عبر دوال الوصول (getter) ودوال التعديل (setter)، التي تُنشأ تلقائيًا. تحمل دالة الوصول نفس اسم الحقل، ولذلك لا داعي في المثال أعلاه لتعريف دوال الوصول صراحةً). يُمكن أيضًا تعريف مُنشئات بديلة، كما هو الحال في جافا. يُوضع الكود الذي يُفترض أن يُوضع في المُنشئ الافتراضي (باستثناء تهيئة مُتغيرات الأعضاء) مباشرةً على مستوى الفئة. - في لغة سكالا، يُمكن تعريف المعاملات باستخدام الرموز كأسماء للدوال. فبدلاً من
addPoint، يُعرّف مثال سكالا+=، والذي يتم استدعاؤه بعد ذلك باستخدام صيغة الوسط كـgrid += this. - مستوى الرؤية الافتراضي في لغة سكالا هو
public.
الميزات (بالإشارة إلى جافا)
تتمتع لغة Scala بنفس نموذج التجميع الخاص بلغة Java و C# ، أي التجميع المنفصل وتحميل الفئات الديناميكي ، بحيث يمكن لرمز Scala استدعاء مكتبات Java.
تتشابه خصائص تشغيل لغة سكالا مع خصائص جافا. يُولّد مُصرّف سكالا رمزًا ثنائيًا مطابقًا تقريبًا للرمز الذي يُولّده مُصرّف جافا. [ 15 ] في الواقع، يُمكن فكّ شفرة سكالا إلى شفرة جافا قابلة للقراءة، باستثناء بعض عمليات المُنشئ. بالنسبة لآلة جافا الافتراضية (JVM)، لا يُمكن التمييز بين شفرة سكالا وشفرة جافا. الفرق الوحيد هو مكتبة وقت تشغيل إضافية واحدة scala-library.jar. [ 30 ]
تُضيف لغة سكالا عددًا كبيرًا من الميزات مقارنةً بلغة جافا، وتتميز ببعض الاختلافات الجوهرية في نموذجها الأساسي للتعبيرات والأنواع، مما يجعل اللغة أكثر وضوحًا من الناحية النظرية ويُزيل العديد من الحالات الشاذة في جافا. ومن منظور سكالا، يُعد هذا الأمر بالغ الأهمية من الناحية العملية، لأن العديد من الميزات المُضافة في سكالا متوفرة أيضًا في لغة سي شارب.
المرونة التركيبية
كما ذكرنا سابقاً، تتمتع لغة سكالا بمرونة نحوية كبيرة مقارنةً بلغة جافا. وفيما يلي بعض الأمثلة:
- الفواصل المنقوطة غير ضرورية؛ يتم ربط الأسطر تلقائيًا إذا بدأت أو انتهت برمز لا يمكن أن يأتي عادةً في هذا الموضع، أو إذا كانت هناك أقواس أو معقوفات غير مغلقة.
- يمكن استخدام أي دالة كعامل وسطي ، على سبيل المثال،
"%d apples".format(num)و"%d apples" format numمتكافئتان. في الواقع، تُعامل عوامل الحساب مثل+و تمامًا مثل أي دوال أخرى، حيث يُسمح لأسماء الدوال أن تتكون من سلاسل من الرموز العشوائية (مع بعض الاستثناءات لأشياء مثل الأقواس والمعقوفات التي يجب التعامل معها بشكل خاص)؛ والمعاملة الخاصة الوحيدة التي تخضع لها هذه الدوال ذات الأسماء الرمزية تتعلق بمعالجة الأسبقية.<< - للطرق
applyوالصيغupdateالمختصرة النحوية.foo()—حيثfooيمثل قيمة (كائن أحادي أو نسخة من فئة)— هو اختصار لـfoo.apply()، وfoo() = 42هو اختصار لـfoo.update(42). وبالمثل،foo(42)هو اختصار لـfoo.apply(42)، وfoo(4) = 2هو اختصار لـfoo.update(4, 2). يُستخدم هذا مع فئات المجموعات، ويمتد إلى العديد من الحالات الأخرى، مثل خلايا STM . - تُفرّق لغة سكالا بين الدوال التي لا تستخدم الأقواس (
def foo = 42) والدوال التي تستخدم الأقواس الفارغة (def foo() = 42). عند استدعاء دالة تستخدم الأقواس الفارغة، يُمكن حذف الأقواس، وهو أمرٌ مفيد عند استدعاء مكتبات جافا التي لا تُميّز بين الدوال، على سبيل المثال، باستخدامfoo.toStringبدلاً منfoo.toString(). وبحسب الاصطلاح، يجب تعريف الدالة باستخدام الأقواس الفارغة عندما تُنفّذ تأثيرات جانبية . - تتوقع أسماء الدوال التي تنتهي بنقطتين رأسيتين (
::) وجود الوسيط على الجانب الأيسر والمستقبل على الجانب الأيمن. على سبيل المثال، الدالة `this` هي نفسها الدالة `this`، حيث يتطابق الشكل الأول بصريًا مع النتيجة (قائمة تحتوي على العنصر الأول 4 والعنصر الثاني 2).4 :: 2 :: NilNil.::(2).::(4) - يمكن تنفيذ متغيرات جسم الفئة بشفافية كدوال جلب وتعيين منفصلة. بالنسبة لـ
trait FooLike { var bar: Int }، قد يكون التنفيذ كالتالي . سيظل موقع الاستدعاء قادرًا على استخدام صيغة مختصرة .objectFooextendsFooLike{privatevarx=0;defbar=x;defbar_=(value:Int){x=value}}}}foo.bar = 42 - يُسمح باستخدام الأقواس المعقوفة بدلًا من الأقواس العادية في استدعاءات الدوال. وهذا يُتيح استخدام مكتبات برمجية خالصة لتنفيذ هياكل تحكم جديدة. [ 31 ] على سبيل المثال،
breakable { ... if (...) break() ... }يبدو الأمر كما لوbreakableكان كلمة مفتاحية مُعرَّفة في اللغة، ولكنه في الواقع مجرد دالة تأخذ وسيطًا من نوع thunk . غالبًا ما تضع الدوال التي تأخذ وسائط thunk أو دوال هذه الوسائط في قائمة وسيطات ثانية، مما يسمح بدمج صيغتي الأقواس العادية والمعقوفة:Vector.fill(4) { math.random }هي نفسهاVector.fill(4)(math.random). يسمح استخدام الأقواس المعقوفة بامتداد التعبير على عدة أسطر. - يمكن لتعبيرات for (الموضحة أدناه) أن تستوعب أي نوع يحدد طرقًا أحادية مثل
mapو .flatMapfilter
قد تبدو هذه الخيارات، منفردةً، مثيرةً للجدل، لكنها مجتمعةً تُحقق الغرضَ المتمثل في السماح بتعريف لغاتٍ خاصةٍ بمجالٍ مُحددٍ في لغة سكالا دون الحاجة إلى توسيع المُصرّف. على سبيل المثال، يمكن (ويتم بالفعل) تطبيقُ الصيغة الخاصة بلغة إرلانج لإرسال رسالةٍ إلى مُمثلٍ في مكتبة سكالا دون الحاجة إلى إضافاتٍ لغوية.actor ! message
نظام النوع الموحد
تُفرّق لغة جافا بوضوح بين الأنواع الأولية (مثل `int` intو` booleanint`) والأنواع المرجعية (أي فئة `int` ). الأنواع المرجعية فقط هي التي تُورَث من `int` java.lang.Object. في لغة سكالا، ترث جميع الأنواع من فئة رئيسية `int` Any، والتي تُعدّ `int` و`int` من AnyValالفئات الفرعية المباشرة (مثل Int`int` و`int` Boolean) و`int` AnyRefمن الفئات المرجعية (كما في جافا). هذا يعني أن التمييز الموجود في جافا بين الأنواع الأولية والأنواع المُغلّفة (مثل `int` intو`int` Integer) غير موجود في سكالا؛ فعمليتا التغليف وفك التغليف شفافتان تمامًا للمستخدم. يسمح إصدار سكالا 2.10 للمستخدم بتعريف أنواع قيم جديدة.
تعبيرات من أجل
بدلاً من حلقات " foreach " في جافا للتكرار عبر عنصر مُكرِّر، تستخدم سكالا forتعابير for، وهي مشابهة لتعبيرات القوائم في لغات مثل هاسكل ، أو مزيج من تعبيرات القوائم وتعبيرات المُولِّدات في بايثونyield . تسمح تعابير for باستخدام الكلمة المفتاحية بإنشاء مجموعة جديدة من خلال التكرار على مجموعة موجودة، وإرجاع مجموعة جديدة من نفس النوع. يُترجمها المُصرِّف إلى سلسلة من mapاستدعاءات flatMapfor و filter. عندما yieldلا تُستخدم الكلمة المفتاحية، يقترب الكود من نمط حلقة الأمر، وذلك بترجمته إلى foreach.
مثال بسيط على ذلك هو:
val s = for ( x <- 1 to 25 if x * x > 50 ) yield 2 * xنتيجة تشغيله هي المتجه التالي:
Vector(16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)
(التعبير 1 to 25ليس صيغة خاصة. بل يتم تعريف الطريقة toفي مكتبة Scala القياسية كطريقة امتداد على الأعداد الصحيحة، باستخدام تقنية تُعرف باسم التحويلات الضمنية [ 32 ] والتي تسمح بإضافة طرق جديدة إلى الأنواع الموجودة.)
ومن الأمثلة الأكثر تعقيدًا على التكرار عبر الخريطة ما يلي:
// بالنظر إلى خريطة تحدد مستخدمي تويتر المذكورين في مجموعة من التغريدات، // وعدد مرات ذكر كل مستخدم، ابحث عن المستخدمين // في خريطة للسياسيين المعروفين، وأرجع خريطة جديدة تعرض فقط // السياسيين الديمقراطيين (ككائنات، وليس كسلاسل نصية). val dem_mentions = for ( mention , times ) <- mentions account <- accounts . get ( mention ) if account . party == "Democratic" yield ( account , times )يُعدّ التعبير مثالًا على مطابقة الأنماط (انظر أدناه). تُعيد عملية التكرار على خريطة مجموعة من أزواج المفاتيح والقيم ، وتتيح مطابقة الأنماط تفكيك هذه الأزواج بسهولة إلى متغيرات منفصلة للمفتاح والقيمة. وبالمثل، تُعيد نتيجة الفهم أيضًا أزواج المفاتيح والقيم، والتي تُعاد بناؤها تلقائيًا إلى خريطة لأن الكائن المصدر (من المتغير ) هو خريطة. لو احتوى المتغير على قائمة أو مجموعة أو مصفوفة أو أي مجموعة أخرى من الأزواج، فإن نفس الكود أعلاه سيُنتج مجموعة جديدة من نفس النوع.(mention, times) <- mentionsmentionsmentions
الميول الوظيفية
إلى جانب دعمها لجميع ميزات البرمجة الكائنية المتوفرة في جافا (بل وتعزيزها بطرق متنوعة)، توفر سكالا أيضًا عددًا كبيرًا من الإمكانيات التي لا توجد عادةً إلا في لغات البرمجة الوظيفية . وتتيح هذه الميزات مجتمعةً كتابة برامج سكالا بأسلوب وظيفي بالكامل تقريبًا، كما تسمح بدمج الأسلوبين الوظيفي والكائني.
ومن الأمثلة على ذلك:
- لا يوجد فرق بين التصريحات والتعبيرات
- استنتاج النوع
- الدوال المجهولة ذات الدلالات الالتقاطية (أي، الإغلاقات )
- المتغيرات والكائنات غير القابلة للتغيير
- التقييم الكسول
- الاستمرارات المحددة (منذ الإصدار 2.8)
- الدوال ذات الرتبة العليا
- الدوال المتداخلة
- الكاري
- مطابقة الأنماط
- أنواع البيانات الجبرية (من خلال فئات الحالة )
- المجموعات
كل شيء تعبير
على عكس لغتي C أو Java ، ولكن على غرار لغات مثل Lisp ، لا تُميّز Scala بين العبارات والتعبيرات . فجميع العبارات هي في الواقع تعبيرات تُقيّم إلى قيمة ما. الدوال التي تُعرّف على أنها تُرجع قيمة voidفي C أو Java، والعبارات التي whileلا تُرجع قيمة منطقيًا، تُعتبر في Scala أنها تُرجع النوع `Return` Unit، وهو نوع أحادي ، يحتوي على كائن واحد فقط من هذا النوع. أما الدوال والمعاملات التي لا تُرجع قيمة على الإطلاق (مثل throwالمعامل `return` أو دالة تنتهي دائمًا بشكل غير محلي باستخدام استثناء) فلها منطقيًا نوع `Return` Nothing، وهو نوع خاص لا يحتوي على أي كائنات؛ أي أنه نوع أساسي ، أي فئة فرعية من كل نوع ممكن. (وهذا بدوره يجعل النوع `Return` Nothingمتوافقًا مع كل نوع، مما يسمح باستنتاج النوع بالعمل بشكل صحيح). [ 33 ]
وبالمثل، فإن if-then-else"العبارة" هي في الواقع تعبير ينتج قيمة، أي نتيجة تقييم أحد الفرعين. وهذا يعني أنه يمكن إدراج مثل هذه الكتلة البرمجية أينما لزم التعبير، مما يُغني عن الحاجة إلى عامل الشرط الثلاثي في لغة سكالا.
// جافا: char hexDigit = ( char )( x >= 10 ? x + 'A' - 10 : x + '0' ); | // سكالا: val hexDigit = ( if x >= 10 then x + 'A' - 10 else x + '0' ). toChar |
ولأسباب مماثلة، returnفإن استخدام العبارات غير ضروري في لغة سكالا، بل يُنصح بتجنبه. وكما هو الحال في لغة ليسب ، فإن آخر تعبير في كتلة برمجية هو قيمة تلك الكتلة، وإذا كانت الكتلة البرمجية هي جسم دالة، فستُعيدها الدالة.
ولتوضيح أن جميع الدوال عبارة عن تعابير، حتى الطرق التي تُرجع قيمة Unitتُكتب بعلامة يساوي.
دالة printValue ( x : String ): Unit = println ( "I ate a %s" . format ( x ))أو بصورة مكافئة (مع استنتاج النوع، وحذف السطر الجديد غير الضروري):
دالة printValue ( x : String ) = println ( "I ate a %s" format x )استنتاج النوع
بفضل خاصية استنتاج الأنواع ، يمكن عادةً حذف أنواع المتغيرات وقيم الإرجاع للدوال والعديد من التعبيرات الأخرى، حيث يستطيع المترجم استنتاجها. ومن الأمثلة على ذلك val x = "foo"(للثوابت غير القابلة للتغيير أو الكائنات غير القابلة للتغيير ) أو var x = 1.5(للمتغيرات التي يمكن تغيير قيمتها لاحقًا). يُعد استنتاج الأنواع في لغة سكالا محليًا في جوهره، على عكس خوارزمية هيندلي-ميلنر الأكثر شمولية المستخدمة في لغات مثل هاسكل و ML وغيرها من اللغات الوظيفية البحتة. ويتم ذلك لتسهيل البرمجة كائنية التوجه. ونتيجةً لذلك، لا يزال من الضروري تعريف بعض الأنواع (وأبرزها معاملات الدوال وأنواع الإرجاع للدوال التكرارية )، على سبيل المثال
دالة تنسيق التفاح ( x : عدد صحيح ) = "أكلت %d تفاحة " .تنسيق ( x )أو (مع تحديد نوع الإرجاع لدالة تكرارية)
دالة حساب المضروب ( س : عدد صحيح ): عدد صحيح = إذا كان س == 0 فإن س = 1 وإلا س * مضروب ( س - 1 )الوظائف المجهولة
في لغة سكالا، تُعتبر الدوال كائنات، وهناك صيغة ملائمة لتحديد الدوال المجهولة . مثال على ذلك التعبير `f` x => x < 2، الذي يُحدد دالة ذات مُعامل واحد، تُقارن وسيطها لمعرفة ما إذا كان أقل من 2. وهو مُكافئ للصيغة `f` في لغة ليسب . لا يلزم تحديد نوع ` x` أو نوع القيمة المُعادة بشكل صريح، ويمكن استنتاجهما عمومًا من خلال استنتاج النوع ؛ ولكن يُمكن تحديدهما بشكل صريح، على سبيل المثال، كـ `f` أو حتى `f` .(lambda(x)(<x2))(x:Int)=>x<2(x:Int)=>(x<2):Boolean
تتصرف الدوال المجهولة كدوال مغلقة حقيقية ، إذ أنها تستحوذ تلقائيًا على أي متغيرات متاحة معجميًا في بيئة الدالة المُحيطة. وتبقى هذه المتغيرات متاحة حتى بعد انتهاء الدالة المُحيطة، وعلى عكس حالة الفئات الداخلية المجهولة في جافا ، لا يلزم تعريفها على أنها نهائية. (بل من الممكن تعديل هذه المتغيرات إذا كانت قابلة للتغيير، وستكون القيمة المُعدّلة متاحة عند استدعاء الدالة المجهولة في المرة التالية).
يستخدم شكل أقصر من الدوال المجهولة متغيرات بديلة : على سبيل المثال، ما يلي:
list map { x => sqrt(x) }
يمكن كتابتها بشكل أكثر إيجازًا على النحو التالي:
list map { sqrt(_) }
أو حتى
list map sqrt
ثبات
تفرض لغة سكالا تمييزًا بين المتغيرات الثابتة والمتغيرات القابلة للتغيير. تُصرَّح المتغيرات القابلة للتغيير باستخدام varالكلمة المفتاحية `value`، بينما تُصرَّح القيم الثابتة باستخدام valالكلمة المفتاحية `value`. لا يمكن إعادة تعيين قيمة لمتغير مُصرَّح عنه باستخدام valالكلمة المفتاحية `value`، تمامًا كما هو الحال finalفي جافا حيث لا يمكن إعادة تعيين قيمة لمتغير مُصرَّح عنه باستخدام الكلمة المفتاحية `value`. valتكون القيم الثابتة سطحية فقط، أي أن الكائن الذي يُشار إليه بواسطة قيمة ثابتة ليس بالضرورة ثابتًا في حد ذاته.
يُشجع استخدام الفئات غير القابلة للتغيير وفقًا للعرف، وتوفر مكتبة Scala القياسية مجموعة غنية من فئات المجموعات غير القابلة للتغيير . توفر Scala متغيرات قابلة للتغيير وغير قابلة للتغيير لمعظم فئات المجموعات، ويُستخدم الإصدار غير القابل للتغيير دائمًا ما لم يتم استيراد الإصدار القابل للتغيير صراحةً. [ 34 ] تُعد المتغيرات غير القابلة للتغيير هياكل بيانات مستمرة تُعيد دائمًا نسخة مُحدثة من الكائن القديم بدلًا من تحديث الكائن القديم بشكل جذري. مثال على ذلك القوائم المرتبطة غير القابلة للتغيير ، حيث تتم إضافة عنصر إلى بداية القائمة عن طريق إرجاع عقدة قائمة جديدة تتكون من العنصر ومرجع إلى نهاية القائمة. لا يمكن إضافة عنصر إلى نهاية القائمة إلا عن طريق إضافة جميع عناصر القائمة القديمة إلى بداية قائمة جديدة تحتوي على العنصر الجديد فقط. وبالمثل، فإن إدراج عنصر في منتصف قائمة سيؤدي إلى نسخ النصف الأول من القائمة، مع الاحتفاظ بمرجع إلى النصف الثاني. يُسمى هذا بالمشاركة الهيكلية. وهذا يُتيح التزامن بسهولة بالغة - فلا حاجة إلى أقفال لأن الكائنات المشتركة لا تُعدل أبدًا. [ 35 ]
التقييم الكسول (غير الصارم)
التقييم صارم ("مُستعجل") افتراضيًا. بمعنى آخر، تُقيّم لغة سكالا التعبيرات فور توفرها، وليس عند الحاجة. مع ذلك، يُمكن تعريف متغير على أنه غير صارم ("كسول") باستخدام الكلمة lazyالمفتاحية `lazy`، ما يعني أن الكود المسؤول عن إنتاج قيمة المتغير لن يُقيّم إلا عند أول استدعاء له. توجد أيضًا مجموعات غير صارمة من أنواع مختلفة (مثل النوع ` Streamlist`، وهو قائمة مرتبطة غير صارمة)، ويمكن جعل أي مجموعة غير صارمة باستخدام الدالة ` viewlazy`. تُناسب المجموعات غير الصارمة دلاليًا البيانات المُنتجة من الخادم، حيث لا يتم تقييم الكود المسؤول عن إنشاء عناصر لاحقة من القائمة (والتي بدورها تُرسل طلبًا إلى خادم، قد يكون موجودًا في مكان آخر على الإنترنت) إلا عند الحاجة الفعلية إلى هذه العناصر.
التكرار الذيل
تُوفّر لغات البرمجة الوظيفية عادةً تحسينًا لاستدعاءات الذيل، مما يسمح بالاستخدام المكثف للتكرار دون مشاكل تجاوز سعة المكدس . إلا أن قيود بايت كود JVM تُعقّد عملية تحسين استدعاءات الذيل على JVM. بشكل عام، يُمكن تحسين دالة تستدعي نفسها باستدعاء ذيل، لكن لا يُمكن تحسين الدوال المُتكررة المتبادلة. وقد اقتُرحت دوال الترامبولين كحل بديل. [ 36 ] تدعم مكتبة Scala دوال الترامبولين من خلال الكائن scala.util.control.TailCallsمنذ إصدار Scala 2.8.0 (الصادر في 14 يوليو 2010). يُمكن إضافة تعليق توضيحي اختياري للدالة @tailrec، وفي هذه الحالة لن يتم تجميعها إلا إذا كانت دالة تكرار ذيل. [ 37 ]
يمكن تطبيق مثال على هذا التحسين باستخدام تعريف المضروب . على سبيل المثال، الصيغة التكرارية للمضروب هي:
دالة حساب المضروب ( n : عدد صحيح ): عدد صحيح = إذا كان n يساوي 0 فإن 1 وإلا n * مضروب ( n - 1 )يمكن تحسينها لتصبح نسخة تكرارية نهائية على النحو التالي:
@tailrec def مضروب ( n : Int , accum : Int ): Int = إذا n == 0 ثم تراكم مضروب آخر ( n - 1 , n * accum )ومع ذلك، قد يؤدي هذا إلى الإضرار بإمكانية التركيب مع وظائف أخرى بسبب الوسيط الجديد في تعريفها، لذلك من الشائع استخدام الإغلاقات للحفاظ على توقيعها الأصلي:
دالة حساب المضروب ( ن : عدد صحيح ): عدد صحيح =@tailrecحلقة def ( الحالية : Int , تراكم : Int ): Int =إذا كان التيار يساوي صفرًا ، فقم بالتراكمحلقة أخرى ( التيار - 1 ، التيار * تراكم )حلقة ( ن ، 1 ) // استدعاء للدالة المغلقة باستخدام الحالة الأساسيةالعامل النهائييضمن هذا تحسين استدعاء الذيل وبالتالي يمنع حدوث خطأ تجاوز سعة المكدس.
فئات الحالات ومطابقة الأنماط
تدعم لغة سكالا مطابقة الأنماط بشكلٍ مُدمج ، والتي يُمكن اعتبارها نسخةً أكثر تطورًا وقابليةً للتوسيع من عبارة switch ، حيث يُمكن مطابقة أنواع بيانات مُختلفة (بدلًا من الأنواع البسيطة كالأعداد الصحيحة والقيم المنطقية والسلاسل النصية)، بما في ذلك التداخلات المُعقدة. يُوفر نوعٌ خاص من الفئات يُعرف بفئة الحالة (case class) ، والذي يتضمن دعمًا تلقائيًا لمطابقة الأنماط، ويُمكن استخدامه لنمذجة أنواع البيانات الجبرية المُستخدمة في العديد من لغات البرمجة الوظيفية. (من منظور سكالا، فئة الحالة هي ببساطة فئة عادية يُضيف لها المُترجم تلقائيًا سلوكيات مُعينة يُمكن توفيرها يدويًا، مثل تعريفات الدوال التي تُتيح إجراء مُقارنات عميقة وتجزئة، وتفكيك فئة الحالة بناءً على مُعاملات المُنشئ أثناء مطابقة الأنماط).
فيما يلي مثال على تعريف خوارزمية الفرز السريع باستخدام مطابقة الأنماط:
دالة qsort ( قائمة : قائمة [ عدد صحيح ]): قائمة [ عدد صحيح ] = قائمة مطابقة حالة Nil => Nil حالة pivot :: tail => val ( أصغر ، باقي ) = tail . partition ( _ < pivot ) qsort ( أصغر ) ::: pivot :: qsort ( باقي )تعتمد الفكرة هنا على تقسيم القائمة إلى عناصر أصغر من عنصر محوري وعناصر أكبر منه، ثم فرز كل جزء بشكل متكرر، ولصق النتائج مع العنصر المحوري بينها. وهذا يستخدم نفس استراتيجية فرق تسد المستخدمة في فرز الدمج وخوارزميات الفرز السريع الأخرى.
يُستخدم هذا matchالمعامل لمطابقة الأنماط على الكائن المُخزَّن في list`. تُجرَّب كل caseعبارة بدورها لمعرفة ما إذا كانت ستُطابق، وتُحدِّد المطابقة الأولى النتيجة. في هذه الحالة، Nilيُطابق المعامل الكائن الحرفي Nil`، بينما يُطابق قائمة غير فارغة، ويُفكِّك القائمة في الوقت نفسه وفقًا للنمط المُعطى. في هذه الحالة، سيتمكن الكود المُصاحب من الوصول إلى متغير محلي يُسمى ` head` يحتوي على رأس القائمة، ومتغير آخر يحتوي على ذيل القائمة. هذه المتغيرات للقراءة فقط، وهي مُشابهة دلاليًا جدًا لربط المتغيرات المُنشأ باستخدام المعامل `--` في لغتي Lisp وScheme.pivot :: tailpivottaillet
tail.partitionيحدث مطابقة الأنماط أيضًا في تعريفات المتغيرات المحلية. في هذه الحالة، تكون القيمة المُعادة من استدعاء الدالة عبارة عن صف (tuple) - أي قائمتين. (تختلف الصفوف عن أنواع الحاويات الأخرى، مثل القوائم، في أنها دائمًا ذات حجم ثابت، ويمكن أن تكون عناصرها من أنواع مختلفة - مع أنها هنا من النوع نفسه). تُعد مطابقة الأنماط أسهل طريقة لجلب جزئي الصف.
هذا النموذج هو إعلان عن دالة مجهولة مع متغير عنصر نائب؛ انظر القسم أعلاه حول الدوال المجهولة._ < pivot
يظهر كل من عاملي القوائم ::(الذي يُضيف عنصرًا إلى بداية قائمة، كما هو الحال consفي لغتي Lisp وScheme) و :::(الذي يُلحق قائمتين معًا، كما هو الحال appendفي لغتي Lisp وScheme). على الرغم من المظهر، لا يوجد شيء "مُدمج" في أي من هذين العاملين. كما ذُكر أعلاه، يمكن لأي سلسلة من الرموز أن تُستخدم كاسم دالة، ويمكن كتابة طريقة مُطبقة على كائن بأسلوب "infix" بدون نقطة أو أقواس. السطر أعلاه كما هو مكتوب:
qsort(smaller) ::: pivot :: qsort(rest)
ويمكن كتابتها أيضاً على النحو التالي:
qsort(rest).::(pivot).:::(qsort(smaller))
باستخدام صيغة استدعاء الأساليب الأكثر شيوعًا. (الأساليب التي تنتهي بنقطتين رأسيتين تكون مرتبطة من اليمين وترتبط بالكائن الموجود على اليمين.)
الدوال الجزئية
matchفي مثال مطابقة الأنماط أعلاه، يكون جسم المعامل عبارة عن دالة جزئية ، تتكون من سلسلة من caseالتعبيرات، حيث يسود التعبير المطابق الأول، على غرار جسم عبارة switch . تُستخدم الدوال الجزئية أيضًا في جزء معالجة الاستثناءات من tryالعبارة.
حاول ... أمسك في حالة nfe : NumberFormatException => { println ( nfe ); List ( 0 ) } حالة _ => Nilأخيرًا، يمكن استخدام دالة جزئية بمفردها، وتكون نتيجة استدعائها مكافئة لإجراء عملية عليها. على سبيل المثال، يمكن كتابة matchالكود السابق لخوارزمية الفرز السريع على النحو التالي:
val qsort : List [ Int ] => List [ Int ] = case Nil => Nil case pivot :: tail => val ( smaller , rest ) = tail . partition ( _ < pivot ) qsort ( smaller ) ::: pivot :: qsort ( rest )هنا، يتم تعريف متغير للقراءة فقط، نوعه دالة من قوائم الأعداد الصحيحة إلى قوائم الأعداد الصحيحة، ويتم ربطه بدالة جزئية. (لا يتم تعريف أو تسمية المعامل الوحيد للدالة الجزئية بشكل صريح). ومع ذلك، لا يزال بإمكاننا استدعاء هذا المتغير تمامًا كما لو كان دالة عادية.
scala > qsort ( List ( 6 , 2 , 5 , 9 )) res32 : List [ Int ] = List ( 2 , 5 , 6 , 9 )امتدادات موجهة للكائنات
لغة سكالا هي لغة كائنية التوجه خالصة، بمعنى أن كل قيمة فيها هي كائن . تُوصف أنواع البيانات وسلوكيات الكائنات بواسطة الأصناف والسمات . يتم توسيع تجريدات الأصناف من خلال التوريث الفرعي وآلية تركيب مرنة تعتمد على المزيج لتجنب مشاكل التوريث المتعدد .
تُعدّ السمات (Traits) بديلاً في لغة سكالا عن واجهات جافا ( Interfaces ). تُقيّد واجهات جافا في الإصدارات الأقدم من 8 بشكل كبير، إذ تقتصر على تعريفات الدوال المجردة. وقد أدى ذلك إلى انتقادات مفادها أن توفير دوال مُيسّرة في الواجهات أمرٌ غير عملي (إذ يجب إعادة تنفيذ الدوال نفسها في كل تطبيق)، وأن توسيع واجهة منشورة بطريقة متوافقة مع الإصدارات السابقة أمرٌ مستحيل. تُشبه السمات فئات المزج (mixin classes) في أنها تتمتع بمعظم إمكانيات الفئة المجردة العادية، باستثناء معلمات الفئة (المكافئ في سكالا لمعلمات المُنشئ في جافا)، لأن السمات تُدمج دائمًا مع فئة. superيتصرف المعامل `<Traits>` بشكل خاص في السمات، مما يسمح بربط السمات باستخدام التركيب بالإضافة إلى الوراثة. المثال التالي هو نظام نوافذ بسيط:
فئة مجردة Window : // دالة مجردة draw ()class SimpleWindow extends Window : def draw () println ( "in SimpleWindow" ) // رسم نافذة أساسيةالسمة WindowDecoration تمتد من Windowالسمة HorizontalScrollbarDecoration ترث من WindowDecoration : // نحتاج هنا إلى "تجاوز مجرد" لكي تعمل الدالة "super()" لأن الدالة الأصلية // مجردة. لو كانت ملموسة، لكان "التجاوز" العادي كافيًا. تجاوز مجرد def draw ( ) println ( "في HorizontalScrollbarDecoration" ) super.draw ( ) // الآن ارسم شريط تمرير أفقيtrait VerticalScrollbarDecoration extends WindowDecoration : abstract override def draw () println ( "in VerticalScrollbarDecoration" ) super . draw () // الآن ارسم شريط تمرير عموديtrait TitleDecoration extends WindowDecoration : abstract override def draw () println ( "in TitleDecoration" ) super . draw () // الآن ارسم شريط العنوانيمكن تعريف المتغير على النحو التالي:
val mywin = new SimpleWindow with VerticalScrollbarDecoration with HorizontalScrollbarDecoration with TitleDecorationنتيجة الاتصال mywin.draw()هي:
في قسم "زخرفة العنوان" في قسم " زخرفة شريط التمرير الأفقي" في قسم "زخرفة شريط التمرير الرأسي" في قسم "النافذة البسيطة"بمعنى آخر، استدعى الأمر drawأولاً تنفيذ الكود في TitleDecoration(آخر سمة مُدمجة)، ثم (عبر الاستدعاءات super()) عاد عبر السمات المُدمجة الأخرى وصولاً إلى الكود في Window، على الرغم من عدم وجود سمات موروثة من بعضها البعض . يشبه هذا نمط المُزخرف ، ولكنه أكثر إيجازًا وأقل عرضة للأخطاء، إذ لا يتطلب تغليف النافذة الأصلية صراحةً، أو إعادة توجيه الدوال التي لم يتغير تنفيذها صراحةً، أو الاعتماد على تهيئة علاقات الكيانات في وقت التشغيل. في لغات أخرى، يمكن تحقيق تأثير مماثل في وقت الترجمة باستخدام سلسلة خطية طويلة من وراثة التنفيذ ، ولكن مع عيب مقارنةً بلغة سكالا، وهو ضرورة تعريف سلسلة وراثة خطية لكل تركيبة ممكنة من السمات المُدمجة.
نظام الكتابة التعبيري
تتميز لغة سكالا بنظام أنواع ثابت معبّر يفرض في الغالب استخدامًا آمنًا ومتسقًا للتجريدات. مع ذلك، فإن نظام الأنواع هذا ليس سليمًا تمامًا . [ 38 ] وعلى وجه الخصوص، يدعم نظام الأنواع ما يلي:
- الفئات والأنواع المجردة كأعضاء للكائنات
- الأنواع الهيكلية
- أنواع تعتمد على المسار
- أنواع المركبات
- المراجع الذاتية المكتوبة صراحةً
- الفئات العامة
- الأساليب متعددة الأشكال
- حدود الكتابة العليا والسفلى
- التباين
- شرح
- المشاهدات
تستطيع لغة سكالا استنتاج الأنواع من خلال استخدامها، مما يجعل معظم تعريفات الأنواع الثابتة اختيارية. لا يلزم تعريف الأنواع الثابتة صراحةً إلا إذا أشار خطأ في المُصرّف إلى ضرورة ذلك. عمليًا، تُضمّن بعض تعريفات الأنواع الثابتة لضمان وضوح الكود.
إثراء النوع
تُعرف تقنية شائعة في لغة سكالا باسم "إثراء مكتبتي" [ 39 ] (أطلق عليها مارتن أوديرسكي في الأصل اسم " تزيين مكتبتي " عام 2006؛ [ 32 ] وقد أُثيرت مخاوف بشأن هذه الصياغة نظرًا لدلالاتها السلبية [ 40 ] وعدم نضجها [ 41 ] )، وتتيح استخدام طرق جديدة كما لو كانت مُضافة إلى أنواع موجودة. يُشبه هذا مفهوم طرق الإضافة في لغة سي شارب ، ولكنه أكثر قوة، لأن هذه التقنية لا تقتصر على إضافة الطرق، بل يُمكن استخدامها، على سبيل المثال، لتنفيذ واجهات جديدة. في سكالا، تتضمن هذه التقنية تعريف تحويل ضمني من النوع "المُستقبل" للطريقة إلى نوع جديد (عادةً ما يكون فئة) يُغلّف النوع الأصلي ويُوفّر الطريقة الإضافية. إذا لم يتم العثور على طريقة لنوع مُعين، يبحث المُصرّف تلقائيًا عن أي تحويلات ضمنية مُناسبة إلى أنواع تُوفّر الطريقة المطلوبة.
تسمح هذه التقنية بإضافة طرق جديدة إلى فئة موجودة باستخدام مكتبة إضافية بحيث لا يحصل على الوظائف الجديدة إلا الكود الذي يستورد المكتبة الإضافية، بينما لا تتأثر جميع الأكواد الأخرى.
يوضح المثال التالي إثراء النوع Intبالأساليب isEvenو isOdd:
الكائن MyExtensions : الامتداد ( i : Int ) def isEven = i % 2 == 0 def isOdd = ! أنا . isEvenاستيراد MyExtensions . * // إدخال الإثراء الضمني في النطاق 4.isEven // -> صحيحيؤدي استيراد أعضاء الفئة MyExtensionsإلى إدخال التحويل الضمني إلى فئة الامتداد IntPredicatesفي النطاق. [ 42 ]
التزامن
تتضمن مكتبة Scala القياسية دعمًا للمستقبلات والوعود ، بالإضافة إلى واجهات برمجة تطبيقات التزامن القياسية في Java. في الأصل، كانت تدعم أيضًا نموذج الممثل ، المتوفر الآن كمنصة Akka [ 43 ] مستقلة متاحة المصدر، مرخصة من شركة Lightbend Inc. يمكن توزيع ممثلي Akka أو دمجهم مع ذاكرة المعاملات البرمجية ( transactors ). من بين تطبيقات عمليات الاتصال التسلسلي (CSP) البديلة لتمرير الرسائل عبر القنوات، كائنات Scala المتصلة [ 44 ]، أو ببساطة عبر JCSP .
الممثل (Actor) أشبه بمثيل سلسلة عمليات (Thread) مزود بصندوق بريد. يمكن إنشاؤه عن طريق system.actorOfتجاوز receiveدالة استقبال الرسائل واستخدام !دالة إرسال الرسائل. [ 45 ] يوضح المثال التالي خادم صدى (EchoServer) يمكنه استقبال الرسائل ثم طباعتها.
val echoServer = actor ( new Act : become : case msg => println ( "echo " + msg ) )echoServer ! "hi"كما يأتي Scala مزودًا بدعم مدمج للبرمجة المتوازية للبيانات في شكل مجموعات متوازية [ 46 ] مدمجة في مكتبتها القياسية منذ الإصدار 2.9.0.
يوضح المثال التالي كيفية استخدام المجموعات المتوازية لتحسين الأداء. [ 47 ]
val urls = List ( "https://scala-lang.org" , "https://github.com/scala/scala" )def fromURL ( url : String ) = scala.io.Source.fromURL ( url ) .getLines ( ) . mkString ( " \ n " )val t = System.currentTimeMillis ( ) urls.par.map ( fromURL ( _ ) ) // تُعيد par تنفيذًا متوازيًا لمجموعة println ( " الوقت: " + ( System.currentTimeMillis - t ) + " مللي ثانية " )إلى جانب المستقبلات والوعود، ودعم الفاعلين، وتوازي البيانات ، تدعم لغة سكالا أيضًا البرمجة غير المتزامنة باستخدام ذاكرة المعاملات البرمجية، وتدفقات الأحداث. [ 48 ]
الحوسبة العنقودية
يُعدّ Apache Spark أشهر حلول الحوسبة العنقودية مفتوحة المصدر المكتوبة بلغة Scala . بالإضافة إلى ذلك، فإن Apache Kafka ، وهو نظام قوائم انتظار الرسائل القائم على النشر والاشتراك والذي يُستخدم بكثرة مع Spark وتقنيات معالجة البيانات المتدفقة الأخرى، مكتوب بلغة Scala.
الاختبار
توجد عدة طرق لاختبار التعليمات البرمجية في لغة سكالا. يدعم ScalaTest أنماط اختبار متعددة، ويمكن دمجه مع أطر اختبار مبنية على جافا. [ 49 ] ScalaCheck مكتبة مشابهة لـ QuickCheck في لغة هاسكل . [ 50 ] specs2 مكتبة لكتابة مواصفات البرامج القابلة للتنفيذ. [ 51 ] يوفر ScalaMock دعمًا لاختبار الدوال عالية الرتبة والدوال المُجزأة. [ 52 ] JUnit و TestNG إطاران شائعان للاختبار مكتوبان بلغة جافا.
الإصدارات
| إصدار | مطلق سراحه | سمات |
|---|---|---|
| 1.0.0-b2 [ 53 ] | 8 ديسمبر 2003 | — |
| 1.1.0-b1 [ 53 ] | 19 فبراير 2004 |
|
| 1.1.1 [ 53 ] | 23 مارس 2004 |
|
| 1.2.0 [ 53 ] | 9 يونيو 2004 |
|
| 1.3.0 [ 53 ] | 16 سبتمبر 2004 |
|
| 1.4.0 [ 53 ] | 20 يونيو 2005 |
|
| 2.0 [ 55 ] | 12 مارس 2006 |
|
| 2.1.0 [ 53 ] | 17 مارس 2006 |
|
| 2.1.8 [ 56 ] | 23 أغسطس 2006 |
|
| 2.3.0 [ 57 ] | 23 نوفمبر 2006 |
|
| 2.4.0 [ 58 ] | 9 مارس 2007 |
|
| 2.5.0 [ 59 ] | 2 مايو 2007 |
|
| 2.6.0 [ 60 ] | 27 يوليو 2007 |
|
| 2.7.0 [ 61 ] | 7 فبراير 2008 |
|
| 2.8.0 [ 62 ] | 14 يوليو 2010 |
|
| 2.9.0 [ 63 ] | 12 مايو 2011 |
|
| 2.10 [ 64 ] | 4 يناير 2013 |
الميزات التجريبية |
| 2.10.2 [ 74 ] | 6 يونيو 2013 | — |
| 2.10.3 [ 75 ] | 1 أكتوبر 2013 | — |
| 2.10.4 [ 76 ] | 18 مارس 2014 | — |
| 2.10.5 [ 77 ] | 5 مارس 2015 | — |
| 2.11.0 [ 78 ] | 21 أبريل 2014 |
|
| 2.11.1 [ 79 ] | 20 مايو 2014 | — |
| 2.11.2 [ 80 ] | 22 يوليو 2014 | — |
| 2.11.4 [ 81 ] | 31 أكتوبر 2014 | — |
| 2.11.5 [ 82 ] | 8 يناير 2015 | — |
| 2.11.6 [ 83 ] | 5 مارس 2015 | — |
| 2.11.7 [ 84 ] | 23 يونيو 2015 | — |
| 2.11.8 [ 85 ] | 8 مارس 2016 | — |
| 2.11.11 [ 86 ] | 18 أبريل 2017 | — |
| 2.11.12 [ 87 ] | 13 نوفمبر 2017 | — |
| 2.12.0 [ 88 ] | 3 نوفمبر 2016 |
|
| 2.12.1 [ 89 ] | 5 ديسمبر 2016 | — |
| 2.12.2 [ 86 ] | 18 أبريل 2017 | — |
| 2.12.3 [ 90 ] | 26 يوليو 2017 | — |
| 2.12.4 [ 91 ] | 17 أكتوبر 2017 | — |
| 2.12.5 [ 92 ] | 15 مارس 2018 | — |
| 2.12.6 [ 93 ] | 27 أبريل 2018 | — |
| 2.12.7 [ 94 ] | 27 سبتمبر 2018 | — |
| 2.12.8 [ 95 ] | 4 ديسمبر 2018 |
|
| 2.12.9 [ 96 ] | 5 أغسطس 2019 | — |
| 2.12.10 [ 97 ] | 10 سبتمبر 2019 | — |
| 2.12.11 [ 98 ] | 16 مارس 2020 | — |
| 2.12.12 [ 99 ] | 13 يوليو 2020 | — |
| 2.12.13 [ 100 ] | 12 يناير 2021 | — |
| 2.12.14 [ 101 ] | 28 مايو 2021 | — |
| 2.12.15 [ 102 ] | 14 سبتمبر 2021 | — |
| 2.12.16 [ 103 ] | 10 يونيو 2022 | — |
| 2.12.17 [ 104 ] | 16 سبتمبر 2022 | — |
| 2.12.18 [ 105 ] | 7 يونيو 2023 | — |
| 2.12.19 [ 106 ] | 25 فبراير 2024 | — |
| 2.13.0 [ 107 ] | 11 يونيو 2019 |
|
| 2.13.1 [ 108 ] | 18 سبتمبر 2019 | — |
| 2.13.2 [ 109 ] | 22 أبريل 2020 | — |
| 2.13.3 [ 110 ] | 25 يونيو 2020 | — |
| 2.13.4 [ 111 ] | 19 نوفمبر 2020 | — |
| 2.13.5 [ 112 ] | 22 فبراير 2021 | — |
| 2.13.6 [ 113 ] | 17 مايو 2021 | — |
| 2.13.7 [ 114 ] | 1 نوفمبر 2021 | — |
| 2.13.8 [ 115 ] | 12 يناير 2022 | — |
| 2.13.9 [ 116 ] | 21 سبتمبر 2022 | — |
| 2.13.10 [ 117 ] | 13 أكتوبر 2022 | — |
| 2.13.11 [ 118 ] | 7 يونيو 2023 | — |
| 2.13.12 [ 119 ] | 11 سبتمبر 2023 | — |
| 2.13.13 [ 120 ] | 26 فبراير 2024 | — |
| 2.13.14 [ 121 ] | 1 مايو 2024 | — |
| 2.13.15 [ 122 ] | 25 سبتمبر 2024 | — |
| 3.0.0 [ 123 ] | 13 مايو 2021 | — |
| 3.0.1 [ 124 ] | 31 يوليو 2021 | — |
| 3.0.2 [ 125 ] | 7 سبتمبر 2021 | — |
| 3.1.0 [ 126 ] | 21 أكتوبر 2021 | — |
| 3.1.1 [ 127 ] | 1 فبراير 2022 | — |
| 3.1.2 [ 128 ] | 12 أبريل 2022 | — |
| 3.1.3 [ 129 ] | 21 يونيو 2022 | — |
| 3.2.0 [ 130 ] | 5 سبتمبر 2022 | — |
| 3.2.1 [ 131 ] | 7 نوفمبر 2022 | — |
| 3.2.2 [ 132 ] | 30 يناير 2023 | — |
| 3.3.0 [ 133 ] | 30 مايو 2023 | — |
| 3.3.1 [ 134 ] | 7 سبتمبر 2023 | — |
| 3.3.2 [ 135 ] | 29 فبراير 2024 | — |
| 3.3.3 [ 136 ] | 29 فبراير 2024 | — |
| 3.3.8 [ 137 ] | 10 يونيو 2026 | — |
| 3.4.0 [ 136 ] | 29 فبراير 2024 | — |
| 3.4.1 [ 138 ] | 29 مارس 2024 | — |
| 3.4.2 [ 139 ] | 16 مايو 2024 | — |
| 3.4.3 [ 140 ] | 23 أغسطس 2024 | — |
| 3.5.0 [ 141 ] | 22 أغسطس 2024 | — |
| 3.5.1 [ 142 ] | 20 سبتمبر 2024 | — |
| 3.5.2 [ 143 ] | 22 أكتوبر 2024 | — |
| 3.6.2 [ 144 ] | 10 ديسمبر 2024 | — |
| 3.6.3 [ 145 ] | 20 يناير 2025 |
|
| 3.6.4 [ 146 ] | 7 مارس 2025 | — |
| 3.7.0 [ 147 ] | 7 مايو 2025 | — |
| 3.7.1 [ 148 ] | 4 يونيو 2025 | — |
| 3.7.2 [ 149 ] | 1 أغسطس 2025 | — |
| 3.7.3 [ 150 ] | 9 سبتمبر 2025 | — |
| 3.7.4 [ 151 ] | 11 نوفمبر 2025 | — |
| 3.8.0 [ 152 ] | 16 يناير 2026 | — |
| 3.8.1 [ 152 ] | 22 يناير 2026 | — |
| 3.8.2 [ 153 ] | 24 فبراير 2026 | — |
| 3.8.3 [ 154 ] | 31 مارس 2026 | — |
| 3.8.4 [ 155 ] | 5 يونيو 2026 | — |
مقارنة مع لغات JVM الأخرى
كثيراً ما تتم مقارنة لغة سكالا مع لغتي جروفي وكلوجر ، وهما لغتان برمجيتان أخريان تستخدمان أيضاً آلة جافا الافتراضية. توجد اختلافات جوهرية بين هذه اللغات في نظام الأنواع، وفي مدى دعم كل لغة للبرمجة الكائنية والوظيفية، وفي تشابه تركيبها النحوي مع تركيب لغة جافا.
لغة سكالا ذات كتابة ثابتة ، بينما لغتا جروفي وكلوجر ذات كتابة ديناميكية . هذا يجعل نظام الكتابة أكثر تعقيدًا وصعوبة في الفهم، ولكنه يسمح باكتشاف جميع أخطاء الكتابة تقريبًا [ 38 ] أثناء الترجمة، مما قد يؤدي إلى تنفيذ أسرع بكثير. في المقابل، تتطلب الكتابة الديناميكية المزيد من الاختبارات لضمان صحة البرنامج، وبالتالي فهي أبطأ عمومًا، وذلك لإتاحة مرونة وبساطة أكبر في البرمجة. فيما يتعلق بفروقات السرعة، تسمح الإصدارات الحالية من جروفي وكلوجر بإضافة تعليقات توضيحية اختيارية للأنواع لمساعدة البرامج على تجنب عبء الكتابة الديناميكية في الحالات التي تكون فيها الأنواع ثابتة عمليًا. يتم تقليل هذا العبء بشكل أكبر عند استخدام الإصدارات الحديثة من JVM، والتي تم تحسينها بتعليمات استدعاء ديناميكية للطرق المعرفة باستخدام وسائط ذات كتابة ديناميكية. هذه التحسينات تقلل من فجوة السرعة بين الكتابة الثابتة والديناميكية، على الرغم من أن اللغة ذات الكتابة الثابتة، مثل سكالا، لا تزال الخيار المفضل عندما تكون كفاءة التنفيذ بالغة الأهمية.
فيما يتعلق بنماذج البرمجة، ترث لغة سكالا نموذج البرمجة الكائنية من جافا وتوسعه بطرق متنوعة. أما جروفي، فرغم أنها كائنية التوجه أيضاً، إلا أنها تركز بشكل أكبر على تقليل الإسهاب. في كلوجر، يتم التقليل من أهمية البرمجة الكائنية، حيث تُعد البرمجة الوظيفية نقطة القوة الرئيسية للغة. كما تتمتع سكالا بالعديد من إمكانيات البرمجة الوظيفية، بما في ذلك ميزات موجودة في لغات وظيفية متقدمة مثل هاسكل، وتسعى إلى الحياد بين النموذجين، مما يتيح للمطور الاختيار بينهما، أو في أغلب الأحيان، مزيجاً منهما.
فيما يتعلق بتشابه بناء الجملة مع جافا، فإن سكالا ترث الكثير من بناء جملة جافا، كما هو الحال مع جروفي. أما كلوجر، من ناحية أخرى، فتتبع بناء جملة ليسب ، وهو مختلف في كل من المظهر والفلسفة.
التبني
تصنيفات اللغات
في عام 2013، عندما كانت لغة سكالا في الإصدار 2.10، أوصى تقرير "رادار التكنولوجيا" الصادر عن شركة ثوت ووركس ، وهو تقرير نصف سنوي يعتمد على آراء مجموعة من كبار التقنيين، [ 156 ] باعتماد لغة سكالا ضمن فئة اللغات والأطر البرمجية. [ 157 ]
في يوليو 2014، تم تحديد هذا التقييم بشكل أكثر دقة، ويشير الآن إلى "سكالا، الأجزاء الجيدة"، والتي توصف بأنها "لاستخدام سكالا بنجاح، تحتاج إلى البحث في اللغة وأن يكون لديك رأي قوي للغاية بشأن الأجزاء المناسبة لك، مما يؤدي إلى إنشاء تعريفك الخاص لسكالا، الأجزاء الجيدة". [ 158 ]
في استطلاع حالة جافا لعام 2018 [ 159 ] ، الذي جمع بيانات من 5160 مطورًا حول مواضيع مختلفة متعلقة بجافا، احتلت لغة سكالا المرتبة الثالثة من حيث استخدام اللغات البديلة على منصة جافا الافتراضية (JVM) . وبالمقارنة مع استطلاع العام السابق، انخفض استخدام سكالا بين لغات JVM البديلة من 28.4% إلى 21.5%، متجاوزةً إياها لغة كوتلن التي ارتفعت من 11.4% في 2017 إلى 28.8% في 2018. أما مؤشر شعبية لغات البرمجة [ 160 ] ، الذي يرصد عمليات البحث عن دروس تعليمية للغات، فقد صنف سكالا في المرتبة 15 في أبريل 2018 مع انخفاض طفيف، وفي المرتبة 17 في يناير 2021. وهذا يجعل سكالا ثالث أكثر لغات JVM شيوعًا بعد جافا وكوتلن، التي احتلت المرتبة 12.
صنّف تصنيف RedMonk للغات البرمجة ، الذي يعتمد على عدد مشاريع GitHub والأسئلة المطروحة على Stack Overflow ، لغة Scala في المرتبة 14 في يناير 2021. [ 161 ] هنا، وُضعت Scala ضمن مجموعة من اللغات من المستوى الثاني - متقدمة على Go و PowerShell و Haskell، ومتأخرة عن Swift و Objective-C و TypeScript و R.
يستخدم مؤشر TIOBE [ 162 ] لشعبية لغات البرمجة تصنيفات محركات البحث على الإنترنت وعدد المنشورات المماثلة لتحديد شعبية اللغة. في سبتمبر 2021، احتلت لغة سكالا المرتبة 31. في هذا التصنيف، تفوقت سكالا على هاسكل (المرتبة 38) وإرلانج ، لكنها جاءت خلف جو (المرتبة 14) وسويفت (المرتبة 15) وبيرل (المرتبة 19).
اعتبارًا من عام 2022تُصنّف لغات البرمجة المبنية على JVM، مثل Clojure وGroovy وScala، ضمن اللغات ذات التصنيف العالي، ولكنها لا تزال أقل شيوعًا بكثير من لغة Java الأصلية ، التي عادةً ما تُصنّف ضمن المراكز الثلاثة الأولى. [ 161 ] [ 162 ]
شركات
- في أبريل 2009، أعلنت تويتر أنها قامت بتحويل أجزاء كبيرة من نظامها الخلفي من لغة روبي إلى لغة سكالا، وأنها تعتزم تحويل الباقي. [ 163 ]
- تستخدم شركة تسلا (Tesla, Inc.) إطار عمل Akka مع لغة Scala في الواجهة الخلفية لمحطة الطاقة الافتراضية الخاصة بها. وبذلك، يُستخدم نموذج الممثل (Actor model) لتمثيل وتشغيل الأجهزة التي تُشكل مع المكونات الأخرى نسخة من محطة الطاقة الافتراضية، بينما تُستخدم التدفقات التفاعلية (Reactive Streams) لجمع البيانات ومعالجتها. [ 164 ]
- تم تنفيذ Apache Kafka بلغة Scala فيما يتعلق بمعظم أجزائه الأساسية والهامة الأخرى. ويتم صيانته وتطويره من خلال مشروع مفتوح المصدر ومن قبل شركة Confluent. [ 165 ]
- يستخدم Gilt لغة Scala وإطار عمل Play . [ 166 ]
- يستخدم Foursquare لغة Scala و Lift . [ 167 ]
- تستخدم منصة كورسيرا لغة سكالا وإطار عمل بلاي . [ 168 ]
- تستخدم شركة آبل لغة سكالا في بعض فرقها، إلى جانب لغة جافا وإطار عمل بلاي. [ 169 ] [ 170 ]
- أعلن موقع صحيفة الغارديان الإلكتروني ذو الزيارات العالية guardian.co.uk [ 171 ] في أبريل 2011 أنه سيتحول من لغة جافا إلى لغة سكالا. [ 172 ] [ 173 ]
- كشفت صحيفة نيويورك تايمز في عام 2014 أن نظام إدارة المحتوى الداخلي الخاص بها، بلاكبيرد، مبني باستخدام Scala و Akka و Play. [ 174 ]
- بدأت صحيفة هافينغتون بوست في استخدام لغة سكالا كجزء من نظام توصيل المحتوى الخاص بها أثينا في عام 2013. [ 175 ]
- وافق بنك يو بي إس السويسري على استخدام لغة سكالا في الإنتاج العام. [ 176 ]
- يستخدم LinkedIn إطار عمل Scalatra المصغر لتشغيل واجهة برمجة تطبيقات Signal الخاصة به. [ 177 ]
- يستخدم Meetup مجموعة أدوات Unfiltered لواجهات برمجة التطبيقات في الوقت الفعلي. [ 178 ]
- يستخدم Remember the Milk مجموعة أدوات Unfiltered وScala وAkka لواجهة برمجة التطبيقات العامة والتحديثات في الوقت الفعلي. [ 179 ]
- تسعى شركة فيريزون إلى إنشاء "إطار عمل من الجيل التالي" باستخدام لغة سكالا. [ 180 ]
- تقوم شركة Airbnb بتطوير برنامج مفتوح المصدر للتعلم الآلي يُدعى "Aerosolve"، مكتوب بلغة Java و Scala. [ 181 ]
- قامت شركة زالاندو بتحويل بنيتها التكنولوجية من جافا إلى سكالا وبلاي. [ 182 ]
- يستخدم ساوند كلاود لغة سكالا في بنيته الخلفية، ويوظف تقنيات مثل فيناغل (الخدمات المصغرة)، [ 183 ] وسكالدينغ وسبارك (معالجة البيانات). [ 184 ]
- تستخدم Databricks لغة Scala لمنصة Apache Spark للبيانات الضخمة.
- تستخدم مورغان ستانلي لغة سكالا على نطاق واسع في مشاريعها المتعلقة بالتمويل والأصول. [ 185 ]
- توجد فرق داخل جوجل وألفابت تستخدم لغة سكالا، ويرجع ذلك في الغالب إلى عمليات الاستحواذ مثل فايربيس [ 186 ] ونيست. [ 187 ]
- تستخدم شركة وول مارت كندا لغة سكالا لمنصتها الخلفية. [ 188 ]
- يستخدم تطبيق Duolingo لغة Scala في وحدة البرمجة الخلفية الخاصة به والتي تقوم بإنشاء الدروس. [ 189 ]
- تستخدم هيئة الإيرادات والجمارك البريطانية لغة سكالا في العديد من تطبيقات الضرائب الحكومية في المملكة المتحدة. [ 190 ]
- تستخدم شركة M1 Finance لغة Scala لمنصتها الخلفية. [ 191 ]
- يستخدم موقع Lichess لغة Scala لتطبيقاته الأساسية مفتوحة المصدر. [ 192 ]
نقد
في نوفمبر 2011، تخلّت يامر عن لغة سكالا لأسبابٍ منها صعوبة تعلّمها لأعضاء الفريق الجدد، وعدم توافق إصدارات مُصرّف سكالا المختلفة. [ 193 ] وفي مارس 2015، صرّح نائب الرئيس السابق لمجموعة هندسة المنصات في تويتر، رافي كريكوريان ، بأنه لم يكن ليختار سكالا في عام 2011 بسبب صعوبة تعلّمها . [ 194 ] وفي الشهر نفسه، أعلن كيفن سكوت، نائب الرئيس الأول في لينكدإن، قرارهم "بتقليص اعتمادهم على سكالا". [ 195 ]
انظر أيضاً
- sbt ، أداة بناء شائعة الاستخدام لمشاريع Scala
- تم تصميم إطار عمل Spark للتعامل مع البيانات الضخمة ومعالجتها، وهو يدعم لغة Scala فقط.
- Neo4j هو إطار عمل جافا سبرينغ مدعوم بلغة سكالا، ويحتوي على وظائف خاصة بالمجال، وقدرات تحليلية، وخوارزميات رسوم بيانية، وغير ذلك الكثير.
- Play!، إطار عمل مفتوح المصدر لتطبيقات الويب يدعم لغة Scala
- أكا ، مجموعة أدوات مفتوحة المصدر لبناء تطبيقات متزامنة وموزعة
- Chisel ، وهي لغة مفتوحة المصدر مبنية على Scala وتستخدم في تصميم وتوليد الأجهزة. [ 196 ]
مراجع
- ↑ "الإصدار 3.8.4" . 5 يونيو 2026. تم الاطلاع عليه في 6 يونيو 2026 .
- ↑ "ملف الإشعار" . جيت هاب . 24-01-2019 . تم الاسترجاع في 04-12-2019 .
- ↑ "وحدات ماكرو سكالا" .
- ↑ فوجوس، مايكل (6 أغسطس 2010). "MartinOdersky take(5) toList" . أرسل المزيد من المسعفين . تم الاسترجاع في 9 فبراير 2012 .
- 1 2 3 4 أوديرسكي، مارتن (11 يناير 2006). "تجربة سكالا: هل يمكننا توفير دعم لغوي أفضل لأنظمة المكونات؟" (ملف PDF) . تم الاطلاع عليه بتاريخ 22 يونيو 2016 .
- 1 2 3 4 أودرسكي، مارتن؛ وآخرون . (2006). “نظرة عامة على لغة برمجة سكالا” (PDF) ( الطبعة الثانية). مدرسة البوليتكنيك الفيدرالية في لوزان (EPFL). أرشفة (PDF) من النسخة الأصلية بتاريخ 2020-07-09.
- ↑ أوديرسكي، مارتن (2008). البرمجة بلغة سكالا . ماونتن فيو، كاليفورنيا: أرتيما. ص 3. ISBN 9780981531601تم الاطلاع عليه بتاريخ 12 يونيو 2014 .
- ↑ وامبلر، دين؛ باين، أليكس (15 سبتمبر 2009). برمجة سكالا: قابلية التوسع = البرمجة الوظيفية + الكائنات . دار نشر أورايلي ميديا، ص 7. ISBN 978-1-4493-7926-1تم الاطلاع عليه بتاريخ 13 مايو 2024. في الواقع ،
ينطق مبتكرو سكالا اسمها "سكا-لا" ، مثل الكلمة الإيطالية التي تعني "الدرج". ويتم نطق حرفي "a" بنفس الطريقة.
- ↑ بوتفين، باسكال؛ بونجا، ماريو (24 سبتمبر 2015). SDL 2013: هندسة الموثوقية القائمة على النماذج . سلسلة محاضرات في علوم الحاسوب. المجلد 7916. arXiv : 1509.07326 . doi : 10.1007/978-3-642-38911-5 . ISBN 978-3-642-38910-8. S2CID 1214469 .
- ↑ "الأسئلة الشائعة: التوافق بين لغات جافا" . Scala-lang.org . تم الاطلاع عليه بتاريخ 2015-02-06 .
- ↑ مارتن أوديرسكي (17 يونيو 2020). مارتن أوديرسكي: تحديث سكالا 3 (فيديو). يوتيوب. يبدأ الحدث من الدقيقة 36:35 إلى الدقيقة 45:08. مؤرشف من الأصل بتاريخ 21 ديسمبر 2021. تم الاطلاع عليه بتاريخ 24 أبريل 2021 .
- ↑ "Effect expt" . scala . تم الاسترجاع في 31 يوليو 2022 .
- ↑ لوفيردو، كريستوس (2010). خطوات في سكالا: مقدمة في البرمجة الوظيفية الكائنية . مطبعة جامعة كامبريدج . ص. 13. ISBN 9781139490948تم الاطلاع عليه بتاريخ 31 يوليو 2014 .
- 1 2 3 4 أوديرسكي، مارتن (9 يونيو 2006). "تاريخ موجز لسكالا" . Artima.com .
- 1 2 3 4 أوديرسكي، م.؛ رومبف، ت. (2014). "توحيد البرمجة الوظيفية والبرمجة الكائنية باستخدام سكالا" . اتصالات رابطة مكائن الحوسبة . 57 (4): 76. doi : 10.1145/2591013 .
- ↑ مارتن أوديرسكي، "مواصفات لغة سكالا الإصدار 2.7"
- ↑ "فريق سكالا يفوز بمنحة المجلس الأوروبي للبحوث" . تم الاطلاع عليه بتاريخ 4 يوليو 2015 .
- ↑ "الدعم التجاري لـ Scala" . 12-05-2011 . تم الاطلاع عليه بتاريخ 18-08-2011 .
- ↑ "لماذا استثمرنا في Typesafe: التطبيقات الحديثة تتطلب أدوات حديثة" . 12-05-2011 . تم الاطلاع عليه بتاريخ 08-05-2018 .
- ↑ "لغة سكالا مفتوحة المصدر تحظى بدعم تجاري" . 12 مايو 2011. تم الاطلاع عليه بتاريخ 9 أكتوبر 2011 .
- ↑ «رائد الحوسبة السحابية مارتن أوديرسكي يكشف النقاب عن شركته الجديدة تايب سيف» . ١٢ مايو ٢٠١١. تم الاطلاع عليه بتاريخ ٢٤ أغسطس ٢٠١١ .
- ↑ "Scala on Android" . مؤرشف من الأصل في 20 يونيو 2016. تم الاطلاع عليه في 8 يونيو 2016 .
- ↑ "Scala 2.12.8 متوفر الآن!" . 2018-12-04 . تم الاطلاع عليه بتاريخ 2018-12-09 .
- ↑ "لغة البرمجة Scala JS لم تعد تجريبية | لغة برمجة Scala" . Scala-lang.org. 5 فبراير 2015. تم الاطلاع عليه بتاريخ 28 أكتوبر 2015 .
- ↑ "الإصدارات · scala-js/Scala-js" . GitHub .
- ↑ كريل، بول (15 مارس 2017). "نسخة مصغرة من لغة سكالا تقطع صلتها بآلة جافا الافتراضية" . إنفوورلد . تم الاطلاع عليه بتاريخ 21 مارس 2017 .
- ↑ كريل، بول (11 مايو 2016). "لغة سكالا تقترب من العتاد الأساسي" . إنفوورلد .
- ↑ تم حذف الواجهة الخلفية لـ .NET. بواسطة paulp · طلب سحب رقم 1718 · scala/scala · GitHub . Github.com (2012-12-05). تم الاطلاع عليه بتاريخ 2013-11-02.
- ↑ "البدء باستخدام لغة سكالا" . Scala-lang.org . 15 يوليو 2008. تم الاطلاع عليه بتاريخ 31 يوليو 2014 .
- ↑ "الصفحة الرئيسية" . Blog.lostlake.org. مؤرشف من الأصل بتاريخ 31 أغسطس 2010. تم الاطلاع عليه بتاريخ 25 يونيو 2013 .
- ↑ لا يمكن إعادة تنفيذهياكل التحكم المدمجة في لغة سكالا، مثل
if`or` . يوجد مشروع بحثي بعنوان `Scala-Virtualized` يهدف إلى إزالة هذه القيود: أدريان مورز، وتيارك رومبف، وفيليب هالر، ومارتن أوديرسكي. Scala-Virtualized . وقائع ورشة عمل ACM SIGPLAN 2012 حول التقييم الجزئي ومعالجة البرامج ، الصفحات 117-120. يوليو 2012.while - 1 2 "زيّن مكتبتي" . Artima.com. 2006-10-09 . تم الاطلاع عليه بتاريخ 2013-06-25 .
- ↑ "التعبيرات | سكالا 2.13" . scala-lang.org . تم الاطلاع عليه بتاريخ 24-05-2021 .
- ↑ "المجموعات القابلة للتغيير والمجموعات غير القابلة للتغيير - وثائق سكالا" . تم الاطلاع عليه بتاريخ 30 أبريل 2020 .
- ↑ "المجموعات - فئات المجموعات الثابتة الملموسة - توثيق سكالا" . تم الاطلاع عليه في 4 يوليو 2015 .
- ↑ دوغيرتي، ريتش. "مدونة ريتش دوغيرتي" . تم الاطلاع عليه بتاريخ 4 يوليو 2015 .
- ↑ "TailCalls - Scala Standard Library API (Scaladoc) 2.10.2 - scala.util.control.TailCalls" . Scala-lang.org . تم الاطلاع عليه بتاريخ 25-06-2013 .
- 1 2 "أنظمة أنواع Java و Scala غير سليمة" (PDF) .
- ↑ جياروسو، باولو ج. (2013). "حوّل استعلامات مجموعتك إلى صيغة رقمية لتحقيق نمطية وسرعة أكبر!". وقائع المؤتمر الدولي السنوي الثاني عشر حول تطوير البرمجيات الموجهة نحو الجوانب . ACM. arXiv : 1210.6284 . Bibcode : 2012arXiv1210.6284G .
يُعرف أيضًا باسم نمط تحسين المكتبة.
- ↑ جيلبرت، كلينت (15 نوفمبر 2011). "ما هي الأولوية القصوى لنجاح لغة سكالا في عالم الشركات (هل ينبغي طرح هذا السؤال في نقاش سكالا؟) ؟" . Scala-lang.org . تاريخ الاسترجاع: 8 مايو 2019 .
- ↑ "هل ينبغي لنا "إثراء" أو "تحسين" مكتبات سكالا؟" . stackexchange.com . 17 يونيو 2013. تم الاطلاع عليه في 15 أبريل 2016 .
- تم تقديم الفئات الضمنية في سكالا 2.10 لجعل توسيع الدوال أكثر اختصارًا. وهذا يُعادل إضافة دالة
implicit def IntPredicate(i: Int) = new IntPredicate(i). يمكن أيضًا تعريف الفئة علىimplicit class IntPredicates(val i: Int) extends AnyVal { ... }، مما يُنتج ما يُسمى بفئة القيمة ، والتي تم تقديمها أيضًا في سكالا 2.10. سيقوم المُصرّف حينها بإلغاء عمليات إنشاء الكائنات الفعلية وإنشاء دوال ثابتة بدلاً منها، مما يسمح لدوال التوسيع بأن تكون ذات تأثير ضئيل جدًا على الأداء. - ↑ ما هي عكا؟ عكا الوثائق على الانترنت
- ↑ سوفرين، برنارد (2008). "كائنات سكالا المتصلة". في: ويلش، بي إتش؛ ستيبني، إس؛ بولاك، إف إيه سي؛ بارنز، إف آر إم؛ ماك إيوان، إيه إيه؛ ستايلز، جي إس؛ برونينك، جيه إف؛ سامبسون، إيه تي (محررون). هندسة العمليات المتصلة 2008: WoTUG-31 (ملف PDF) . دار نشر IOS. رقم ISBN 978-1586039073.
- ↑ يان، كاي. "جولة سكالا" . تم الاطلاع عليه بتاريخ 4 يوليو 2015 .
- ↑ "المجموعات المتوازية - نظرة عامة - وثائق سكالا" . Docs.scala-lang.org . تم الاطلاع عليه بتاريخ 25-06-2013 .
- ↑ يان، كاي. "جولة سكالا" . تم الاطلاع عليه بتاريخ 4 يوليو 2015 .
- ↑ تعلم البرمجة المتزامنة في لغة سكالا ، ألكسندر بروكوبيك، دار نشر باكت
- ↑ كوبس، ميخا (13 يناير 2013). "مقدمة موجزة إلى ScalaTest" . hascode.com . تم الاطلاع عليه بتاريخ 7 نوفمبر 2014 .
- ↑ نيلسون، ريكارد (17-11-2008). "ScalaCheck 1.5" . Scala-lang.org . تم الاطلاع عليه بتاريخ 7-11-2014 .
- ↑ "بناء تطبيقات ويب باستخدام لغة سكالا وإطار عمل بلاي" . workwithplay.com . 22-05-2013 . تم الاطلاع عليه بتاريخ 07-11-2014 .
- ↑ بوتشر، بول (4 يونيو 2012). "إصدار تجريبي من ScalaMock 3.0" . paulbutcher.com . مؤرشف من الأصل بتاريخ 8 نوفمبر 2014. تم الاطلاع عليه بتاريخ 7 نوفمبر 2014 .
- 1 2 3 4 5 6 7 "تاريخ تغييرات لغة سكالا" . Scala-lang.org . مؤرشف من الأصل بتاريخ 2007-10-09.
- ↑ "تم حذف: XML Literals" . dotty.epfl.ch . تم الاطلاع عليه بتاريخ 2021-03-05 .
- ↑ "التغييرات في الإصدار 2.0 (12 مارس 2006)" . Scala-lang.org . 12 مارس 2006. تم الاطلاع عليه بتاريخ 7 نوفمبر 2014 .
- ↑ "التغييرات في الإصدار 2.1.8 (23 أغسطس 2006)" . Scala-lang.org . 2006-08-23 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "التغييرات في الإصدار 2.3.0 (23 نوفمبر 2006)" . Scala-lang.org . 2006-11-23 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "التغييرات في الإصدار 2.4.0 (9 مارس 2007)" . Scala-lang.org . 9 مارس 2007. تاريخ الاسترجاع: 7 نوفمبر 2014 .
- ↑ "التغييرات في الإصدار 2.5 (2 مايو 2007)" . Scala-lang.org . 2007-05-02 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "التغييرات في الإصدار 2.6 (27 يوليو 2007)" . Scala-lang.org . 27 يونيو 2007. تاريخ الاسترجاع: 7 نوفمبر 2014 .
- ↑ "التغييرات في الإصدار 2.7.0 (7 فبراير 2008)" . Scala-lang.org . 2008-02-07 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "التغييرات في الإصدار 2.8.0 (14 يوليو 2010)" . Scala-lang.org . 10 يوليو 2010. تاريخ الاسترجاع: 7 نوفمبر 2014 .
- ↑ "التغييرات في الإصدار 2.9.0 (12 مايو 2011)" . Scala-lang.org . 12 مايو 2011. تاريخ الاسترجاع: 7 نوفمبر 2014 .
- ↑ "التغييرات في الإصدار 2.10.0" . Scala-lang.org . 2013-01-04 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ هارا، مارك. "فئات القيمة والسمات العالمية" . Scala-lang.org . تم الاسترجاع في 7 نوفمبر 2014 .
- ↑ سويرث، جوش. "SIP-13 - الفئات الضمنية" . Scala-lang.org . مؤرشف من الأصل بتاريخ 2014-11-08 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ سويرث، جوش. "استيفاء السلاسل النصية" . Scala-lang.org . تم الاسترجاع في 7 نوفمبر 2014 .
- ↑ هالر، فيليب؛ بروكوبيك، ألكسندر. "المستقبل والوعود" . Scala-lang.org . تم الاسترجاع في 7 نوفمبر 2014 .
- ↑ "SIP-17 - Type Dynamic" . Scala-lang.org . مؤرشف من الأصل بتاريخ 2014-11-08 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "SIP-18 - تقسيم ميزات اللغة إلى وحدات" . Scala-lang.org . مؤرشف من الأصل بتاريخ 2014-11-08 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ بروكوبيك، ألكسندر؛ ميلر، هيذر. "المجموعات المتوازية" . Scala-lang.org . تم الاسترجاع في 7 نوفمبر 2014 .
- ↑ ميلر، هيذر؛ بورماكو، يوجين. "نظرة عامة على الانعكاس" . Scala-lang.org . تم الاسترجاع في 7 نوفمبر 2014 .
- ↑ بورماكو، يوجين. "وحدات الماكرو التعريفية" . Scala-lang.org . تم الاسترجاع في 7 نوفمبر 2014 .
- ↑ "Scala 2.10.2 متوفر الآن!" . Scala-lang.org . 2013-06-06. مؤرشف من الأصل في 2014-11-08 . تم الاطلاع عليه في 2014-11-07 .
- ↑ "Scala 2.10.3 متوفر الآن!" . Scala-lang.org . 2013-10-01. مؤرشف من الأصل في 2014-11-08 . تم الاطلاع عليه في 2014-11-07 .
- ↑ "Scala 2.10.4 متوفر الآن!" . Scala-lang.org . 2014-03-18 . تم الاطلاع عليه بتاريخ 2015-01-07 .
- ↑ "Scala 2.10.5 متوفر الآن!" . Scala-lang.org . 2015-03-04 . تم الاطلاع عليه بتاريخ 2015-03-23 .
- ↑ "Scala 2.11.0 متوفر الآن!" . Scala-lang.org . 2014-04-21 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "Scala 2.11.1 متوفر الآن!" . Scala-lang.org . 2014-05-20 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "Scala 2.11.2 متوفر الآن!" . Scala-lang.org . 2014-07-22 . تم الاطلاع عليه بتاريخ 2014-11-07 .
- ↑ "Scala 2.11.4 متوفر الآن!" . Scala-lang.org . 30-10-2014 . تم الاطلاع عليه بتاريخ 07-11-2014 .
- ↑ "Scala 2.11.5 متوفر الآن!" . Scala-lang.org . 2015-01-08 . تم الاطلاع عليه بتاريخ 2015-01-22 .
- ↑ "Scala 2.11.6 متوفر الآن!" . Scala-lang.org . 2015-03-05 . تم الاطلاع عليه بتاريخ 2015-03-12 .
- ↑ "Scala 2.11.7 متوفر الآن!" . Scala-lang.org . 2015-06-23 . تم الاطلاع عليه بتاريخ 2015-07-03 .
- ↑ "Scala 2.11.8 متوفر الآن!" . Scala-lang.org . 2016-03-08 . تم الاطلاع عليه بتاريخ 2016-03-09 .
- ١ ٢ "ثلاثة إصدارات جديدة والمزيد من الميزات الرائعة على GitHub!" . Scala-lang.org . ١٨ أبريل ٢٠١٧. تم الاطلاع عليه بتاريخ ١٩ أبريل ٢٠١٧ .
- ↑ "تحديث أمني: 2.12.4، 2.11.12، 2.10.7 (CVE-2017-15288)" . Scala-lang.org . 13 نوفمبر 2017. تاريخ الاسترجاع: 4 مايو 2018 .
- ↑ "Scala 2.12.0 متوفر الآن!" . Scala-lang.org . 2016-11-03 . تم الاطلاع عليه بتاريخ 2017-01-08 .
- ↑ "Scala 2.12.1 متوفر الآن!" . Scala-lang.org . 2016-12-05 . تم الاطلاع عليه بتاريخ 2017-01-08 .
- ↑ "Scala 2.12.3 متوفر الآن!" . Scala-lang.org . 2017-07-26 . تم الاطلاع عليه بتاريخ 2017-08-16 .
- ↑ "Scala 2.12.4 متوفر الآن!" . Scala-lang.org . 2017-10-18 . تم الاطلاع عليه بتاريخ 2017-10-26 .
- ↑ "Scala 2.12.5 متوفر الآن!" . Scala-lang.org . 2018-03-15 . تم الاطلاع عليه بتاريخ 2018-03-20 .
- ↑ "Scala 2.12.6 متوفر الآن!" . Scala-lang.org . 2018-04-27 . تم الاطلاع عليه بتاريخ 2018-05-04 .
- ↑ "Scala 2.12.7 متوفر الآن!" . Scala-lang.org . 2018-09-27 . تم الاطلاع عليه بتاريخ 2018-10-09 .
- ↑ "Scala 2.12.8 متوفر الآن!" . Scala-lang.org . 2018-12-04 . تم الاطلاع عليه بتاريخ 2018-12-09 .
- ↑ "Scala 2.12.9 متوفر الآن!" . Scala-lang.org . 2019-08-05 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.12.10 متوفر الآن!" . Scala-lang.org . 2019-09-10 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.12.11 متوفر الآن!" . Scala-lang.org . 2020-03-16 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.12.12 متوفر الآن!" . Scala-lang.org . 2020-07-13 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.12.13 متوفر الآن!" . Scala-lang.org . 2021-01-12 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.12.14 متوفر الآن!" . Scala-lang.org . 2021-05-28 . تم الاطلاع عليه بتاريخ 2022-04-15 .
- ↑ "Scala 2.12.15 متوفر الآن!" . Scala-lang.org . 2021-09-14 . تم الاطلاع عليه بتاريخ 2022-06-19 .
- ↑ "Scala 2.12.16 متوفر الآن!" . Scala-lang.org . 2022-06-10 . تم الاطلاع عليه بتاريخ 2022-06-19 .
- ↑ "Scala 2.12.17 متوفر الآن!" . Scala-lang.org . 2022-06-10 . تم الاطلاع عليه بتاريخ 2022-09-16 .
- ↑ "Scala 2.12.18 متوفر الآن!" . Scala-lang.org . 2022-06-10 . تم الاطلاع عليه بتاريخ 2023-06-07 .
- ↑ "Scala 2.12.19 متوفر الآن!" . Scala-lang.org . 2024-02-25 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 2.13.0 متوفر الآن!" . Scala-lang.org . 2019-06-11 . تم الاطلاع عليه بتاريخ 2018-06-17 .
- ↑ "Scala 2.13.1 متوفر الآن!" . Scala-lang.org . 2019-09-18 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.13.2 متوفر الآن!" . Scala-lang.org . 2020-04-22 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.13.3 متوفر الآن!" . Scala-lang.org . 2020-06-25 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.13.4 متوفر الآن!" . Scala-lang.org . 2020-11-19 . تم الاطلاع عليه بتاريخ 2021-01-20 .
- ↑ "Scala 2.13.5 متوفر الآن!" . Scala-lang.org . 22-02-2021 . تم الاطلاع عليه بتاريخ 26-02-2021 .
- ↑ "Scala 2.13.6 متوفر الآن!" . Scala-lang.org . 2021-05-17 . تم الاطلاع عليه بتاريخ 2022-04-15 .
- ↑ "Scala 2.13.7 متوفر الآن!" . Scala-lang.org . 2021-11-01 . تم الاطلاع عليه بتاريخ 2022-04-15 .
- ↑ "Scala 2.13.8 متوفر الآن!" . Scala-lang.org . 2022-01-12 . تم الاطلاع عليه بتاريخ 2022-04-15 .
- ↑ "Scala 2.13.9 متوفر الآن!" . Scala-lang.org . 2022-09-21 . تم الاطلاع عليه بتاريخ 2023-08-28 .
- ↑ "Scala 2.13.10 متوفر الآن!" . Scala-lang.org . 2022-10-13 . تم الاطلاع عليه بتاريخ 2023-08-28 .
- ↑ "Scala 2.13.11 متوفر الآن!" . Scala-lang.org . 2023-06-07 . تم الاطلاع عليه بتاريخ 2023-08-28 .
- ↑ "Scala 2.13.12 متوفر الآن!" . Scala-lang.org . 2023-09-11 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 2.13.13 متوفر الآن!" . Scala-lang.org . 2024-02-26 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 2.13.14 متوفر الآن!" . Scala-lang.org . 2024-05-01 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 2.13.15 متوفر الآن!" . Scala-lang.org . 2024-09-25 . تم الاطلاع عليه بتاريخ 2024-12-05 .
- ↑ "Scala 3 هنا!" . Scala-lang.org . 2021-05-14 . تم الاطلاع عليه بتاريخ 2021-05-26 .
- ↑ "Scala 3.0.1 و 3.0.2-RC1 متوفران الآن!" . Scala-lang.org . 31 يوليو 2021. تاريخ الاطلاع: 12 أغسطس 2024 .
- ↑ "تم إصدار Scala 3.0.2!" . Scala-lang.org . 2021-09-07 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "تم إصدار Scala 3.1.0!" . Scala-lang.org . 2021-10-21 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 3.1.1 وأخبار التوافق مع الإصدارات اللاحقة" . Scala-lang.org . 2022-02-01 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "تم إصدار Scala 3.1.2!" . Scala-lang.org . 2022-04-12 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "تم إصدار Scala 3.1.3!" . Scala-lang.org . 2022-06-21 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "تم إصدار Scala 3.2.0!" . Scala-lang.org . 2022-09-05 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "تم إصدار Scala 3.2.1!" . Scala-lang.org . 2022-11-07 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 3.2.2 متوفر الآن!" . Scala-lang.org . 2023-01-30 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "تم إصدار Scala 3.3.0!" . Scala-lang.org . 2023-05-30 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 3.3.1 LTS متوفر الآن!" . Scala-lang.org . 2023-09-07 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 3.3.2" . github.com . 2024-02-29 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ١ ٢ "إصدار Scala 3.4.0 و 3.3.3 LTS!" . Scala-lang.org . ٢٠٢٤-٠٢-٢٩ . تم الاطلاع عليه بتاريخ ٢٠٢٤-٠٨-١٢ .
- ↑ "Scala 3.3.8 متوفر الآن!" . Scala-lang.org . 2026-06-10 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.4.1 متوفر الآن!" . Scala-lang.org . 2024-03-29 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "Scala 3.4.2 متوفر الآن!" . Scala-lang.org . 2024-05-16 . تم الاطلاع عليه بتاريخ 2024-08-12 .
- ↑ "جميع الإصدارات المتاحة" . www.scala-lang.org . تم الاطلاع عليه بتاريخ 20 أبريل 2026 .
- ↑ "تم إصدار Scala 3.5.0!" . Scala-lang.org . 2024-08-22 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.5.1 متوفر الآن!" . Scala-lang.org . 2024-09-20 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.5.2 متوفر الآن!" . Scala-lang.org . 2024-10-22 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.6.2 متوفر الآن!" . Scala-lang.org . 2024-12-10 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.6.3 متوفر الآن!" . Scala-lang.org . 2025-01-20 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.6.4 متوفر الآن!" . Scala-lang.org . 2025-03-07 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "تم إصدار Scala 3.7.0!" . Scala-lang.org . 2025-05-07 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.7.1 متوفر الآن!" . Scala-lang.org . 2025-06-04 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.7.2 متوفر الآن!" . Scala-lang.org . 2025-08-01 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.7.3 متوفر الآن!" . Scala-lang.org . 2025-09-09 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.7.4 متوفر الآن!" . Scala-lang.org . 2025-11-11 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ١ ٢ "تم إصدار Scala 3.8!" . Scala-lang.org . ٢٠٢٦-٠١-٢٢ . تم الاطلاع عليه بتاريخ ٢٠٢٦-٠٦-١٨ .
- ↑ "Scala 3.8.2 متوفر الآن!" . Scala-lang.org . 2026-02-24 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.8.3 متوفر الآن!" . Scala-lang.org . 2026-03-31 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "Scala 3.8.4 متوفر الآن!" . Scala-lang.org . 2026-06-05 . تم الاطلاع عليه بتاريخ 2026-06-18 .
- ↑ "أسئلة وأجوبة حول رادار التكنولوجيا من ThoughtWorks" .
- ↑ "ThoughtWorks Technology Radar MAY 2013" (PDF) .
- ↑ "سكالا، الأجزاء الجيدة" .
- ↑ "حالة جاوة في عام 2018" .
- ↑ "مؤشر شعبية لغات البرمجة" .
- 1 2 أوغرادي، ستيفن (1 مارس 2021). "تصنيفات ريدمونك للغات البرمجة: يناير 2021" . ريدمونك .
- 1 2 "مؤشر TIOBE لشهر مايو 2021" .
- ↑ غرين، كيت (1 أبريل 2009). "سر نمو تويتر: كيف تساعد لغة برمجة ويب جديدة الشركة على التعامل مع شعبيتها المتزايدة" . مجلة التكنولوجيا . معهد ماساتشوستس للتكنولوجيا . تاريخ الاسترجاع: 6 أبريل 2009 .
- ↑ بريك، كولين؛ لينك، بيرسي (23 مارس 2020). "محطة تسلا الافتراضية للطاقة (الهندسة المعمارية والتصميم)" . تم الاطلاع عليه بتاريخ 28 مارس 2023 .
- ↑ "شفرة مصدر Apache Kafka على GitHub" . مؤسسة برمجيات أباتشي . تم الاطلاع عليه بتاريخ 29 مارس 2023 .
- ↑ "إطار عمل Play، وAkka، وScala في Gilt Groupe" . Lightbend. 15 يوليو 2013. تم الاطلاع عليه بتاريخ 16 يوليو 2016 .
- ↑ "سكالا، ليفت، والمستقبل" . مؤرشف من الأصل في 13 يناير 2016. تم الاطلاع عليه في 4 يوليو 2015 .
- ↑ سايتا، برينان (17 فبراير 2014). "لماذا نحب لغة سكالا في كورسيرا" . هندسة كورسيرا . تم الاطلاع عليه بتاريخ 21 سبتمبر 2023 .
- ↑ "جارود نيتلز، مدير هندسة أبل، على تويتر" . جارود نيتلز . تاريخ الاسترجاع: 11 مارس 2016 .
- ↑ "30 وظيفة شاغرة لمطوري لغة سكالا في شركة آبل" . ألفين ألكسندر . تم الاطلاع عليه بتاريخ 11 مارس 2016 .
- ↑ ديفيد ريد وتانيا تيكسيرا (26 فبراير 2010). "هل الناس مستعدون للدفع مقابل الأخبار عبر الإنترنت؟" . بي بي سي . تم الاطلاع عليه بتاريخ 28 فبراير 2010 .
- ↑ "تحويل Guardian من Java إلى Scala" . Heise Online . 2011-04-05 . تم الاسترجاع في 2011-04-05 .
- ↑ "Guardian.co.uk الانتقال من جافا إلى سكالا" . InfoQ.com. 2011-04-04 . تم الاطلاع عليه بتاريخ 2011-04-05 .
- ↑ روي، سومان؛ سونداريسان، كريشنا (13 مايو 2014). "بناء بلاكبيرد: نظام توزيع مدعوم من بلاي، سكالا، وأكا" . صحيفة نيويورك تايمز . تم الاطلاع عليه بتاريخ 20 يوليو 2014 .
- ↑ بافلي، جون (11 أغسطس 2013). "نظرة خاطفة: هافينغتون بوست تُدخل التعاون الفوري إلى غرفة الأخبار" . هافينغتون بوست . تم الاطلاع عليه بتاريخ 20 يوليو 2014 .
- ↑ بينستوك، أندرو (14 يوليو 2011). "مقابلة مع مارتن أوديرسكي من سكالا" . مجلة دكتور دوبز . تاريخ الاسترجاع: 10 فبراير 2012 .
- ↑ سينودينوس، ديونيسيوس ج. (11-10-2010). "إشارة لينكدإن: دراسة حالة لسكالا، وجي روبي، وفولدمورت" . إنفو كيو .
- ↑ "اللقاءات الواقعية تستحق واجهات برمجة تطبيقات في الوقت الفعلي" .
- ↑ "تحديثات في الوقت الفعلي تصل إلى تطبيق Remember The Milk على الويب" .
- ↑ "ما هي سكالا؟" . 8 مارس 2023. مؤرشف من الأصل في 17 مارس 2023. تم الاطلاع عليه في 17 مارس 2023 .
- ↑ نوفيت، جوردان (4 يونيو 2015). "إير بي إن بي تعلن عن إيروسولف، حزمة برمجية مفتوحة المصدر للتعلم الآلي" . تم الاطلاع عليه بتاريخ 9 مارس 2016 .
- ↑ كوبس، ألكسندر (14 ديسمبر 2015). "زالاندو تك: من جافا إلى سكالا في أقل من ثلاثة أشهر" . تم الاطلاع عليه بتاريخ 9 مارس 2016 .
- ↑ كالكادو، فيل (13 يونيو 2014). "بناء المنتجات في ساوند كلاود - الجزء الثالث: الخدمات المصغرة في سكالا وفيناغل" . تم الاطلاع عليه بتاريخ 9 مارس 2016 .
- ↑ "دراسات حالة العملاء: ساوند كلاود" . شركة كونكرنت . 18-11-2014 . تم الاطلاع عليه بتاريخ 09-03-2016 .
- ↑ سكالا في مورغان ستانلي (فيديو). المهارات مهمة. 2015-12-03 . تم الاطلاع عليه بتاريخ 2016-03-11 .
- ↑ جريج سولتيس (2015-12-03). SF Scala، جريج سولتيس: خدمات عالية الأداء في Scala (فيديو). Skills Matter. مؤرشف من الأصل في 2021-12-21 . تم الاطلاع عليه في 2016-03-11 .
- ↑ لي ميغدول. "وظائف سكالا في نيست" . تم الاسترجاع في 11 مارس 2016 .
- ↑ نورون. "نورون تطلق منصة معاملات مُعاد تصميمها مع وول مارت كندا" . تم الاطلاع عليه بتاريخ 11 ديسمبر 2013 .
- ↑ هوري، أندريه ك. (31 يناير 2017). "إعادة كتابة محرك دولينجو بلغة سكالا" . تم الاسترجاع في 3 فبراير 2017 .
- ↑ "مستودع HMRC على GitHub" . GitHub .
- ↑ "تعرّف على شركة M1 Finance، الراعي الذهبي لمؤتمر ScalaCon" . ScalaCon . تم الاطلاع عليه بتاريخ 2023-09-02 .
- ↑ "مستودع Lichess على GitHub" . GitHub .
- ↑ هيل، كودا (29 نوفمبر 2011). "بقية القصة" . codahale.com . تم الاطلاع عليه في 7 نوفمبر 2013 .
- ↑ كريكوريان، رافي (17 مارس 2015). مؤتمر أورايلي لهندسة البرمجيات 2015 - مجموعة فيديوهات كاملة: إعادة تصميم البرمجيات أثناء التنفيذ - رافي كريكوريان - الجزء 3 (فيديو). أورايلي ميديا. يبدأ الحدث عند الدقيقة 4:57 . تم الاطلاع عليه بتاريخ 8 مارس 2016.
ما كنت سأفعله بشكل مختلف قبل أربع سنوات هو استخدام جافا بدلاً من سكالا في عملية إعادة الكتابة هذه. [...] سيستغرق الأمر شهرين حتى يصبح المهندس منتجًا تمامًا ويكتب كود سكالا.
- ↑ سكوت، كيفن (11 مارس 2015). "هل تتخلى لينكدإن عن سكالا؟" . quora.com . تم الاطلاع عليه بتاريخ 25 يناير 2016 .
- ↑ "Chisel: Constructing Hardware in a Scala Embedded Language" . UC Berkeley APSIRE . تم الاطلاع عليه بتاريخ 27 مايو 2020 .
للمزيد من القراءة
- أوديرسكي، مارتن؛ سبون، ليكس؛ فينرز، بيل (15 ديسمبر 2019). البرمجة بلغة سكالا: دليل شامل خطوة بخطوة ( الطبعة الرابعة). شركة أرتيما . ص 896. ISBN 978-0-9815316-1-8.
- هورستمان، كاي (15 ديسمبر 2016). سكالا للمتعجلين ( الطبعة الثانية). أديسون-ويسلي بروفيشنال . ص 384. ISBN 978-0-134-54056-6.
- وامبلر، دين؛ باين، أليكس (14 ديسمبر 2014). برمجة سكالا: قابلية التوسع = البرمجة الوظيفية + الكائنات ( الطبعة الثانية). أورايلي ميديا . ص 583. ISBN 978-1-491-94985-6.
- سويرث ، جوشوا د. (ربيع 2011). سكالا بتفصيل . منشورات مانينغ . ص 225. ISBN 978-1-935182-70-2.
- ميريديث، غريغوري (2011). أنماط التصميم الأحادية للويب (ملف PDF) (الطبعة الأولى ). ص 300.
- أوديرسكي، مارتن؛ سبون، ليكس؛ فينرز، بيل (10 ديسمبر 2008). البرمجة بلغة سكالا، كتاب إلكتروني ( الطبعة الأولى). شركة أرتيما.
- سكالا (لغة برمجة)
- لغات البرمجة
- لغات البرمجة المتزامنة
- برنامج مجاني مكتوب بلغة سكالا
- اللغات الوظيفية
- عائلة لغات البرمجة جافا
- لغات برمجة JVM
- لغات البرمجة الكائنية التوجه
- لغات برمجة مطابقة الأنماط
- لغات البرمجة التي تم إنشاؤها في عام 2003
- لغات البرمجة النصية
- برنامج يستخدم ترخيص أباتشي
- لغات البرمجة ذات الكتابة الثابتة
- برامج مجانية متعددة المنصات
- مترجمات مجانية ومفتوحة المصدر
- مترجمات من المصدر إلى المصدر
