بداية تركنا للغة البرمجة جافا، والانتقال للغة Go

السلام عليكم ورحمة الله

بدأت قبل أكثر من عشرة أعوام بدراسة لغة البرمجة جافا كبديل للغة البرمجة دلفي أو أبجكت باسكال، كما تكلمت في تدوينة سابقة في ذلك الوقت. ثم اعتمدت لغة جافا في عملي الخاص منذ بداية تأسيسه في عام 2012، وكانت لغة جافا مدعومة بشكل جيد في مجال الاتصالات الذي نستهدفه في برامجنا. وبعد عام من استخدامها كتبت عنها كتاب. وحققت لنا تلك البرامج نجاح كبير -بفضل الله تعالى- وساهمت في تأسيس جزء كبير من اﻷنظمة البرمجية والتي ساهمت في تأسيس عملي الخاص (كود لبرمجيات الكمبيوتر). لكن بعد مرور خمس أعوام تقريباً أصبحت تواجهنا مشاكل في البرامج المكتوبة بهذه اللغة بعد زيادة الاستخدام واستمرار تعقيد البرامج وتطويرها، والعمل لسنوات عديدة على نفس العتاد ونفس النُسخة من نظام التشغيل، لذلك بدأنا بدراسة بدائل وكان البديل المناسب للغة جافا هو لغة البرمجة Go، والتي تكلمت عن نجاحنا في تحويل بعض البرامج التي كانت بها مشكلة من جافا إلى لغة Go في تدوينة قبل عامين تقريباً.

بعد أن كتبنا عدد كبير من البرامج بلغة البرمجة جافا، مثل برامج الويب وخدمات الويب والتي تستخدم مخدم الويب Tomcat وبعض البرامج التي تعمل في الخلفية وبرامج متعددة المهام Multi-thread ، واجهتنا مشاكل في عدم الاستقرار وتوقف مخدم الويب Tomcat مما ينتج عنه توقف البرامج التي يفترض أن تعمل على مدار الساعة أو كما تُسمى 24/7 ، ولحل المشكلة يتطلب إعادة تشغيل لمخدم Tomcat، ومع التوقف المتكرر نتج عنه تذمر المستفيدين من البرامج، خصوصاً إذا لم نحل المشكلة في وقت وجيز. بعض المخدمات تعطل فيها تماماً مخدم Tomcat ولم يعمل بعد عدد من المحاولات لتشغيله. فكان الحل اﻷسرع هو تشغيل البرامج في أكثر من مخدم فإذا توقف اﻷول يحدث تحويل للمستخدمين تلقائياً للمخدم الثاني، لكن نجح هذا الحل فقط في برامج الويب، أمام خدمات الويب فلم تنجح معها تلك الطريقة، وفكرنا في حل جذري بإعادة كتابة تلك البرامج بلغة Go وكان أول مثال أو مثالين نجحا في العمل بدون توقف في نفس المخدم الذي كانت به مشكلة لبرامج الجافا كما ذكرت في المقالة السابقة. لاحقاً تعرفنا على مخدم أخف من Tomcat وبه إمكانات أقل لكنه أكثر استقراراً وهو Jetty واستخدمناه، لكن بعد أن بدأنا في تحويل عدد من البرامج إلى لغة Go

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

المشكلة الثالثة هي تعقيد بيئة ولغة جافا مقارنة باللغات اﻷحدث واﻷبسط مثل لغة Go و Node .JS – والتي تستخدم لغة جافا سكريب والتي ليس لها علاقة بلغة جافا-. حيث أن لغة جافا لغة قديمة ولها أرث كبير من المكتبات وطُورت في زمن مختلف وحدث فيها تغييرات لكن حافظت على بعض التعقيد منذ الماضي مثل تعقيدها في تعدد المهام، وهذه مقالة مفصلة لتجربة ومقارنة بين تعدد المهام (Multi-threading) في برنامج بلغة جافا وآخر بلغة Go واصفاً النوع اﻷخير بأنه Green Thread فهو يستهلك موارد أقل للمعالج. كذلك فإن برامج الويب تحتاج إلى مخدم ويب يدعم جافا، واللغة نفسها معقدة مقارنة باللغات الحديثة التي أصبحت أبسط.

المشكلة الرابعة هو اختلاف نُسخ جافا في المخدم واختلاف نُسخ المكتبات، فعندما بدأنا استخدامها كُنا نستخدم جافا 7 و نُسخة Tomcat 7، فكان هُناك نوع من الاستقرار لعدد من الأعوام، إلى أن ظهرت جافا 8 وأصبحت معتمدة في النُسخ الجديدة من أنظمة لينكس، كذلك أصبحت مطلوبة لتثبيت نُسخة NetBeans 8.2، وأصبح هُناك بعض الاختلاف في قواعد اللغة بين جافا 7 وجافا 8 وبعض المكتبات تتطلب جافا 8، ثم ظهرت جافا 11، وظهرت نُسخة قاعدة البيانات MySQL 8 بدلاً عن MySQL 5 والتي تتطلب مكتبات مختلفة، أي مكتبة للنُسخة 5 وأخرى للنُسخة رقم 8، وعندما بلغ عدد المخدمات التي نعمل عليها حوالي 70 مخدم عند مختلف العملاء و تحتوي على نُسخ مختلفة من نظام أوبونتو لينكس ونُسخ مختلفة من جافا ونُسخ مختلفة من قاعدة البيانات MySQL وبعضها MariaDB أصبحت الجافا مشكلة حقيقية للتوفيق بين هذا الاختلاف، وحتى بين جهاز لابتوب المبرمج نفسه، في المقابل برامج لغة البرمجة Go ليس لديها هذه المشكلة، فهي لا تحتاج إلى أي مكتبات خاصة في المخدمات، حيث يمكننا مثلاً تحميل إصدار ة جديدة من لغة البرمجة Go ثم مباشرة نستخدمها لإعادة إنتاج برامج وتثبيتها في أي مخدم بغض النظر عن نُسخة لينكس وبغض النظر عن نُسخة MySQL التي تعمل بها. و برامجها معتمدة على نفسها أكثر من اعتمادها على بيئة نظام التشغيل الخارجية، هذه الميزة تُسمى Self-contained وهي ميزة مهمة جداً كانت في السابق في لغة دلفي، لذلك تجدني لا أميل لأي لغة برمجة script مثل PHP, Node.JS وغير ها من اللغات المفسرة وليست المترجمة التي تحتاج لتثبيت مترجم اللغة ومكتباتها في أي مخدم، فهذا يجعل البرامج بها نوع من الهشاشة ولها ارتباط شديد بالبيئة مما يخلق مشاكل مستمرة في توزيع البرامج التي تعمل بها في المخدمات، بعكس اللغات المترجمة المعتمدة على نفسها Self-contained فهي ينتج عنها برامج ثُنائية قوية معتمدة على نفسها، لكن مشكلتها الوحيدة أن حجمها كبير تؤثر في سرعة تحميلها إلى المخدمات إذا كان الاتصال مع المخدم بطيء.

كتبت لغرض شرح استهلاك الموارد لهذه التدوينة برنامجين باللغتين للمقارنة في استهلاك الذاكرة لإظهار التاريخ والزمن كل ثانية، فبرنامج لغة Go استهلك حوالي 2 ميقابايت من الذاكرة، أما برنامج جافا فقد استهلك 18 ميقابات. كذلك أداة التطوير LiteIDE المُستخدمة لكتابة وتطوير البرامج للغة Go تستهلك حوالي 75 ميقابات، مقارنة بأداة التطوير NetBeans والمكتوبة بلغة جافا نفسها فهي تستهلك 618 ميغابايت حسب التجربة، وهي بطيئة في الإقلاع وتحتاج لجهاز ذو مواصفات أعلى. في نهاية المقالة سوف تجدون تفاصيل للبرنامجين واستهلاكهم للذاكرة والمعالج.

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

ما تزال قصة التحويل هذه في منتصفها، لا نستطيع الحكم عليها اﻵن بأنها ناجحة بالكامل، لكن بعد عام أو أكثر – إن مد الله في العمر- ربما نتكلم عن التجربة بعد تمامها لنرى كيف صار التحويل وهل ظهرت تحديات أخرى أم لا، وسوف تتضح الصورة بطريقة أفضل بإذن الله. أردت التوثيق لهذه النقلة لتكون كمرجع، وكذلك ليستفيد من هذه التجربة أو مجموعة التجارب هذه غيرنا حتى لا يقع في نفس الأخطاء التي وقعنا فيها. لكن الجدير بالذكر أن عدد من برامج جافا التي كتبناها طوال هذه الفترة كانت مستقرة وهي ذات استخدام معتدل وأبسط ولا تحتوي على تعقيد مثل تعدد المهام. كذلك فإن مخدم Tomcat ذو اﻹمكانات العالية عمل باستقرار في عدد من برامج الويب وخدمات الويب، لذلك نقول أنه ما تزال لغة جافا تصلح لعدد من التطبيقات ولا ننصح بالتغيير لأجل التغيير ما دامت البرامج مستقرة، ولا توجد لغة برمجة كاملة، وكل لغة تصلح لنوع معين من التطبيقات.

هذه هي البرامج ونتائج استخدامها للموارد، واستخدمت برنامج ps_mem في الرابط أدناه في نظام لينكس المكتوب بواسطة لغة بايثون لقياس استخدام الذاكرة لكل برنامج:

https://github.com/pixelb/ps_mem

برنامج لغة Go

func main() {
	for {
		fmt.Println(time.Now().String())
		time.Sleep(time.Second)
	}
}

برنامج جافا:

    public static void main(String[] args) throws InterruptedException {
        while (true){
            System.out.println(new Date().toString());
            Thread.sleep(1000);
        }
    }

وهذه نتيجة المقارنة بين استهلاك الذاكرة بين البرنامجين:

بعد عدد من الساعات لاستمرار تشغيل تلك البرامج زاد استهلاك برنامج Go إلى 2.5 ميقا، بينما تضاعف استهلاك برنامج جافا إلى 52 ميقا:

وهذه مقارنة لعدد الـ Threads المستهلكة من نظام التشغيل لتشغيل البرنامجين:

4 رأي حول “بداية تركنا للغة البرمجة جافا، والانتقال للغة Go

  1. “LiteIDE المُستخدمة لكتابة وتطوير البرامج للغة Go تستهلك حوالي 75 ميقابات، مقارنة بأداة التطوير NetBeans والمكتوبة بلغة جافا نفسها فهي تستهلك 618 ميغابايت حسب التجربة”
    لا يمكن المقارنة بين محررين مختلفين بكم كبير من المزايا، اذا كان كذلك فان محررد notepad++ المكتوب ب C++
    او المحرر miniEdit المكتوب بالباسكل يستهلك كلاهما 5 ميغابايت فقط هذا يعني انه لغة غواسوأ من الباسكال و السي

    1. صحيح، لكن LiteIDE تغطي كامل احتياجات التطوير للغة Go ليست بسيطة إنما هي موجهة للغة Go وليست عامة مثل NetBeans أو VC
      من ناحية عملية المتطلبات لجهاز لابتوب لتطوير برامج Go أقل من متطلبات تطوير جافا، فالموضوع ليس فقط لغة برمجة، إنما يُضاف إليها الأدوات أي البيئة البرمجية كاملة وحتى الدعم الفني في الإنترنت كلها لها أثر إما سلباً أو إيجاباً لنجاح أو فشل أي لغة برمجة وأدوات تطويرها
      وبالمناسبة LiteIDE مكتوب بلغة سي، أنا ذكرته كمقارنة عامة بين اللغات المترجمة التي ينتج عنها ملفات تنفيذية ثنائية مقابل البايت كود

  2. لغو غو ليست مبنية لتغطي كافة الاحتياجات كما فعلت ال C++ و ال Pascal فهي مازالت ضغيفة و امامها الكثير من التطويرات

    1. لغة Go طورتها قوقل لتغطية احتياجات عملها الداخلي من محرك البحث و Chrome backend
      بدأت كلغة بديلة للغة C++ لكن انحرفت في مسارها وأصبحت بديلة للغة جافا من حيث استهداف برامج خدمات الويب وبرامج الويب والاتصالات والشبكات
      اللغة البديلة للغة سي وسي++ هي Rust

اترك تعليقًا

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

شعار ووردبريس.كوم

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

Connecting to %s