روبي وPython هما لغتا برمجة رائعتان من حيث التفسير والكتابة الديناميكية. ويمكنك أن تقرأ عن تطبيقاتهما وشعبيتهما ومجتمعهما في أحد المداخل على هذه المدونة. هناك العديد من الأشياء المشتركة بين هاتين اللغتين، ولكن هناك أيضًا العديد من الاختلافات. في هذا المقال، سوف أعرض بعضًا منها.
أوجه التشابه
وبما أن هذه اللغات يمكن إدراجها في نفس فئة اللغات المفسرة المكتوبة ديناميكيًا، فلا شك أنها متشابهة.
الكتابة الديناميكية
كلاهما Python وروبي هي لغات مكتوبة ديناميكيًا. ونتيجةً لذلك، لا يتوجب على المبرمج تحديد نوع المتغيرات أثناء كتابة الكود. يتم تحديد نوعه أثناء تشغيل البرنامج وقد يتغير. يُشتق نوع المتغير من القيمة المخزنة فيه. ستعمل الشيفرة التالية بشكل صحيح في هذه اللغات:
متغير = 1
متغير += 2.5
متغير = 'سلسلة عينة'
متغير = [2، 3.5، 'سلسلة عينة']
بناء الجملة النقي
هذا مرتبط بالنقطة أعلاه، في جملة أمور أخرى. نظرًا لعدم وجود حاجة للإعلان عن الأنواع، وإنهاء العبارات بفاصلة منقوطة، وأيضًا لكونها لغات برمجة نصية، فإن كتابتها وقراءتها سهلة. ستكون الشيفرة المكتوبة بشكل جيد قابلة للقراءة حتى من قبل الأشخاص الذين لم يكن لديهم أي اتصال سابق بهذه اللغات.
لديهم مترجمين تفاعليين لوحدة التحكم التفاعلية
عندما تريد إجراء عملية بسيطة أو اختبار جزء من التعليمات البرمجية، لا تحتاج إلى إنشاء ملف وتشغيل التعليمات البرمجية باستخدام أمر خاص. يحتوي كل من Ruby وPython على مترجمين تفاعليين لوحدة التحكم (REPL). بالنسبة ل Python، يمكننا تشغيل مثل هذا المترجم باستخدام الأمر بايثون
(أوبايثون3
)، بينما بالنسبة لروبي يمكن أن يكون، على سبيل المثال, irb:
$ irb
2.5.8 :001 > النتيجة = 2 + 1
=> 3
2.5.8 :002 > النتيجة += 3.5
=> 6.5
الاختلافات
بما أن هذه مختلفة لغات البرمجة، بالطبع يجب أن يكون بينهما اختلافات (أعلم، يا له من بيان كاشف). في حالة Python وروبي، فإن هذه الاختلافات عديدة. سأصف بعضًا من أهمها في رأيي.
المسافات البادئة
المسافة البادئة مهمة جدًا في Python. يتم تعريف جميع كتل التعليمات البرمجية بمسافة بادئة. من المهم أن يكون لكل سطر في كتلة معينة نفس المسافة البادئة. خلاف ذلك، عندما نحاول تشغيل الشيفرة، سنحصل على IndentationError. يتبع روبي نهجًا مختلفًا. هنا، تكون الكتلة البرمجية محدودة بالكلمات الرئيسية. نميّز كلمة البداية (على سبيل المثالبداية، إذا، إذا، فئة، تعريف
) وكلمة النهاية النهاية.
لا يهم كيف يتم وضع مسافة بادئة للرمز داخل الكتلة البرمجية.
الوراثة
إحدى السمات الأساسية للبرمجة الموجهة للكائنات. في الأيدي الصحيحة، يمكنها أن تصنع المعجزات. يدعم Python الوراثة متعددة القواعد:
<مثال.py
صنف ClassA:
تعريف callA(ذاتي):
طباعة('callA')
الصنف ClassB:
ديف callB(ذاتي):
طباعة('callB')
الصنف ClassAB(الصنفA، الصنفB):
تمرير
Class_inst = ClassAB()
class_inst.callA()
class_inst.callB()
ونتيجة لذلك، نحصل على:
$ python3 example.py
استدعاء أ
استدعاء ب
يدعم روبي الوراثة أحادية القاعدة فقط باستخدام عامل التوريث < افتراضيًا. ومع ذلك، من الممكن محاكاة الوراثة متعددة القواعد باستخدام الوحدات النمطية:
مثال.rb
صنف ClassA
تعريف كالا
يضع 'كالا'
نهاية
النهاية
الوحدة النمطية ModuleB
تعريف callb
يضع 'callb'
النهاية
النهاية
الفئة ClassAB <الفئةA
تضمين الوحدة النمطية ب
نهاية
classinst = ClassAB.new
classinst.calla
classinst.call_b
ما الذي يعطينا
$ روبي example.rb مثال روبي
استدعاء_أ
استدعاء_ب
تشمل
هي مجرد واحدة من الخلطات المتوفرة في روبي. المزيجات هي طريقة لإضافة وظائف إضافية للفئات. هناك ثلاث ميكسينات في روبي.
تضمين
عندما نتصل ب تشمل
في تعريف الصنف، تصبح الوحدة النمطية المضمنة السلف المباشر لهذا الصنف. هذا يعني أن كل طريقة من الوحدة النمطية تصبح طريقة مثيل لهذه الفئة. يُمكننا تجاوزها في الصنف واستدعاء الطريقة الأصلية (المُعرّفة في الوحدة النمطية) باستخدام سوبر
الكلمة الرئيسية.
مثال.rb
الوحدة النمطية ModuleA
تعريف طباعة_شيء ما
يضع 'رسالة من الوحدة النمطية'
النهاية
النهاية
الفئة ب
تضمين الوحدة النمطية أ
ديف print_something
يضع 'رسالة من الفصل'
سوبر
النهاية
النهاية
ClassB.new.print_something.new.print_something
النتيجة:
$ ruby example.rb
رسالة من الفصل
رسالة من الوحدة النمطية
الإضافة
إنه يعمل تقريبًا مثل تشمل
ولكن الوحدة النمطية المضافة مسبقًا تصبح سليلًا مباشرًا للفصل. هذا يعني أنه لا يمكننا تجاوز طريقة الوحدات النمطية في الصف، ولكن يمكن للطريقة في الوحدة النمطية استدعاء طريقة الصف باستخدامسوبر
الكلمة الرئيسية.
مثال.rb
الوحدة النمطية ModuleA
تعريف طباعة_شيء ما
يضع 'رسالة من الوحدة النمطية'
سوبر
نهاية
النهاية
الفئة ب
إضافة الوحدة النمطية أ
تعريف طباعة_شيء ما
يضع 'رسالة من الفصل'
النهاية
النهاية
ClassB.new.print_something.new.print_something
النتيجة:
$ ruby example.rb
رسالة من الوحدة النمطية
رسالة من الفصل
تمديد
وهو يعمل بشكل مشابه للتضمين باستثناء أن الطرق المحددة في الوحدة النمطية تصبح طرقًا للفصل في الفصل.
النتيجة:
$ مثال روبي.rb رسالة من الوحدة
الوظائف والكتل
يحتوي Python على دوال. يدعم روبي الدوال فقط. ماذا يستلزم ذلك؟ من بين أمور أخرى، يمكن لـ Python الاحتفاظ بدالة في متغير وتمريرها كوسيطة إلى دالة أخرى. في روبي، لا يمكننا فعل ذلك بسهولة. يرتبط هذا أيضًا بالقوسين. إذا أُعطيت دالة بدون وسيطة في Python، أو بحجج افتراضية، إذا استخدمت اسمها بدون أقواس، ستُعاد الدالة. فقط إضافة القوسين يؤدي إلى تنفيذها. في روبي، يمكننا استدعاء الدوال دون أقواس:
مثال.py
تعريف الدالة الداخلية():
طباعة('الدالة الداخلية')
def wrapper_function(دالة):
طباعة('الدالة الملتفة')
# الدالة هي متغير يحتوي على كائن دالة
دالة() # دالة داخلية تسمى هنا
دالة الالتفاف(الدالة الداخلية)
النتيجة:
$ python3 example.py
دالة الغلاف
الدالة الداخلية
في روبي:
مثال.rb
تعريف الدالة الداخلية
يضع "الدالة الداخلية
نهاية
ديف غلاف_دالة (دالة)
يضع 'الدالة المجمِّعة'
دالة
نهاية
دالة الالتفاف (الدالة الداخلية) # يتم استدعاء الدالة الداخلية هنا
النتيجة:
$ ruby example.rb
الدالة الداخلية
دالة الغلاف
بالطبع، في هذه الحالة، يمكنك القيام ببعض الحيل في روبي لتحقيق التأثير المطلوب. أولًا، يمكننا استخدام كائن Proc:
مثال.rb
تعريف الدالة الداخلية
يضع "الدالة الداخلية
نهاية
ديف غلاف_دالة (دالة)
يضع 'الدالة المجمِّعة'
استدعاء الدالة
نهاية
فونك = Proc.new { الدالة الداخلية }
دالة التفاف(func)
النتيجة:
$ ruby example.rb
دالة الغلاف
الدالة الداخلية
الطريقة الثانية هي استخدام الكتل:
example.rb
تعريف الدالة الداخلية
يضع "الدالة الداخلية
نهاية
تعريف دالة الغلاف
يضع 'الدالة المجمعة'
العائد
نهاية
دالة الالتفاف تفعل
الدالة الداخلية
الداخلية
النتيجة:
$ ruby example.rb
دالة الغلاف
الدالة الداخلية
قائمة الاستيعاب
هذه ميزة مفيدة للغاية Python. وهي تتمثل في إنشاء قائمة بناءً على قائمة أخرى. لنفترض أن لدينا مثل هذه المهمة: بمعلومية قائمة من الأعداد، قم بإنشاء قائمة من مربعات الأعداد الفردية. في Python، نستخدم فهم القائمة:
<الأرقام = [1، 3، 4، 7، 8، 12، 15]
النتيجة = [num*num لرقم في الأرقام إذا كان الرقم % 2]
الميزة هي أن لدينا قائمتين فقط في الذاكرة.
في روبي، الأمور مختلفة قليلاً. هناك عدة طرق لحل هذه المهمة. سأقدم أكثرها قابلية للقراءة:
<رمز= [1، 3، 4، 7، 8، 12، 15]
النتيجة = []
numbers.each { | |num|| النتيجة << num * num إذا كان num.odd؟ }
كما نرى، يمكن القيام بذلك، ولكن ليس بنفس الأناقة كما هو الحال في Python.
جميع الفئات قابلة للتغيير
في روبي، جميع الأصناف قابلة للتغيير. ماذا يعني ذلك؟ يمكننا إضافة أو تجاوز طرق جميع الأصناف، حتى المدمجة منها. لنفترض أننا نريد طريقة تُغيّر كل حرف من حرف an إلى حرف b في السلسلة. يمكننا فعل ذلك بطريقة بسيطة:
مثال.rb
صنف سلسلة
ديف أتوب!
self.gsub!(/a/, 'b')
ينتهي
ينتهي
سلسلة = 'مثال على سلسلة تحتوي على العديد من الأحرف أ'
يضع السلسلة
string.atob
يضع السلسلة
النتيجة:
$ روبي example.rb مثال
مثال لسلسلة تحتوي على العديد من الأحرف أ
مثال لسلسلة تحتوي على عدة أحرف mbny b
الملخص
تطوير الويب كان مجالًا ديناميكيًا يتبنى ويشكل باستمرار مختلف لغات البرمجة لتناسب احتياجاتها. هناك خياران شائعان في هذا المجال لغة البرمجة Python وروبي. أثبت كلاهما جدارتهما في بناء تطبيقات الويب وأشكال أخرى من البرامج، ولكل منها مزاياه وعيوبه الفريدة.
Python هو لغة برمجة عالية المستوى يُحترم لبساطته و سهولة قراءة الكودوهي ميزة غالبًا ما تجذب المبرمجين المبتدئين. إن لغة البرمجة Python متعدد الاستخدامات ويمكن استخدامه في مجموعة متنوعة من المهام. هذه لغة برمجة للأغراض العامة يُستخدم غالبًا في مجالات مثل التعلم الآلي، والبيانات الضخمة، وعلى وجه الخصوص تطوير الويب. واسع النطاق مجتمع مطوري Python يساهم في نظامه البيئي الغني بالمكتبات والأطر، مما يعزز ملاءمته لـ بناء تطبيقات الويب. تعد Django وFlask وPyramid من بين العديد من Python أطر عمل الويب بالاستفادة من مطورو الويب في جميع أنحاء العالم.
من ناحية أخرى، فإن روبي، وهي لغة برمجة عالية المستوى وعامة الأغراضيتألق بمرونته وتعبيره. وهذا لغة البرمجة الموجهة للكائنات هو العمود الفقري للعديد من تطبيقات الويب. يكمن سحر روبي في قدرتها على تسهيل تطوير الويب من خلال إطار عمل القضبانأداة قوية لـ بناء تطبيقات الويب بسرعة.
روبي، على الرغم من أنه أقل شعبية من Pythonيضم فريقًا نشطًا ومتفانيًا مجتمع روبي التي تعمل باستمرار على تطوير وصيانة مجموعة متنوعة من المكتبات والأدوات، وبالتالي إثراء تجربة مطورو الويب باستخدام هذه اللغة. وباعتبار أن لغة موجهة للكائناتتتميز روبي بأناقتها والأكواد النظيفة والمقروءة التي تنتجها، مما يجعلها خيارًا مناسبًا لكل من النطاقين الصغير والكبير تطبيقات الويب.
Python وروبي، مثل لغات البرمجة الموجهة للكائناتتشترك في العديد من أوجه التشابه. كما أنها تدعم البرمجة الوظيفيةتقدم للمبرمجين أنماطًا مختلفة للبرمجة بها. كود Python، على وجه الخصوص، تقديرًا لبنيتها اللغوية المباشرة، والتي تؤكد تركيز اللغة على البساطة و سهولة القراءة.
لكل لغة نقاط قوتها; Python's Python تنوع وتعدد الاستخدامات المجتمع يجعل منه أداة ممتازة لمختلف المهام، في حين أن تعبيرية روبي و إطار عمل القضبان يجعلها منافسًا قويًا على تطبيق الويب التطوير. إنها الاحتياجات والتفضيلات الفريدة لـ مطورو الويب التي ستحدد أي اللغة أفضل ما يخدم المشروع.
في عالم أنظمة التشغيل، تُظهر كلتا اللغتين مستوى مذهلًا من قابلية النقل، مما يعزز ملاءمتها للعديد من المهام، على سبيل المثال لا الحصر تطوير الويب. لذلك، من الصعب إعلان "فائز" نهائي في هذه المبارزة.
في حين أن لغة البرمجة Python نطاق أوسع وأكبر المجتمع، لا ينبغي الاستهانة بقدرات روبي. لتقدير هذه اللغات بشكل كامل، يجب على المرء أن يتعمق فيها ويفهم تعقيداتها ويطبقها حيثما تتألق أكثر. سواء كنت إنشاء تطبيقات الويب مع Python أو روبي، كل اللغة منصة قوية لتقديم خدمات عالية الجودة تطبيقات الويب. على الرغم من أن روبي أقل شهرة، إلا أنه بالتأكيد يستحق التقدير الواجب في عالم لغات البرمجة.