سؤال

لقد رأيت بعض المقارنات بين smalltalk و ruby. من ناحية و روبي وبير من ناحية أخرى، ولكن ليس بين بيثون و smalltalk. وبعد أود بشكل خاص معرفة ما هي الاختلافات الأساسية في التنفيذ، بناء الجملة، والفلسفة.

على سبيل المثال، لا يبدو أن بيثون لديه metaclasses. SmallTalk لا يوجد لديه مفهوم للمولدات. وعلى الرغم من أن كلاهما يقال إنه مكتوب ديناميا، أعتقد أن بيثون لا يقوم بإرسال طريقة ديناميكية. هل هذا صحيح؟

هل كانت مفيدة؟

المحلول

على سبيل المثال، لا يبدو أن بيثون لديه metaclasses.

من المؤكد أن - لا يؤدي فقط إلى توليد metaclass جديدا لكل فصل: يستخدم نفس metaclass مثل فئة الوالد أو type بشكل افتراضي. فلسفة تصميم بيثون، ويعرف أيضا باسم "زن بايثون"، يمكن أن تطرد عن طريق القيام به import this في موجه مترجم تفاعلي؛ النقطة المعمول بها هنا هي الثانية، "صريح أفضل من الضمنية".

في Python 2.x، يمكنك تحديد metaclass مخصص مع بناء الجملة التالي:

class sic:
  __metaclass__ = mymeta
  ...

في Python 3.x، أكثر أناقة، يمكنك استخدام بناء جملة الحجة المسماة:

class sify(metaclass=mymeta):
  ...

SmallTalk لا يوجد لديه مفهوم للمولدات.

مولدات Python's هي وظائف من الدرجة الأولى (عادة ما تكون مستقلة)، ولا يوجد لدى SmallTalk مفهوم الوظائف "المستقلة" - ولها أساليب داخل الفصول. لكنه بالتأكيد لديه محامون - كصفات، بالطبع:

iterator := aCollection iterator.
[iterator hasNext] whileTrue: [iterator next doSomething]. 

نظرا لأن SmallTalk يحتوي على "كتل التعليمات البرمجية" من الدرجة الأولى (أخذها روبي من ذلك)، فأنت تنجيك التكرار، تماما مثل "هياكل التحكم" الأخرى، عن طريق إرسال كتلة رمز إلى طريقة مناسبة، وإذا كنت ترغب في ذلك يمكنك القيام بذلك مباشرة المجموعة (التفكير select:):

aCollection select: [:item | item doSomething].

لذلك في SmallTalk (و Ruby) يمكنك إرسال كتلة التعليمات البرمجية إلى التكرار؛ يزيل Python الأشياء في الاتجاه الآخر، فإن التكرار يرسل القيم إلى رمز "الاتصال" المحيط. يبدو مختلف تماما، ولكن ليس "بعمق" مختلف في النهاية.

تعني كتل التعليمات البرمجية من الدرجة الأولى أن SmallTalk لا يحتاج إلى "بنية التحكم" والبيانات والكلمات الرئيسية مثل if أو while: يمكن تحقيقها عن طريق إرسال كتل التعليمات البرمجية كوسائط للطرق المناسبة (على سبيل المثال ifTrue: طريقة المنطمنون). (روبي يختار أن يكون لديك الكلمات الرئيسية / البيانات بالإضافة الى إلى كتل التعليمات البرمجية من الدرجة الأولى؛ أود أن أقول أن بيثون [[صراحة]] و Smalltalk [[ضمنيا]] حاول كلاهما، مثل C، "طريقة واحدة لإجراء عملية"، في حين أن روبي أكثر في مدرسة بيرل ISH من "هناك العديد من الطرق للقيام بذلك").

وعلى الرغم من أن كلاهما يقال إنه مكتوب ديناميا، أعتقد أن بيثون لا يقوم بإرسال طريقة ديناميكية. هل هذا صحيح؟

لا، غير صحيح تماما - بيثون بشكل مكثف هل إرسال الطريقة الديناميكية، إلى التطرف. وبعد النظر في مثال:

for i in range(10):
  myobject.bah()

من قبل Python Semantics، هذا ينفذ 10 بحث لطريقة bah في myobject - فقط في حالة الإعدام السابق للطريقة قد تسبب myobject لإعادة هيكلة نفسها بالكامل داخليا حتى حاضر bah الطريقة مختلفة تماما عن السابق واحد (قد يكون شيئا مجنونا رائعا للمبرمجين الاعتماد على هذه الديناميكية الغاضبة، لكن بيوترون يدعمه). هذا هو السبب الذي يجعل:

themethod = myobject.bah
for i in range(10):
  themethod()

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

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

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

نصائح أخرى

python بالتأكيد لديها metaclasses.

SmallTalk لديه بعض الميزات غير العادية:

  • لديه بناء جملة بسيط إلى حد ما وحوالي 6 (!) الكلمات الرئيسية. يتم إنجاز كل شيء آخر (بما في ذلك تحديد الفصول الجديدة) عن طريق طرق الاتصال (إرسال الرسائل في SmallTalk). هذا يسمح لك بإنشاء بعض DSL داخل اللغة.
  • في Smalltalk، لا تخزن الملفات المصدر، ولكن بدلا من ذلك تحتوي على صورة ذاكرة كبيرة واحدة وتعديلها على الطاير. يمكنك أيضا تعديل معظم smalltalk نفسها (وربما كسرها؛)

كنت أطالع المبرمجون في العمل وهو كتاب لطيف حقا مليء بالمقابلات مع كبار المبرمجين. على أي حال، أحدهم هو مخترع Smalltalk وتحدث في طوله على لغته وكيف يتعلق الأمر بثثون (يحب الثعبان قليلا جدا). المشكلة الوحيدة التي كان لديه بها مع بيثون هي رمز بطيء ... لقد أراد حقا الحصول على مترجم Jit Jit Compilير كخلفية لبثون، ولكن للأسف بسبب البرنامج الذي ينتمي إلى الشركة، لم يكن ذلك ممكنا.

Anyhow ... ربما ليس نقطة بمقارنة النقطة، ولكن حقا قراءة جيدة على أي حال هذا الكتاب.

SmallTalk لا يوجد لديه مفهوم للمولدات.

صحيح، ولكن يمكن تنفيذها في معظم اللهجات الصغيرة من داخل اللغة. GNU Smalltalk يأتي مع مولدات كجزء من مكتبة دفق.

وفق ويكيبيدياالصفحة في طريقة الإرسال طريقة ديناميكية:

تنفيذ Smalltalk.

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

العديد من اللغات المكتوبة بشكل حيوي، بما في ذلك بيثون, ، روبي، الهدف - C والأختاف استخدام مناهج مماثلة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top