أكواد أنيقة وقوية … لمَ يجب أن تكون GoLang لغة البرمجة التالية لتتعلمها؟

2

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

اليوم سنتطرق للحديث عن لغة Go أو GoLang، ما الذي يجعلها اللغة التالية التي يجب أن تتعلمها، ولمَ أتت في الأساس؟ كل هذا في المقال التالي:

لمحة سريعة عن لغة GO

أعلنت جوجل في عام 2007 عن إطلاقها للغة GO بهدف حل بعض مشكلات البنية التحتية لبرمجيات جوجل. ومن أهم ميزاتها القدرة على ملائمة بنية البرمجيات لنمو النظام، وهي مبنية على جافا وبايثون و ++C.

محدودية عتاد الحاسب الصلب

صدر أول معالج بينتيوم 4 بسرعة ساعة 3.0GHz في عام 2004، وحتى عام 2016 ولنأخذ على سبيل المثال جهاز مارك بوك برو ذي سرعة ساعة 2.9GHz!! عقد كامل ولم يكن هنالك تطور يذكر في قوة المعالجة، وهذا إن دلّ على شيء فهو أن قانون مور في طريقه إلى الفشل!

زيادة قوة المعالجة
يبين المخطط بقاء تردد المعالجات والأداء ثابتين لما يقارب العقد من الزمن

ما الحل؟ لنقل زيادة عدد الترانزستورات… للأسف الأمر ليس بهذه البساطة، لأنه كلما صغر المقياس (تصغير حجم الشريحة والترانزستورات) كلما زادت فرصة حدوث “ظواهر كمومية” منها تشكل النفق الكمي، وأيضًا ناهيك عن أن الكلفة تزيد إن أردت إضافة المزيد من الترانزستورات!

إذًا ماذا فعل المصنعون لحل هذه المشاكل؟

  • إضافة أنوية جديدة للمعالجات، والآن لدينا معالجات رباعية النواة quad-core وثمانية النواة octa-core.
  • وقدموا لنا أيضًا مفهوم الـ hyper-threading.
  • وتمت إضافة المزيد من ذاكرة Cache من أجل تحسين الأداء.

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

لكن جاءت Go لتنقذ الموقف

معظم لغات البرمجة الموجودة حاليًا مثل جافا وبايثون هي من مواليد التسعينات عندما كانت المعالجات أحادية المسالك single threaded، معظمها الآن تدعم تعدد الخيوط أو المسالك multi-threading لكن المشكلة الحقيقية تكمن في تزامن التنفيذ، الترابط والأولويات. هذه المشاكل هي ما يجعل من الصعب صنع تطبيق متعدد الخيوط بهذه اللغات.

هنا يأتي دور Go التي وُلدت عندما كانت المعالجات متعددة الأنوية متوفرة مسبقًا، أي أنها بُنيت مع أخذ التزامن بعين الاعتبار، ولديها ما يسمى بـ goroutines بدلًا من المسالك threads، التي تشغل فقط 2KB من الذاكرة المؤقتة بحيث يمكنك تشغيل الملايين من goroutines في وقت معين.

goroutines

تمتلك goroutines مقاطع مكدس قابلة للنمو، أي أنها تستهلك الذاكرة عند الحاجة فقط. بالإضافة لذلك، فزمن البدء الخاص بها أسرع من الخيوط.

مع Go ستحصل على أفضل مافي العالمين، لن تجد مشكلة في التعامل مع التزامن، وستكون الأكواد فعالة وجميلة أيضًا!!

go vs other languages

عند العمل مع لغات برمجة مثل جافا وبايثون، فما يحصل هو أنك تكتب الكود المفهوم بالنسبة لك، وعند الترجمة يتحول إلى byte-code تفهمه الآلة virtual machines ومن ثم يفسَّر إلى الشكل الثنائي ليفهمه المعالج.

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

لغة Go تشابه اللغات ذات المستوى الأخفض مثل C و++C فهي لغة “مترجمة Compiled”، أي أنها تضاهيها في الأداء، كما تستخدم ما يسمى بـ garbage collection من أجل تحديد وإزالة الأغراض غير المستخدمة من الذاكرة، وداعًا لعبارات ()free و ()malloc!!

أكواد Go الجميلة!

go

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

وبالتالي قام المطورون بترك الكثير من خواص اللغات الأخرى:

  • لا مزيد من الأصناف Classes! كل شيء في Go مقسم إلى حزم packages فقط، وتحوي على سجلات structs بدلًا من الأصناف Classes.
  • كما أن Go لا تدعم الوراثة، وهذا ما يجعل من السهل التعديل على الأكواد. فإن كان لديك الصنف A الذي ورث الصنف B فإن أي تعديل في B سيؤثر على الصنف A، وهذا ما يخلق المشاكل لدى المطور ويجعل من عملية التعديل معقدة للغاية.
  • لا توابع بانية constructors
  • لا حواشي annotations
  • وحمدًا لله، لا استثناءات exceptions!

ما زال بإمكانك تكويد كل ما ترغب به حتى من دون الميزات السابقة، كل ما عليك فعله هو كتابة سطري كود أو ثلاثة إضافية، إلا أنها تكون أكثر أناقة من اللغات الأخرى.

go

يوضح المخطط أعلاه أن Go فعالة مثل C و++C، وفي نفس الوقت، السياق الخاص بها بسيط مثل Ruby، فكل من المطور والمعالج رابح هنا.

أفضل توزيعات نظام لينكس المناسبة لوحوش البرمجة وعمالقة التكويد


في الختام، بإمكاننا اعتبار Go بسيطة نوعًا ما، وهذا قد ينفر بعض وحوش التكويد، لكنها ما زالت بنفس قوة اللغات الأخرى المذكورة سابقًا؛ ستضمن لك فعالية الكود مثل C و++C والقدرة العالية على التعامل مع التزامن مثل جافا وبايثون. وفي النهاية Go تحقق كل المرجو منها والهدف الذي خُلقت لأجله، فلمَ لا تضيف مهارة لغة أخرى لسيرتك الذاتية؟!

2

شاركنا رأيك حول "أكواد أنيقة وقوية … لمَ يجب أن تكون GoLang لغة البرمجة التالية لتتعلمها؟"