طريقة عمل لغة كوتلن على JVM
في هذا المقال نستخضر لغة كوتلن و طريقة عملها على JVM
من منا لم تصدمه كوتلن عند اول مرة يسمع بها و بالطبع انقسم المبرمجون الى قسمين قسم براكماتي لا تهم اي اداة يستخدم الاهم انها هي الانسب له في مشروعه و قسم تقليدي و الذي لا يرغب ان يستوعب او انه لم يتقبل فكرة ان كوتلن لغة بها مميزات اكثر من جافا و انها تسهل البرمجة مئات المرات . و بما اننا متعصبون لافكارنا فقد بدأ البعض باختراع بعض الاشياء من كيسه الشخصي في هذه المقالة سنعمل على هدم احد هذه الافكار و هي ان الجافا مبنية على كوتلن .
هذه مقالة ضمن سلسلة مقالات عن الكوتلن تابعني على توتير ان كنت مهتما @Abellaismail4 و ها هي المقالة الاصلية .
ما هي كوتلن
نعلم جميعا ان كوتلن لغة برمجة و لا احد ينكر ذلك ، لكن ما لا يعلمه الكثيرون هو ان الكوتلن تنافس على جميع الجبهات فكود الجافا لا تستطيع تشغيله الا في الاجهزة التي تتوفر على JVM اما الكوتلن تشتغل على JVM و على الويب او اي جهاز في العالم اي كان نوعه حيث توجد ثلات اصدارات حتى الان من كوتلن (على حد علمي)
-
كوتلن Native
- كوتلن JVM
- كوتلن JS
و كما نرى فلا واحدة منها لها علاقة بالجافا . الا من ناحية JVM
ما هو JVM
او Java Virtual Machine و هي عبارة عن برنامج يقوم بتشغيل برامج اخرى لديه هدفان اساسيان وهما
- ادارة الذاكرة : فمثلا في لغة السي يقوم المبرمج باستخدام Pointers و دوال Allocation للتعامل مع الذاكرة اما JVM فهو يقوم بذلك بدلا منك باستخدام Garbage Collection .
- كود واحد موجه لجميع الانظمة : اخدا بمبدا "اكتب الكود مرة واحدة و قم بتشغيله في كل مكان"
لن نتطرق الى طريقة عمله لكن ما يقوم به هو ان ياخد الجافا و ينفذه على جميع الانظمة التي تدعم JVM .
ماذا عن الاندرويد
اذا كانت برامج الجافا تعمل 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!!");
}
}
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !