Kotlin

من موسوعة حسوب
مراجعة 16:04، 11 مارس 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (نقل جدول المحتويات إلى صفحة Kotlin/Topics)
اذهب إلى التنقل اذهب إلى البحث

تُعدُّ لغة Kotlin لغة مبتكرةً حديثةً جمعت ما بين الميّزات الموجودة في لغات البرمجة الشهيرة (مثل لغة Java بشكل أساسيّ) وأضافت عليها ما يجعل منها لغةً أكثر قوةً وفاعليّةً، فهي لغة كائنيّة التوجه (OOP) تحرِص من خلال ميّزاتها على النواحي الأمانية في البرمجة مثل اعتمادها للنوع nullable ودوال lambdas والإضافات التي تتيحها على الأصناف دون إعادة بنائها كما أنها تدعم المجموعات (collections) والاستثناءات (exceptions)، وتُحسب لها نقطة قوّةٍ بأنها تتوافق مع بيئة JVM وبيئة Android (وهما البيئتان الأكثر انتشارًا في التطبيقات البرمجيّة)، كما يُتاح أمر كتابة الشيفرات فيها وتحويلها فيما بعد إلى بيئاتٍ برمجيّة أخرى (مثل JavaScript)، وتتوفّر لها العديد من الأدوات البرمجيّة سهلة الاستخدام والإضافات (Plugins) التي تدعمها بيئات العمل المختلفة.

بُنية لغة Kotlin

مشابهةٌ لبنية لغة البرمجة Java بوصفها كائنيّة التوجه (OOP)، وبالتالي فهي تعتمد أساسًا على وجود الأصناف (classes) التي تحتوي بدورها على الخاصّيّات (properties) والدوال (functions)، كما وتدعم Kotlin العلاقات فيما بينها مثل الوراثة (inheritance) من صنفٍ أعلى (superclass) أو التداخل فيما بينها (nesting classes)، وتمتاز بوجود مُحدِّدات الوصول (visibility modifiers) للتحكم بعمليات الوصول للبيانات المُخزَّنة، وكذلك فهي تعتمد في بُنيتها على الحزم (packages) والمكتبات (libraries) التي تحتوي على الدوال المساعدة عند الحاجة إليها، أمّا عن بُنية التعليمات والأوامر البرمجيّة فهي -كمِثل لغات البرمجة الأخرى- تحتوي على التعليمات الشرطيّة (conditionals) والحلقات (loops) وأوامر التحكم بالتدفق (control flow) مثل العودة (return) والاستمرار بالحلقة (continue) أو الخروج منها (break).

مثال:

fun main(args: Array<String>) {

    val first: Int = 10
    val second: Int = 20

    val sum = first + second

    println("The sum is: $sum")
}

يقوم برنامج Kotlin السابق بجمع قيمتي العددين first و second وإظهار ناتج جمعهما sum.

توافق Kotlin مع البيئات الأخرى

استخدام Kotlin في تطوير تطبيقات الخادم (Server)

إذ تُستخدَم لغة Kotlin في تطوير تطبيقات الخادم (Server) ويمكن نشر التطبيقات المكتوبة بها ضمن أيّ مُضيف (host) يدعم تطبيقات Java للويب، كما وتستفيد من عددٍ كبيرٍ من منصّات العمل مثل Spring و Vert.x وغيرها، وتمتاز بقابليتها للتوسّع.

استخدام Kotlin في تطوير تطبيقات Android

تُستخدَم لغة Kotlin في تطوير تطبيقات Android لقوتها من ناحية الأداء (performance) وصِغر حجم التخزين المستخدَم لتطبيقاتها، كما وتقبل الإضافات (plugins) في بيئة Android، مما يُسرِّع من عملية البرمجة والترجمة (compilation).

استخدام Kotlin في بيئة لغة البرمجة JavaScript

تمتاز لغة Kotlin بسهولة تحويل شيفراتها إلى ما يماثلها في JavaScript آخذةً بالحسبان الحجم المثاليّ للتخزين وتحقيق نفس الفعاليّة، إذ تتيح إمكانيّة التعامل مع عناصر DOM ومع الرسوميات بالاعتماد على WebGL.

البدء بلغة البرمجة Kotlin

بُنية البرمجة في Kotlin

تعتمد أساسًا على الحزم (packages) والأصناف (classes) والدوال (functions) والمتغيِّرات بنوعيها var (بقيمة متغيّرة) و val (للقراءة فقط) والتعليقات (comments) التوضيحيّة التي تجعل البرنامج أسهل للقراءة، إضافةً إلى التعابير الشرطية (conditionals) والحلقات (loops) والمجالات (ranges) والمجموعات (collections) والتحويل ما بين الأنواع (casting).

الاصطلاحات العامّة في اللغة

إذ يُصطلح ما بين مبرمجي Kotlin على بعض البُنى البرمجيّة واستخداماتها بنفس الهدف.

أنماط الشيفرات المُتعارَف عليها ما بين مبرمجي Kotlin

وهي الأنماط المُتَّفق عليها لكتابة الشيفرات في Kotlin وتشمل طرائق التنظيم، وقواعد التسمية، وكيفية التنسيق، إضافةً إلى التعليقات التوثيقيّة.

أساسيات البرمجة في Kotlin

الأنواع الأساسية للبيانات

وهي تشمل الأعداد (Numbers)، والمحارف (Characters)، والقيم الثنائيّة (Booleans)، والمصفوفات (Arrays)، والسلاسل النصيّة (Strings)، والقيم المباشرة للسلاسل النصيّة (Literals)، وقوالب السلاسل النصية (String Templates) وغيرها.

الحزم (packages) واستيرادها

إذ يمكن استيراد (import) الحزم والاستفادة مما تحتويه من أصنافٍ ودوال.

التحكم بالتدفق (Control Flow) في سياق البرنامج

عبر التعابير الشرطية مثل if و when وكذلك الحلقات مثل for و while و do-while.

أوامر العودة (return) والقفز

وهي الأوامر التي تنقل سياق البرنامج من موقعٍ لآخر مثل return أو break أو continue.

الأصناف (Classes) والكائنات (Objects)

الأصناف والوراثة (Inheritance)

يُصرَّح عن الأصناف في لغة Kotlin لتُؤخذ نسخٌ عنها وهي ما يُعرف بالكائنات (objects) التي يكون الوصول من خلالها إلى الخاصّيّات والدوال الموجودة في الصنف، يحتوي الصنف على بانٍ رئيسيّ (primary constructor) واحدٍ وبانٍ ثانوي (secondary constructor) أو أكثر، وترتبط بعض الأصناف فيما بينها بعلاقة الوراثة أو التداخل (nesting)، وقد تكون الأصناف من النوع المُجرَّد (abstract).

الخاصّيّات (Properties) وحقول البيانات

تحتوي الخاصيات على البيانات الفعليّة ويكون الوصول إليها عبر getter وsetter، وتدعم لغة Kotlin كذلك الحقول (fields) والخاصّيّات المساعدة، وتمتاز بأمر التهيئة اللاحقة (late initializing) وإعادة تعريف الخاصّيّات (overriding).

مُحدِّدات الوصول (Visibility Modifiers)

وهي المسؤولة عن تحديد إمكانيّة الوصول للخاصّيّات أو الدوال أو الأصناف وتشمل: النوع العام (public) والداخليّ (internal) والمحميّ (protected) والخاصّ (private).

الإضافات (Extensions)

والتي تُضاف إلى الدوال أو الخاصّيّات، وذلك لتجنُّب إعادة بنائها من جديد، وهي منفصلةٌ ستاتيكيًا، وقد تُجرَى كذلك بعض الإضافات على الكائنات المرافقة (companion objects).

أصناف البيانات (Data Classes)

وهي الأصناف المستخدمة لتخزين البيانات بشكلٍ أساسيّ في خاصّيّاتها، وتعتمد على بعض الدوال بما يتناسب مع المعاملات المُعرَّفة في الباني الأساسيّ (primary constructor) للصنف.

الأصناف المغلقة (Sealed Classes)

تُستخدَم الأصناف المُغلَقة (وهي أصناف مُجرَّدة) لتمثيل الهرميّة (hierarchy) المحدودة للأصناف، وبالتالي تُعدُّ هذه الأصناف إضافةً (extension) لأصناف الثوابت المُتعدَّدة (enum classes)، ويمكن أن يكون له عدّة أصنافٍ فرعيةٍ (subclasses) ضمن نفس الملف الموجود فيه.

الأنواع المُعمَّمة (Generics)

وتعتمد بشكلٍ أساسيٍّ على التغيُّر في موقع التصريح (declaration-site variance) مما يجعل الأنواع covariant (نوع منتج out)، وكذلك على الأنواع المُسقَطة (type projection) مما يجعل الأنواع contravariant (نوع مستهلك in).

الأصناف المتداخلة (Nested Classes)

وهي أن يقع صنفٌ ما في صنفٍ آخر خارجيّ محيط به، وقد تكون الأصناف داخليّةً (inner) أو مجهولة (annonymous).

أصناف الثوابت المٌتعدِّدة (Enum)

يتلخَّصُ الاستخدام الرئيسيّ لأصناف الثوابت المتعدَّدة في قدرتها على تعريف الاستخدام (implementing) للثوابت المتعدًّدة الحافظة للنوع (type-safe)، إذ تحتوي أصناف الثوابت المتعدِّدة (enum) في Kotlin على توابع تركيبية (synthetic methods) -كما هو في Java- مما يسمح بتعداد الثوابت المُتعدِّدة والوصول إلى أيّ ثابتٍ منها عبر اسمه.

الكائنات (Objects)

حيث تتيح Kotlin إمكانيّة التصريح عن الكائنات (وقد تكون كائناتٍ مجهولةً) وذلك عند الحاجة لإنشاء كائنٍ بإجراء تعديلاتٍ طفيفةٍ على أحد الأصناف (classes) بدون التصريح عن صنفٍ فرعيٍّ (subclass) له، كما وتمتاز لغة Kotlin بدعمها للكائنات المرافقة (companion objects).

الانتقال الفرعيّ / التعميم (Delegation)

وهو بمثابة بديلٍ جيّدٍ عن وراثة تعريف الاستخدام (implementation inheritance)، إذ تدعم لغة Kotlin هذه الميّزة بشكلٍ طبيعيّ دون الحاجة إلى أيّ نوع قياسيّ من الشيفرات.

الخاصّيّات المُعمَّمة (Delegated Properties)

وهي الخاصّيّات التي يجري تعريف استخدامها مرةً واحدةً وتخزين هذا التعريف في المكتبة (library) للاستفادة منه كلما دعت الحاجة، ولها عدة أنواع: لخاصّيّات الكسولة (Lazy property) والخاصّيّات المُراقَبة (observable property) والعنصر map، كما وتحتوي مكتبة Kotlin القياسيّة على عددٍ من التوابع المُنتِجة (factory methods) لأنواع التعميمات المختلفة.

الدوال وتعابير lambdas

الدوال (Functions)

وهي مماثلة للتوابع (methods) في لغة Java، وتحتوي على المعاملات (وقد تُجعل لها بعض القيم الافتراضيّة)، وتمتاز لغة Kotlin بوجود النوع Unit والذي هو النوع المُعاد للدالة التي لا تعيد أيّ قيمةٍ.

تعابير Lambda

وهي بمثابة قيمةٍ حرفيّة (Literals) للدالة، وهي دالةٌ لا يُصرَّح عنها بل تُمرَّر كتعبيرٍ مباشرةً، وذلك بفضل دعم Kotlin لإمكانية تمرير الدوال كمعاملات (parameters) للدوال الأخرى.

الدوال المباشرة (Inline Functions)

وهي ميزة جعل الدوال كتعابيرٍ مباشرة في موقع الاستدعاء بالاعتماد على تعابير lambda، كما وتدعم Kotlin المتغيِّرات من النوع reified .

الروتينات المساعدة (Coroutines)

توفر الروتينات المساعدة طريقةً لمنع المعالجة (thread) من إبطاء العمل الكليّ، وذلك بعملية أقلَّ كلفةً وأكثر قابليّة للتحكم، وهي إمكانية تأجليه (suspend) بالاعتماد الروتينات المساعدة.

متفرقات

التصريحات المُتعدِّدة (Multi Declarations)

وهي إمكانية التصريح بالتفكيك (destructuring) والتي تسمح بتفكيك الكائن إلى عددٍ من المعاملات يُسمح باستخدامها بشكلٍ مستقلٍ تمامًا، ويستفاد من التفكيك بتعابير lambda.

المجموعات (Collections)

تُستخدم بهدف تجميعٍ للبيانات ضمن بُنى محدَّدة مثل: القائمة (List) والمجموعة (Set) و الخارطة (Map) والتي تُنشَأ بسهولة باستدعاء التوابع الموجودة في المكتبة القياسيّة.

المجالات (Ranges)

تعبِّر عن المفهوم الرياضيّ للمجال المُغلَق (يشمل قيمتيّ البداية والنهاية) والمُعرَّفِ للقيم القابلة للمقارنة (comparable)، وله نقطتان تُحدِّدانه: البداية start والنهاية endInclusive(المُتضمَّنة في المجال)، و تكون contains العمليةَ الأساسيّة المُستخدمَة فيها وهي تعتمد على صيغةٍ تستخدم المعاملين inو ‎!in.

التحقُّق من الأنواع والتحويل فيما بينها (Casting)

وهي العمليات المستخدمة للتأكد من انتماء الكائن لنوعٍ مُحدَّدٍ من البيانات، كما وتدعم Kotlin التحويلات الذكية (smart casts) والآمنة ما بين الأنواع المختلفة.

تعبير this

الذي يُستخدَم بشكل رئيسيّ لتحديد المستقبِل (receiver) والذي قد يكون الكائن (object) الحاليّ أو المجال الخارجيّ في حال استخدام تعبير this المُقيَّد.

التساوي (Equality)

إذ تحتوي لغة Kotlin على نوعين من التساوي: البنيويّ (structural) للتأكد من تساوي القيمة، والمرجعيّ (referential) للتأكد من الإشارة لنفس الكائن (object).

التحميل الزائد للمعاملات (Operators Overloading)

إذ تُعدُّ المعاملات أهم ما في لغة البرمجة بشكلٍ عامٍ، وتُتيح لغة Kotlin إجراءَ مجموعةٍ مُعرَّفة مسبقًا من العمليات على أنواع البيانات المختلفة وذلك باستخدام رموزٍ ثابتةٍ تعتمدها لتقوم باستدعاء الدوال الموافقة لها والمسؤولة عن القيام بالعملية المطلوبة.

التحقّق من Null

تدعم Kotlin النوع المميز nullable وذلك بهدف الحدِّ من أخطار القيمة الفارغة null في الشيفرات، إذ إنّ أحد الأخطاء الأكثر شيوعًا في لغات البرمجة هو محاولة الوصول إلى مرجعيّةٍ تحتوي على القيمة null وسيؤدي إلى حدوث استثناءٍ (exception)، لذلك توفّر Kotlin إمكانية الاستدعاء الآمن (safe call).

الاستثناءات (Exceptions)

تعتمد Kotlin على البنية المعروفة بالأقسام الثلاثة try/catch/finally لمعالجة الاستثناءات التي قد تحدث.

التوصيفات (Annontations)

تدعم لغة Kotlin التوصيفات والتي هي إحدى الوسائل المستخدمة لإضافة بياناتٍ توصيفيّةٍ (metadata) إلى الشيفرة وتُسبَق بالرمز @ للدلالة عليها.

الانعكاسات (Reflection)

هو مجموعةٌ من مميّزات اللغة والمكتبات التي تسمح بمراقبة بُنية البرنامج أثناء التنفيذ، وهي بالنهاية مرجعيّة تشير للصنف (class) أو الدالة (function) أو الخاصّيّة (property) أو الباني (constructor).

المنشِئ الحافظ للنوع (Type-safe Builder)

يسمح المُنشِئ الحافظ للنوع ببناء لغات مُخصَّصة المجال (DSL) بالاعتماد على Kotlin، بما يتناسب مع إنشاء بُنى البيانات الهرميّة المعقَّدة مثل توليد ترميز HTML أو تصميم واجهات المستخدم أو ضبط مسارات خادم الويب.

التسمية البديلة الأنواع (Type Aliases)

تدعم لغة Kotlin ميّزة التسمية البديلة للأنواع الموجودة للبيانات، وخاصّة إن كان اسم النوع طويلًا فيُستعاض عنه باسمٍ أقصرٍ ويُستخدَم الاسم الجديد في كتابة الشيفرات.

المشاريع متعدِّدة المنصّات (Multi platforms)

يسمح مشروع Kotlin متعدّد المنصّات بترجمة الشيفرة ذاتها إلى عدّة منصّاتٍ للعمل (platforms)، وتدعم Kotlin حاليًا البيئات: JVM و JavaScript، إذ يحتوي المشروع على وحدةٍ مشتركةٍ لكافة منصّات العمل، ووحدات مُخصَّصة لكل منصّة يشملها المشروع.

مرجعيّات (References)

الكلمات المفتاحيّة (Keywords) والمعاملات (Operators) في اللغة

سردٌ للكلمات المفتاحيّة والمعاملات الموجودة في لغة Kotlin وتوضيح استخداماتها.

الأسئلة الشائعة حول Kotlin

تجد هنا إجابةً للكثير من التساؤلات التي تجول في رأسك حول لغة Kotlin.

مقارنة مع لغة Java

عرضٌ لمميزات كلِّ منهما ومقارنةٌ بسيطةٌ بينهما.