طريقة عمل لغة كوتلن على JVM

في هذا المقال نستخضر لغة كوتلن و طريقة عملها على JVM

Ismail Ait Bellaمنذ 4 سنوات

من منا لم تصدمه كوتلن عند اول مرة يسمع بها و بالطبع انقسم المبرمجون الى قسمين قسم براكماتي لا تهم اي اداة يستخدم الاهم انها هي الانسب له في مشروعه و قسم تقليدي و الذي لا يرغب ان يستوعب او انه لم يتقبل فكرة ان كوتلن لغة بها مميزات اكثر من جافا و انها تسهل البرمجة مئات المرات . و بما اننا متعصبون لافكارنا فقد بدأ البعض باختراع بعض الاشياء من كيسه الشخصي في هذه المقالة سنعمل على هدم احد هذه الافكار و هي ان الجافا مبنية على كوتلن .

هذه مقالة ضمن سلسلة مقالات عن الكوتلن تابعني على توتير ان كنت مهتما  @Abellaismail4 و ها هي المقالة الاصلية .

ما هي كوتلن

نعلم جميعا ان كوتلن لغة برمجة و لا احد ينكر ذلك ، لكن ما لا يعلمه الكثيرون هو ان الكوتلن تنافس على جميع الجبهات فكود الجافا لا تستطيع تشغيله الا في الاجهزة التي تتوفر على JVM اما الكوتلن تشتغل على JVM و على الويب او اي جهاز في العالم اي كان نوعه حيث توجد ثلات اصدارات حتى الان من كوتلن (على حد علمي)

  1. كوتلن Native

  2. كوتلن JVM
  3. كوتلن JS

و كما نرى فلا واحدة منها لها علاقة بالجافا . الا من ناحية JVM 

ما هو JVM

او Java Virtual Machine و هي عبارة عن برنامج يقوم بتشغيل برامج اخرى لديه هدفان اساسيان وهما

  1. ادارة الذاكرة : فمثلا في لغة السي يقوم المبرمج باستخدام Pointers و دوال Allocation للتعامل مع الذاكرة اما JVM فهو يقوم بذلك بدلا منك باستخدام  Garbage Collection .
  2. كود واحد موجه لجميع الانظمة : اخدا بمبدا "اكتب الكود مرة واحدة و قم بتشغيله في كل مكان"

 لن نتطرق الى طريقة عمله لكن ما يقوم به هو ان ياخد الجافا و ينفذه على جميع الانظمة التي تدعم JVM . 

Java Virtual Machine

ماذا عن الاندرويد

اذا كانت برامج الجافا تعمل JVM فلماذا لا تعمل تطبيقات الجافا Jar على الاندرويد هذا بسبب ان نظام التشغيل لا يستعمل JVM المعروف و انما يستخدم واحد اخر يسمى Dalvik VM بدلا Java VM .

طريقة عمل الجافا/كوتلن

افترض ان الكثير منكم جرب كوتلن/جافا على الاندرويد و اعتقد ان الكثير منكم يظن ان هناك علاقة بين جهاز الذي يشتغل عليه الاندرويد و كوتلن لكن في الحقيقة فان نظام لم و لن يكن يعرف شيئا عن جافا او كوتلن بل هو يتعامل مع لغة اقرب ما تكون الى لغة Assembly ، و تسمى البايت كود و يمكنك ان تعتبر هذا النوع هو افضل طريقة لمعرفة كيف يتم التواصل مع الهاردوير .

Bytecodeclass Main {
  Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main();
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello world!!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

اذا كنت تتسائل كيف حصلت على هذا الكود فقط اتبع الخطوات التالية

$ touch Main.java // انشاء ملف جديد
$ cat Main.java // يستعرض محتوى الملف 
class Main{
	public static void main(){
		System.out.println("Hello world!!");
	}
}
$ javac Main.java // ترجمة كود الجافا الى بايت كود
$ javap -c Main  // استعراض البايت الكود 

اذن اللغة التي سبق و اشرنا اليها هي اللغة التي يفهمها الاندرويد اي ان ما يحدث في الاندرويد هو انه يحول الكود الذي كتبته سواءا بجافا او كوتلن و يحوله الى بايت كود و يضع في ملف APK مع بعض الاشياء الاخرى التي ليست ضمن نطاق المقالة . للاسف فهذا الكود لن يعمل الا ان كان الجهاز يتوفر على JVM عكس Assembly التي تعمل على جميع الاجهزة .

خلاصة القول

كوتلن هي لغة في نفس مستوى جافا كلاهما لديهما كومبايلير/مترجم يقوم بترجمة ما قمت بكتابته الى كود  اقرب الى لغة التجميع Assembly و بعدها ياتي دور JVM و هو الذي يقوم بتنفيد هذا الكود على جهاز المستخدم .  بمعنى اخر كوتلن لا تستخدم حتى حرف واحد من جافا .

الجافا مبنية على كوتلن

لا اعتقد ذلك بل هذا ليس صحيحا 100٪ جافا و كوتلن تجمعهما علاقة واحدة فقط و هي ان كلايهما يشتغلان على JVM و توجد ايضا لغات اخرى مثل Groovy او Scala .

طريقة فهم اكواد الكوتلن

توفر كوتلن العديد من الخصائص و التي لا نعلم كيف تعمل من الداخل و لهذا احيانا نرغب في تحويل كود الكوتلن الى بايت كود لفهمه اكثر و لكن قد يزيد هذا الطين بلة و من الصعب فهم ما يحدث و بما اننا يمكننا ان نحول البايت كود الى جافا فهذا سيسهل الامر عليك . 

طريقة الاندرويد ستوديو

من الاندرويد ستوديو افتح الملف الذي ترغب في فهمه فقط قم باتباع الخطوات التالية بدا من القائمة العلوية

Tools ▸ Kotlin ▸ Show kotlin Bytecode

وصف للسيو

 

ستظهر قائمة جانبية بها البايت كود و بما انه يصعب فهمه فدعونا نحوله الى جافا بالظغط على زر Decompile . الماجود بالاعلى .

وصف للسيو

 

كما نرى فقد حصلنا على مقابل كود الكوتلن بجافا حيث ان اقل من 20 سطرا تحول فجاءة الى  273 سطر في الجافا .

هذه الطريقة ليست دائما الافضل ففي حالة Coroutines قد تحصل على لوب لا نهائي لذا من الافضل اتباع الطريقة الثانية

الطريقة الثانية : procyon-decompiler

هذه اداة تسمح لنا بتحويل البايت كود الى كود الجافا باحترافية كبيرة دون القلق على حصول مشاكل . لدى فانا انصح بها و اكثر . 

هذا هو الكود الذي نرغب في تحويله الى جافا .

kotlinfun main(){
	println("Hello world!!")
}

قم بتحميل procyon-decompiler و kotlinc الطريقة تختلف من نظام تشغيل الى اخر انا ساستعمل homebrew في الماك . و اذا كنت لا تتعامل مع vim فقط قم بانشاء ملف بالطريقة العادية و ضع الكود السابق داخله . ثم انتقل الى مسار الملف في سطر الاوامر  Terminal .

terminal$ brew install procyon-decompiler // لتحميل الاداة في الماك
$ brew install kotlinc // لتحميل الكوتلن في الماك
$ vim hello.kt // قم بانشاء ملف و ادخل فيه كود الكوتلن
$ kotlinc hello.kt // تحويل كود الكوتلن الى بايت كود
$ procyon-decompiler HelloKt // تحويل كود الكوتلن الى جافا

النتيجة كانت رائعة و ستمكنك من فهم ما يحدث . قد تكون بعض الاشياء الغريبة لكن تجاهلها فقط  .

javaimport kotlin.Metadata;

//
// Decompiled by Procyon v0.5.36
//

@Metadata(mv = { 1, 1, 16 }, bv = { 1, 0, 3 }, k = 2, d1 = { "\u0000\u0006\n\u0000\n\u0002\u0010\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001" }, d2 = { "main", "" })
public final class HelloKt
{
    public static final void main() {
        System.out.println((Object)"Hello world!!");
    }
}
كلمات دليلية: java jvm kotlin
1
إعجاب
2427
مشاهدات
0
مشاركة
1
متابع

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !