لماذا Go هي لغة قوية للتعلم كمطور PHP

لقد بدأت البرمجة باستخدام PHP بشكل احترافي منذ 10 سنوات حتى الآن بعد شهادتي في هندسة الكمبيوتر ، كل ما كنت أعرفه هو أن Java لم تعد قطعة الكعكة الخاصة بي (بعد أكثر من 6 سنوات من استخدامها في المشاريع الشخصية والأكاديمية) ، كنت أرغب في الحصول علىكثيرمكدس أبسط واكتشفت أن طريقة سريعة لتسويق نفسي كمطور مستقل كانت الدخول في سوق PHP CMS المتزايد.

على مر السنين تغيرت PHPكثيراوبينما يحب الكثير من الناس تقريعها أو انتقادها ، فإن الكثيرين يفعلون ذلك بناءً على خبرة قديمة جدًا وقليلة جدًا. إن PHP الحديثة ، خاصة إذا كان لديك ترف في استخدام أنواع PHP 7 وترك ما وراء PHP 5.x ، من الجيد جدًا التعامل معها ، وبالطبع تتمتع PHP بميزة كونها ، لسبب ما ، اللغة التي يمكنك نشرها تقريبًا في كل مكان ، وهذا هو سبب بناء العديد من أنظمة إدارة المحتوى في PHP ، ولماذا تكون ناجحة جدًالانتعتمد على PHP (جرافمتضمن).

بالطبع PHP هي مجرد أداة واحدة ، وقد كنت أخوض مؤخرًا في Go head أولاً.

بالمقارنة مع PHP ، فإن Go هي لغة وبيئة مختلفة تمامًا.

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

أول الأشياء أولاً: ما هو Go؟

Go هي لغة برمجة ضرورية وموجهة للكائنات تم تصميمها في Google منذ 10 سنوات.

أدت المعرفة المشتركة للأعضاء المؤسسين والفلسفة الأصلية في إنشاء أفضل لغة لاحتياجاتهم إلى Go.

Go هي لغة مترجمة ، مكتوبة بشكل ثابت ، مع جمع البيانات المهملة وميزات البرمجة المتزامنة المدمجة.

لا شيء جديد

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

The task of the programming language designer is consolidation not innovation – Hoare, 1973

تتمتع Go بالعديد من الميزات الفريدة ، بالطبع ، إنها ليست مجرد لغة مزج. اذهب قدمgoroutines، وهي طريقة رائعة للتعامل مع التزامن. اذهب قدمتأجيل، طريقة رائعة لتنفيذ شيء ما عند عودة الوظيفة الخارجية (تمت إضافتها الآن إلى Swift أيضًا).

كانت Go هي اللغة الأولى التي أدخلت المنسق في الأدوات القياسية. والقدرة على التجميع لمنصات أخرى بدون احتكاك ، بالإضافة إلى العديد من الأشياء "الجديدة".

Go له جذور قوية. يوضح عرض تقديمي جميل في GopherCon 2015 بواسطة Robert Griesemer: Go يدمج العديد من مبادئ كليهماجو Oberon-2 ، وهي لغة من عائلة باسكال. كلتا اللغتين نشأتا من Algol 60 ، الذي تم تقديمه في عام 1960.

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

لقد بدأت Go للتو ، وهو تفكير مثير للغاية حول مستقبلها وما يمكن للناس البناء به!

Go مكمل لـ PHP

إذا سبق لك استخدام Ruby أو Python بالإضافة إلى PHP ، فربما تكون قد أدركت أنها تتلخص إلى حد ما في إصدار مختلف من PHP ، إذا قمت بإزالة المعجبين والتفضيلات الشخصية من المعادلة ، حيث يتم تفسير جميع اللغات المكتوبة بشكل فضفاض.

يمكن للمرء التبديل إلى Ruby إلى PHP و Python والقيام بنفس الأشياء. "لغة الويب" الوحيدة التي تختلف اختلافًا كبيرًا هيJavaScript، والتي تختلف بسبب نموذج عدم الحظر (ولكن تم ترحيلها إلى لغات أخرى ، بما في ذلك PHP وكذلك من خلال المكتبات) ولأنها اللغة الوحيدة التي تعمل حاليًا في المتصفح ، مما يمنحها ميزة هائلة. أيضًا ، إنه نظام بيئي أكثر وحشية من بيئات التنفيذ غير المنضبط ، وكلها مختلفة بطرق ربما تكون خفية.

الذهاب من ناحية أخرى هو وحش مختلف تماما. إنها لغة نظام ، مثل C. وعلى عكس اللغات الديناميكية ، فإن Go سريع.

تم بناء PHP في لغة C ، ويمكنك كتابة PHP وتشغيلهجملحقات ، لذلك لا ينبغي أن يكون مفهوم لغة النظامالذي - التيغريب عليك.

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

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

لقد اعتمدت علىNode.jsلبضع سنوات لحل هذه المشكلة ، ولكن كما عرفت Go ، حتى الآن أي شيء توصلت إليه مع Go هو حل أبسط وأفضل بكثير.

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

لذلك ، بصفتك مطور PHP ، يمكنك البدء في تسليم المهام الصعبة إلى Go ، في حين أن المهارة فيها ستثري بالتأكيد اختياراتك المهنية.

لماذا Go وليس C ++ أو Java؟

أي لغة لها مكانها. من المؤكد أن Go لا يمكنه التغلب على عروض C و C ++. هناك العديد من المعايير التي يمكنك أن تجدها.

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

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

بالمقارنة مع Java ، إنه وضع مختلف تمامًا. تتطلب Java الكثير من النفقات العامة من حيث البيئة ، بينما برامج Go عبارة عن ملف واحد وخفيف ومحمول وأصلية.

وربما نقارن التفاح بالبرتقال ، فلن تستخدم Go حيث تستخدم Java ، والعكس صحيح.

الذهاب بسيط في القلب

(وتذكر: البساطة لا تعني السهولة) كان من الواضح أن تجنب زحف الميزات أحد أهداف مصممي Go. قال الأسطوري كين طومسون ، أحد المصممين الثلاثة الأصليين لـ Go ، وهو أيضًا مبتكر UNIX واللغة B (من بين أشياء أخرى كثيرة) ،

عندما بدأنا نحن الثلاثة (طومسون ، روب بايك ، وروبرت جريسيمر) ، كان بحثًا بحتًا. اجتمع ثلاثة منا وقررنا أننا نكره C ++ (ضحك) ...

نتج عن ذلك لغة بسيطة بشكل مثير للدهشة لأي مطور متمرس يقوم بالترميز بأي لغة.

تعد Java و C ++ و C و C # و Erlang و JavaScript و Swift ، وجميع لغات البرمجة الحديثة تقريبًا أكثر تعقيدًا من Go.

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

فقط فكر في أن PHP بها 67 كلمة رئيسية ، بينما Go بها 25.

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

هذا هو جوهر فلسفة Go ، ويشرح سبب اختيار Go لتجنب تنفيذ الميزات (تجنب زحف الميزات) ، ولماذا يتم استبعاد العديد من مفاهيم البرمجة الوظيفية ، نظرًا لأنها معقدة من حيث التفكير ، فتح المناقشات. تعد البرمجة الوظيفية البحتة بعيدة جدًا عن مفاهيم الآلة بحيث لا تكون ذات صلة بـ Go ، وهي لغة ضرورية في القلب.

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

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

عند الحديث عن الأشياء المفقودة ، لا توجد استثناءات للتعامل مع الأخطاء. لا توجد فئات (على الرغم من أنها موجهة للكائنات ، مع هياكل ذات طرق مرتبطة ، فرضتكوين على الميراث- إذا كان لديك معرفة بتنفيذ كائن النموذج الأولي لـ JavaScript ، فسيكون هذا مألوفًا ، ولكنه مختلف تمامًا) ، ولا توجد أدوية عامة (على الرغم من عدم توفرها في PHP أيضًا) ، وهذا هو السبب.

الاقل هو الاكثر، أو حتى أفضل!)أقل أضعافا مضاعفة أكثر.

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

هناك طريقة واحدة فقط لكتابة حلقة:for. ننسىwhileوdo — whileوforeach(شيء أكثر؟).

[...] ما يجعل Go ناجحًا هو ما تم استبعاده من اللغة ، تمامًا مثل ما تم تضمينه.

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

البساطة موروثة عن طريق الأدوات.يقوم gofix تلقائيًا بإصلاح تغييرات API المعطلة في إصدارات Go الجديدة.

و Go بسيط من حيث التصميم ، وسيظل دائمًا بسيطًا.

كما يقول روب بايك، تقوم العديد من اللغات الأخرى بنسخ الميزات من بعضها البعض ، مما يفقد جوانبها الفريدة (فكر في تقديم JavaScript لتكوين الفئات لإرضاء مطوري Java و PHP) وكلها تتقارب بشكل مثالي مع لغة فريدة من الناحية المفاهيمية.

Go لا تتنافس في الميزات. وهذا يذكرنيهذا الحصول على المادة الحقيقية.

احذر: Go هو استقطاب

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

بغض النظر عن المقايضات التي تقوم بها ، ستكون هناك انتقادات دائمًا ، لأنه لا توجد لغة برمجة يمكن أن تكون مثالية

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

غو عنيد جدا وله اتفاقيات واضحة

من أول الأشياء التي ستلاحظها في Go هو أن معظم الأكواد التي يمكنك العثور عليها تبدو متشابهة تقريبًا.

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

هذا يختلف عن JSESLint/ JSHint ، لأن هذه الأدوات هي تطبيق على مستوى الفريق. كما هو الحال في كل شيء JS ، يمكنك تخصيص أي شيء في التفضيلات.gofmtهو واحد ، لا تكوين ، هذا هو الأسلوب الذي يجب أن يتم تنفيذه.

يعد هذا أمرًا رائعًا لتوفير التناسق في التعليمات البرمجية الخاصة بك (قد يكون الرمز الذي كتبته منذ 5 سنوات في PHP أو JavaScriptللغايةتختلف عن الاصطلاحات والتفضيلات الحالية الخاصة بك) وعلى الكودكل واحدتوزع.

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

يؤدي Go إلى حدوث خطأ في التحويل البرمجي إذا لم يتم استخدام متغير أو استيراد ، مما يمنع برامجك من تجميع القمامة بمرور الوقت.

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

تخدم التعليقات احتياجًا خاصًا ، ويمكنك كتابتها بصيغة خاصة بحيث يمكن فحص الحزمة الخاصة بك باستخدامgo docولديك جميع الوثائق التي تحتاجها دون البحث عنها على Google.

go getتحت تصرفك ، مدمج (وهو أمر رائع للمصدر المفتوح والتوزيع). على الرغم من أن PHPland أكثر تقدمًا في رأيي من حيث إدارة التبعيات.

PHPUnit / Codeception؟ لا حاجة،go testموجود بالفعل من أجل الخاص بك*_test.goالملفات.

يجعلك مبرمجا أفضل

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

لتبدأ ، يتم تجميع Go بدلاً من تفسيرها. سير العمل والنشر مختلفان تمامًا.

إذا لم تكن لديك خبرة في الكتابة القوية ، فهذا تغيير في النموذج. يأتي PHP 7 مصحوبًا بفحص الكتابة ، وهو مفيد جدًا إذا لم يكن عليك دعم إصدارات PHP القديمة. يتم كتابة Go بشدة. يتم حل العديد من مشكلات الأنواع إن لم يكن جميعها في وقت الترجمة.

Go بسيط بشكل مثير للدهشة ، مصمم ليكون بسيطًا ، وكونك مطور Go يعني التعرف على هذه البساطة والاستفادة منها ، وعدم محاولة كتابة Java مثل Go ، ولكن احتضانها.

وببساطة ، لا أعني أن Go هي لغة ألعاب ، فهي بالتأكيد ليست لغة ، وليست لغة قد أقدمها لشخص ما على البرمجة.

بالبساطة أعني أكثرشيوعولا زغب.

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

يمكنك تشغيل كود Go من PHP

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

هناكنكون عديدة طرقللاتصال مباشرة ببرامج Go من PHP ، ولكن يمكنك أيضًا اختيار تنفيذ ملفقائمة انتظار الخدمة من خلال ZeroMQ، أو الوصول إلى برنامج go طويل العمر من خلال كشف نقطة نهاية API من خلال وكيل عكسي. لديك العديد من الخيارات.

سلاح Go الخاص: التزامن

من المعروف أن PHP-FPM تتعامل مع الطلبات المتزامنة بشكل جيد للغاية ، مما ينتج عنه عملية جديدة تنفذ كود PHP الفعلي لكل مستخدم. وعادة ما تكون قاعدة البيانات هي العقبة في تطبيق الويب. ولكن ماذا عن العمليات طويلة الأمد (شيء لا ترغب حقًا في بنائه في PHP) ، أو عندما تحتاج إلى بدء حلقة حسابية ثقيلة ضمن طلب PHP ، حيث تحتاج إلى تشغيل عشرات الآلاف من العمليات المتزامنة؟

تحتوي PHP على دعم للخيوط ، لذلك يمكنها إجراء معالجة متزامنة ، ولكن بينما يمكن لـ PHP (أو حتى C وغيرها) القيام بالتزامن باستخدام مساعدة المكتبات الخارجية للغة ، فإن Go هومصمممع البرمجة المتزامنة المضمنة ، ويوفر طرقًا أصلية للتواصل بين goroutines.

الخيوط ثقيلة بالمقارنة معgoroutines. يمكن للنظام أن يدعم 10 آلاف خيوط ، ويمكن للنظام نفسه أن يدعم الملايين من goroutines ، لأن التنفيذ الداخلي لاستهلاك ذاكرة goroutines أخف بكثير ، كما هو الحال في Java أو Erlang.

لذلك حتى لو لم تكن بحاجة إلى ملايين الطلبات المتزامنة ، فإن مكاسب الأداء واضحة.

بالإضافة إلى ذلك ، من السهل جدًا استيعاب goroutines وفهم ما يفعله الكود من نظرة سريعة.

لا حاجة لتوسيع الفئات أو تضمين امتدادات خاصة ، والتي قد لا تكون متاحة دائمًا (هذا يحد بشكل فعال من المدى الذي يمكننا فيه استخدام PHP المتزامن للتعليمات البرمجية الموزعة المثبتة ذاتيًا)

فقط اكتبgo someFunction()وسيتم تنفيذ هذه الوظيفة في goroutine.

استنتاج

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

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


المزيد من دروس Go: