باسكال يلعب العودة. تنفيذ الأساليب والواجهات في مترجم الهواة

إذا تمكنت من تصدير ميزة واحدة من Go إلى لغات أخرى ، فسيكون ذلك واجهات. - روس كوكس



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

ومع ذلك ، ظلت غابة البرمجة وجوه المنحى تماما. فلماذا لا تكون بمثابة أرض اختبار للمجمع لتجربة في هذا المجال؟ ولماذا لا نستمد الإلهام من كلام روس كوكس ، المصنوع في النقش؟ دعنا نحاول تنفيذ أساليب واجهات Go-style في Pascal. الفكرة مثيرة للاهتمام إذا فقط لأن جميع المترجمين Pascal المشهورين في الماضي (Delphi، Free Pascal) استعاروا أساسًا طراز الكائن من C ++. من المثير للاهتمام أن نرى كيف أن نهجًا مختلفًا تمامًا ، تم تبنيه من Go ، يأخذ الجذر على نفس الأرضية. إذا كنت على استعداد لمتابعتي بقدر كبير من المفارقة ، لإسقاط السؤال "لماذا؟" واتخاذ ما يحدث كلعبة ، مرحبًا بك في cat.

مبادئ


من خلال "Go style" ، سوف نفهم العديد من المبادئ التي على أساسها سنطبق الطرق والواجهات في Pascal:

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

تطبيق


لإعلان الطرق والواجهات ، يتم استخدام الكلمات الأساسية القياسية لـ Pascal والواجهة في الدور الجديد. لم يتم إدخال كلمات رئيسية جديدة. تشير الكلمة for للإشارة إلى اسم ونوع المستلم للطريقة (في مصطلحات Go). فيما يلي وصف لطريقة مثال لنوع TCat تعريفه مسبقًا مع حقل Name :

 procedure Greet for c: TCat (const HumanName: string); begin WriteLn('Meow, ' + HumanName + '! I am ' + c.Name); end; 

المتلقي هو في الواقع الوسيطة الأولى لهذه الطريقة.

الواجهة عبارة عن إدخال Pascal منتظم ، حيث يتم استبدال كلمة record بكلمة interface . في هذا السجل ، لا يُسمح بإعلان أي حقول باستثناء الحقول من النوع الإجرائي. بالإضافة إلى ذلك ، تتم إضافة حقل Self مخفي إلى بداية التسجيل. يقوم بتخزين مؤشر إلى بيانات من هذا النوع المحدد ، والتي يتم تحويلها إلى نوع واجهة. فيما يلي مثال لإعلان الواجهة:

 type IPet = interface Greet: procedure (const HumanName: string); end; 

عند تحويل نوع معين إلى واجهة ، يقوم المحول البرمجي بالتحقق من وجود جميع الطرق التي تتطلبها الواجهة ومطابقة توقيعاتهم. ثم يقوم بتعيين مؤشر Self ، ويملأ جميع الحقول الإجرائية للواجهة مع مؤشرات لأساليب من نوع معين.

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

مثال


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

قد يبدو هذا مشهدًا تم إنشاؤه بالطريقة الموضحة:



تأخذ شفرة المصدر الكاملة للبرنامج ، بما في ذلك وصف المشهد ، 367 سطرًا.

النتائج


تبين أن أبسط تطبيق للتعدد في مترجم Pascal الخاص كان سهلاً ، حيث حقق بسرعة الثمار الأولى. يمكن توقع بعض المضاعفات في مشكلة تحديد نوع بيانات معين ديناميكيًا ، والذي تم تحويله إلى نوع واجهة. ستتطلب الجهود أيضًا إزالة التعارضات غير الواضحة مع آليات التحقق من النوع القياسي في Pascal القياسية. أخيرًا ، إلى جانب كل المخاوف المتعلقة بالواجهات ، يستمر الصراع غير المتكافئ مع Microsoft حول الإنذارات الخاطئة الخاصة بـ Windows Defender عند إطلاق بعض الأمثلة المترجمة.

Source: https://habr.com/ru/post/ar478630/


All Articles